@zenstackhq/server 3.1.0 → 3.2.0

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/rest/index.ts","../src/api/utils.ts","../src/api/rpc/index.ts"],"sourcesContent":["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 } else {\n // drop meta when no serialization info is present\n args = rest;\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":["clone","enumerate","lowerCaseFirst","paramCase","ORMError","ORMErrorReason","Decimal","SuperJSON","tsjapi","match","UrlPattern","z","Decimal","SuperJSON","match","fromError","fromError3","fromError4","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","lowerCaseFirst","safeJSONStringify","ORMError","ORMErrorReason","SuperJSON","match","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/rest/index.ts","../src/api/common/procedures.ts","../src/api/common/schemas.ts","../src/api/common/utils.ts","../src/api/utils.ts","../src/api/rpc/index.ts"],"sourcesContent":["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 { fromError } from 'zod-validation-error/v4';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { getProcedureDef, mapProcedureArgs } from '../common/procedures';\nimport { loggerSchema } from '../common/schemas';\nimport { processSuperJsonRequestPayload } from '../common/utils';\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 /**\n * Mapping from model names to URL segment names.\n */\n modelNameMapping?: Record<string, string>;\n\n /**\n * Mapping from model names to unique field name to be used as resource's ID.\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.validateOptions(options);\n\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 private validateOptions(options: RestApiHandlerOptions<Schema>) {\n const schema = z.strictObject({\n schema: z.object(),\n log: loggerSchema.optional(),\n endpoint: z.string().min(1),\n pageSize: z.union([z.number().int().positive(), z.literal(Infinity)]).optional(),\n idDivider: z.string().min(1).optional(),\n urlSegmentCharset: z.string().min(1).optional(),\n modelNameMapping: z.record(z.string(), z.string()).optional(),\n externalIdMapping: z.record(z.string(), z.string()).optional(),\n });\n const parseResult = schema.safeParse(options);\n if (!parseResult.success) {\n throw new Error(`Invalid options: ${fromError(parseResult.error)}`);\n }\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 if (path.startsWith('/$procs/')) {\n const proc = path.split('/')[2];\n return await this.processProcedureRequest({ client, method, proc, query, requestBody });\n }\n\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 processProcedureRequest({\n client,\n method,\n proc,\n query,\n requestBody,\n }: {\n client: ClientContract<Schema>;\n method: string;\n proc?: string;\n query?: Record<string, string | string[]>;\n requestBody?: unknown;\n }): Promise<Response> {\n if (!proc) {\n return this.makeProcBadInputErrorResponse('missing procedure name');\n }\n\n const procDef = getProcedureDef(this.schema, proc);\n if (!procDef) {\n return this.makeProcBadInputErrorResponse(`unknown procedure: ${proc}`);\n }\n\n const isMutation = !!procDef.mutation;\n if (isMutation) {\n if (method !== 'POST') {\n return this.makeProcBadInputErrorResponse('invalid request method, only POST is supported');\n }\n } else {\n if (method !== 'GET') {\n return this.makeProcBadInputErrorResponse('invalid request method, only GET is supported');\n }\n }\n\n const argsPayload = method === 'POST' ? requestBody : query;\n\n // support SuperJSON request payload format\n const { result: processedArgsPayload, error } = await processSuperJsonRequestPayload(argsPayload);\n if (error) {\n return this.makeProcBadInputErrorResponse(error);\n }\n\n let procInput: unknown;\n try {\n procInput = mapProcedureArgs(procDef, processedArgsPayload);\n } catch (err) {\n return this.makeProcBadInputErrorResponse(\n err instanceof Error ? err.message : 'invalid procedure arguments',\n );\n }\n\n try {\n log(this.log, 'debug', () => `handling \"$procs.${proc}\" request`);\n\n const clientResult = await (client as any).$procs?.[proc](procInput);\n const toSerialize = this.toPlainObject(clientResult);\n\n const { json, meta } = SuperJSON.serialize(toSerialize);\n const responseBody: any = { data: json };\n if (meta) {\n responseBody.meta = { serialization: meta };\n }\n\n return { status: 200, body: responseBody };\n } catch (err) {\n log(this.log, 'error', `error occurred when handling \"$procs.${proc}\" request`, err);\n if (err instanceof ORMError) {\n throw err; // top-level handler will take care of it\n }\n return this.makeProcGenericErrorResponse(err);\n }\n }\n\n private makeProcBadInputErrorResponse(message: string): Response {\n const resp = this.makeError('invalidPayload', message, 400);\n log(this.log, 'debug', () => `sending error response: ${JSON.stringify(resp)}`);\n return resp;\n }\n\n private makeProcGenericErrorResponse(err: unknown): Response {\n const message = err instanceof Error ? err.message : 'unknown error';\n const resp = this.makeError('unknownError', message, 500);\n log(this.log, 'debug', () => `sending error response: ${JSON.stringify(resp)}`);\n return resp;\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 { ORMError } from '@zenstackhq/orm';\nimport type { ProcedureDef, ProcedureParam, SchemaDef } from '@zenstackhq/orm/schema';\n\nexport const PROCEDURE_ROUTE_PREFIXES = '$procs' as const;\n\nexport function getProcedureDef(schema: SchemaDef, proc: string): ProcedureDef | undefined {\n const procs = schema.procedures ?? {};\n if (!Object.prototype.hasOwnProperty.call(procs, proc)) {\n return undefined;\n }\n return procs[proc];\n}\n\n/**\n * Maps and validates the incoming procedure payload for server-side routing.\n *\n * Supported payload formats:\n * - **Envelope (preferred)**: `{ args: { ... } }`\n * - **Direct object**: `{ ... }` (allowed only when *every* parameter is optional)\n *\n * The function returns the original `payload` unchanged; it only enforces payload\n * *shape* and argument presence/keys so downstream code can safely assume a\n * consistent contract.\n *\n * Validation / branching behavior (mirrors the code below):\n * - **Zero-parameter procedures** (`params.length === 0`)\n * - `undefined` payload is accepted.\n * - Object payloads without an `args` key are treated as “no args” and accepted.\n * - Envelope payloads with `args: {}` are accepted.\n * - Any other payload (including `args` with keys) is rejected.\n * - **All-optional parameter procedures**\n * - Payload may be omitted (`undefined`).\n * - If payload is an object and has no `args` key, it is treated as the direct\n * object form.\n * - **Missing payload** (required parameters exist)\n * - `undefined` is rejected.\n * - **Non-object or array payload**\n * - Rejected.\n * - **Undefined/invalid `args` (envelope form)**\n * - If `args` is missing and not all params are optional: rejected.\n * - If `args` exists but is not a non-array object: rejected.\n * - **Unknown keys**\n * - Any key in the `args` object that is not declared by the procedure is\n * rejected (prevents silently ignoring typos).\n * - **Missing required params**\n * - Any declared non-optional param missing from `args` is rejected.\n *\n * Rationale for rejecting null/falsey payloads:\n * - The checks `!payload` and `!argsPayload` intentionally reject values like\n * `null`, `false`, `0`, or `''` instead of treating them as “no args”. This\n * keeps the API strictly object-based and yields deterministic, descriptive\n * errors rather than surprising coercion.\n *\n * @throws {Error} \"procedure does not accept arguments\"\n * @throws {Error} \"missing procedure arguments\"\n * @throws {Error} \"procedure payload must be an object\"\n * @throws {Error} \"procedure `args` must be an object\"\n * @throws {Error} \"unknown procedure argument: <key>\"\n * @throws {Error} \"missing procedure argument: <name>\"\n */\nexport function mapProcedureArgs(procDef: { params: Record<string, ProcedureParam> }, payload: unknown): unknown {\n const params = Object.values(procDef.params ?? {});\n if (params.length === 0) {\n if (typeof payload === 'undefined') {\n return undefined;\n }\n if (payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const envelope = payload as Record<string, unknown>;\n const argsPayload = Object.prototype.hasOwnProperty.call(envelope, 'args')\n ? (envelope as any).args\n : undefined;\n\n if (typeof argsPayload === 'undefined') {\n return payload;\n }\n\n if (argsPayload && typeof argsPayload === 'object' && !Array.isArray(argsPayload)) {\n if (Object.keys(argsPayload as any).length === 0) {\n return payload;\n }\n }\n }\n throw new Error('procedure does not accept arguments');\n }\n\n // For procedures where every parameter is optional, allow omitting the payload entirely.\n if (typeof payload === 'undefined' && params.every((p) => p.optional)) {\n return undefined;\n }\n\n if (typeof payload === 'undefined') {\n throw new Error('missing procedure arguments');\n }\n\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n throw new Error('procedure payload must be an object');\n }\n\n const envelope = payload as Record<string, unknown>;\n const argsPayload = Object.prototype.hasOwnProperty.call(envelope, 'args') ? (envelope as any).args : undefined;\n\n if (typeof argsPayload === 'undefined') {\n if (params.every((p) => p.optional)) {\n return payload;\n }\n throw new Error('missing procedure arguments');\n }\n\n if (!argsPayload || typeof argsPayload !== 'object' || Array.isArray(argsPayload)) {\n throw new Error('procedure `args` must be an object');\n }\n\n const obj = argsPayload as Record<string, unknown>;\n\n // reject unknown keys to avoid silently ignoring user mistakes\n for (const key of Object.keys(obj)) {\n if (!params.some((p) => p.name === key)) {\n throw new Error(`unknown procedure argument: ${key}`);\n }\n }\n\n // ensure required params are present\n for (const p of params) {\n if (!Object.prototype.hasOwnProperty.call(obj, p.name)) {\n if (p.optional) {\n continue;\n }\n throw new Error(`missing procedure argument: ${p.name}`);\n }\n }\n\n return payload;\n}\n\nexport function isOrmError(err: unknown): err is ORMError {\n return err instanceof ORMError;\n}\n","import z from 'zod';\n\nexport const loggerSchema = z.union([z.enum(['debug', 'info', 'warn', 'error']).array(), z.function()]);\n","import SuperJSON from 'superjson';\n\n/**\n * Supports the SuperJSON request payload format used by api handlers\n * `{ meta: { serialization }, ...json }`.\n */\nexport async function processSuperJsonRequestPayload(payload: unknown) : Promise<{ result: unknown; error: string | undefined; }> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload) || !('meta' in (payload as any))) {\n return { result: payload, error: undefined };\n }\n\n const { meta, ...rest } = payload as any;\n if (meta?.serialization) {\n try {\n return {\n result: SuperJSON.deserialize({ json: rest, meta: meta.serialization }),\n error: undefined,\n };\n } catch (err) {\n return {\n result: undefined,\n error: `failed to deserialize request payload: ${(err as Error).message}`,\n };\n }\n }\n\n // drop meta when no serialization info is present\n return { result: rest, error: undefined };\n}\n\n/**\n * Supports the SuperJSON query format used by api handlers:\n */\nexport function 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}","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 z from 'zod';\nimport { fromError } from 'zod-validation-error/v4';\nimport type { ApiHandler, LogConfig, RequestContext, Response } from '../../types';\nimport { getProcedureDef, mapProcedureArgs, PROCEDURE_ROUTE_PREFIXES } from '../common/procedures';\nimport { loggerSchema } from '../common/schemas';\nimport { processSuperJsonRequestPayload, unmarshalQ } from '../common/utils';\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 this.validateOptions(options);\n }\n\n private validateOptions(options: RPCApiHandlerOptions<Schema>) {\n const schema = z.strictObject({ schema: z.object(), log: loggerSchema.optional() });\n const parseResult = schema.safeParse(options);\n if (!parseResult.success) {\n throw new Error(`Invalid options: ${fromError(parseResult.error)}`);\n }\n }\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 if (model === PROCEDURE_ROUTE_PREFIXES) {\n return this.handleProcedureRequest({\n client,\n method: method.toUpperCase(),\n proc: op,\n query,\n requestBody,\n });\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 case 'exists':\n if (method !== 'GET') {\n return this.makeBadInputErrorResponse('invalid request method, only GET is supported');\n }\n try {\n args = query?.['q'] ? unmarshalQ(query['q'] as string, query['meta'] as string | undefined) : {};\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'] ? unmarshalQ(query['q'] as string, query['meta'] as string | undefined) : {};\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 async handleProcedureRequest({\n client,\n method,\n proc,\n query,\n requestBody,\n }: {\n client: ClientContract<Schema>;\n method: string;\n proc?: string;\n query?: Record<string, string | string[]>;\n requestBody?: unknown;\n }): Promise<Response> {\n if (!proc) {\n return this.makeBadInputErrorResponse('missing procedure name');\n }\n\n const procDef = getProcedureDef(this.options.schema, proc);\n if (!procDef) {\n return this.makeBadInputErrorResponse(`unknown procedure: ${proc}`);\n }\n\n const isMutation = !!procDef.mutation;\n\n if (isMutation) {\n if (method !== 'POST') {\n return this.makeBadInputErrorResponse('invalid request method, only POST is supported');\n }\n } else {\n if (method !== 'GET') {\n return this.makeBadInputErrorResponse('invalid request method, only GET is supported');\n }\n }\n\n let argsPayload = method === 'POST' ? requestBody : undefined;\n if (method === 'GET') {\n try {\n argsPayload = query?.['q']\n ? unmarshalQ(query['q'] as string, query['meta'] as string | undefined)\n : undefined;\n } catch (err) {\n return this.makeBadInputErrorResponse(\n err instanceof Error ? err.message : 'invalid \"q\" query parameter',\n );\n }\n }\n\n const { result: processedArgsPayload, error } = await processSuperJsonRequestPayload(argsPayload);\n if (error) {\n return this.makeBadInputErrorResponse(error);\n }\n\n let procInput: unknown;\n try {\n procInput = mapProcedureArgs(procDef, processedArgsPayload);\n } catch (err) {\n return this.makeBadInputErrorResponse(err instanceof Error ? err.message : 'invalid procedure arguments');\n }\n\n try {\n log(this.options.log, 'debug', () => `handling \"$procs.${proc}\" request`);\n\n const clientResult = await (client as any).$procs?.[proc](procInput);\n\n const { json, meta } = SuperJSON.serialize(clientResult);\n const responseBody: any = { data: json };\n if (meta) {\n responseBody.meta = { serialization: meta };\n }\n\n const response = { status: 200, body: responseBody };\n log(\n this.options.log,\n 'debug',\n () => `sending response for \"$procs.${proc}\" request: ${safeJSONStringify(response)}`,\n );\n return response;\n } catch (err) {\n log(this.options.log, 'error', `error occurred when handling \"$procs.${proc}\" request`, err);\n if (err instanceof ORMError) {\n return this.makeORMErrorResponse(err);\n }\n return this.makeGenericErrorResponse(err);\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.model = err.model;\n error.rejectReason = err.rejectedByPolicyReason;\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 } else {\n // drop meta when no serialization info is present\n args = rest;\n }\n return { result: args, error: undefined };\n }\n}\n"],"mappings":"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","names":["clone","enumerate","lowerCaseFirst","paramCase","ORMError","ORMErrorReason","Decimal","SuperJSON","tsjapi","match","UrlPattern","z","fromError","ORMError","PROCEDURE_ROUTE_PREFIXES","getProcedureDef","schema","proc","procs","procedures","Object","prototype","hasOwnProperty","call","undefined","mapProcedureArgs","procDef","payload","params","values","length","Array","isArray","envelope","argsPayload","args","keys","Error","every","p","optional","obj","key","some","name","z","loggerSchema","union","enum","array","function","SuperJSON","processSuperJsonRequestPayload","payload","Array","isArray","result","error","undefined","meta","rest","serialization","SuperJSON","deserialize","json","err","message","unmarshalQ","value","parsedValue","JSON","parse","Error","parsedMeta","Decimal","SuperJSON","match","fromError","fromError3","fromError4","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","validateOptions","segmentCharset","urlSegmentCharset","Object","fromEntries","entries","map","k","v","lowerCaseFirst","buildUrlPatternMap","buildTypeMap","buildSerializers","schema","strictObject","log","loggerSchema","endpoint","pageSize","int","positive","Infinity","parseResult","safeParse","success","fromError","error","urlSegmentNameCharset","segmentValueCharset","buildPath","segments","join","UrlPattern","mapModelName","modelName","matchUrlPattern","path","routeType","pattern","match","handleRequest","client","method","query","requestBody","toUpperCase","startsWith","proc","split","processProcedureRequest","processSingleRead","processFetchRelated","relationship","processReadRelationship","processCollectionRead","makeError","body","upsertMeta","processUpsert","processCreate","processRelationshipCRUD","processUpdate","processDelete","err","ORMError","handleORMError","handleGenericError","stack","makeProcBadInputErrorResponse","procDef","getProcedureDef","isMutation","mutation","argsPayload","result","processedArgsPayload","processSuperJsonRequestPayload","procInput","mapProcedureArgs","clientResult","$procs","toSerialize","toPlainObject","json","SuperJSON","serialize","responseBody","serialization","makeProcGenericErrorResponse","resp","JSON","stringify","resourceId","typeInfo","getModelInfo","makeUnsupportedModelError","args","where","makeIdFilter","idFields","includeRelationshipIds","include","select","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","entities","findMany","addTotalCountToMeta","take","count","Promise","all","selectFieldsQuery","Array","isArray","selectFieldNames","fields","reduce","acc","curr","assign","baseUrl","totalPages","Math","ceil","Paginator","first","replaceURLSearchParams","last","prev","next","processRequestBody","deserialize","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","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","plainResult","forEach","makeCompoundId","value","toJSON","params","r","URL","searchParams","toString","nested","decodedId","decodeURIComponent","coerce","idf","idx","mf","attr","parse","parseInt","isNaN","BigInt","parseFloat","Decimal","append","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","lowerCaseFirst","safeJSONStringify","ORMError","ORMErrorReason","SuperJSON","match","z","fromError","registerCustomSerializers","RPCApiHandler","options","validateOptions","schema","z","strictObject","object","log","loggerSchema","optional","parseResult","safeParse","success","Error","fromError","error","handleRequest","client","method","path","query","requestBody","parts","split","filter","p","op","pop","model","length","makeBadInputErrorResponse","PROCEDURE_ROUTE_PREFIXES","handleProcedureRequest","toUpperCase","proc","lowerCaseFirst","args","resCode","unmarshalQ","err","message","result","processedArgs","processRequestPayload","isValidModel","safeJSONStringify","clientResult","responseBody","data","json","meta","SuperJSON","serialize","serialization","response","status","body","ORMError","makeORMErrorResponse","makeGenericErrorResponse","procDef","getProcedureDef","isMutation","mutation","argsPayload","undefined","processedArgsPayload","processSuperJsonRequestPayload","procInput","mapProcedureArgs","$procs","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"]}