@ypanagidis/joqi 0.0.1
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/README.md +444 -0
- package/dist/effect.d.ts +2 -0
- package/dist/effect.js +3 -0
- package/dist/index-w8tJonRi.d.ts +1213 -0
- package/dist/index-w8tJonRi.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/src-DGGMT7nT.js +1298 -0
- package/dist/src-DGGMT7nT.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-DGGMT7nT.js","names":["JsonValueSchema: z.ZodType<JsonValue>","QueryParamsSchema: z.ZodType<QueryParams>","QueryFilterSchema: z.ZodType<QueryFilter>","QueryFilterOperatorErrorSchema","resolveRegistryEffect: (\n input: ResolveRegistryInput,\n) => Effect.Effect<ResolvedRegistry, ResolveRegistryError>","issues: RegistryResolutionIssue[]","duplicateSourceIssues: RegistryResolutionIssue[]","sources: Record<string, ResolvedSource>","parsePolicies: (\n input: ResolveRegistryInput,\n) => Effect.Effect<RegistryPolicy[], RegistryParseError>","policies: RegistryPolicy[]","merged: Record<string, MergedSourcePolicy>","merged: Record<string, Policy>","fields: Record<string, ResolvedField>","relations: Record<string, ResolvedRelation>","defaultOperatorsByType: Record<FieldType, readonly QueryFilterOperator[]>","validateQuerySpecEffect: (\n input: ValidateQuerySpecInput,\n) => Effect.Effect<ValidatedQuerySpec, ValidateQuerySpecError>","issues: QueryValidationIssue[]","lowerQuerySpecToIREffect: (\n input: LowerQuerySpecInput,\n) => Effect.Effect<QueryIR, LowerQuerySpecError>","context: LoweringContext","orderBy","joinPathParts: string[]","mysqlDialectCompiler: SQLDialectCompiler","postgresDialectCompiler: SQLDialectCompiler","sqliteDialectCompiler: SQLDialectCompiler","compileQuerySpecToSQLEffect: (\n input: CompileQuerySpecToSQLInput,\n) => Effect.Effect<SQLPlan, CompileQuerySpecToSQLError>","context: SQLCompileContext","shape: Record<string, z.ZodType>"],"sources":["../src/specs/query.ts","../src/specs/registries.ts","../src/registry/resolve.ts","../src/query/validate.ts","../src/query/lower.ts","../src/compiler/sql/dialects/mysql.ts","../src/compiler/sql/dialects/postgres.ts","../src/compiler/sql/dialects/sqlite.ts","../src/compiler/sql/index.ts","../src/results/schema.ts","../src/runtime.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const QueryVersionSchema = z.literal(\"v1\");\n\nexport const QuerySortDirectionSchema = z.enum([\"asc\", \"desc\"]);\n\nexport const QueryFilterOperatorSchema = z.enum([\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"isNull\",\n \"isNotNull\",\n]);\n\nconst JsonScalarSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);\n\nexport const QueryParamRefSchema = z\n .object({\n $param: z.string().min(1),\n })\n .strict();\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([JsonScalarSchema, z.array(JsonValueSchema), z.record(z.string(), JsonValueSchema)]),\n);\n\nconst JsonLiteralValueSchema = JsonValueSchema.refine(\n (value) =>\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n !Object.hasOwn(value, \"$param\"),\n { message: \"Use {$param: string} without additional properties for parameter refs\" },\n);\n\nexport type QueryParamRef = z.infer<typeof QueryParamRefSchema>;\n\nexport type QueryValue = JsonValue | QueryParamRef;\n\nexport type QueryParams = Record<string, JsonValue>;\n\nexport type QueryLimitValue = number | QueryParamRef;\n\nconst QueryValueSchema = z.union([QueryParamRefSchema, JsonLiteralValueSchema]);\n\nconst QueryLimitValueSchema = z.union([z.number().int().nonnegative(), QueryParamRefSchema]);\n\nexport const QueryParamsSchema: z.ZodType<QueryParams> = z.record(z.string(), JsonValueSchema);\n\nexport type QueryFilter =\n | {\n and: QueryFilter[];\n }\n | {\n or: QueryFilter[];\n }\n | {\n field: string;\n op: z.infer<typeof QueryFilterOperatorSchema>;\n value?: QueryValue | undefined;\n };\n\nexport const QueryFilterSchema: z.ZodType<QueryFilter> = z.lazy(() =>\n z.union([\n z.object({\n and: z.array(QueryFilterSchema).min(1),\n }),\n z.object({\n or: z.array(QueryFilterSchema).min(1),\n }),\n z.object({\n field: z.string().min(1),\n op: QueryFilterOperatorSchema,\n value: QueryValueSchema.optional(),\n }),\n ]),\n);\n\nexport const QueryOrderBySchema = z.object({\n field: z.string().min(1),\n direction: QuerySortDirectionSchema,\n});\n\nexport const QuerySpecSchema = z.object({\n version: QueryVersionSchema,\n source: z.string().min(1),\n select: z.array(z.string().min(1)).min(1),\n where: QueryFilterSchema.optional(),\n groupBy: z.array(z.string().min(1)).optional(),\n orderBy: z.array(QueryOrderBySchema).optional(),\n limit: QueryLimitValueSchema.optional(),\n offset: QueryLimitValueSchema.optional(),\n});\n\nexport type QuerySpec = z.infer<typeof QuerySpecSchema>;\n\nexport type QueryOrderBy = z.infer<typeof QueryOrderBySchema>;\n\nexport type QueryFilterOperator = z.infer<typeof QueryFilterOperatorSchema>;\n\nexport type QuerySortDirection = z.infer<typeof QuerySortDirectionSchema>;\n\nexport const parseQuerySpec = (input: unknown): QuerySpec => QuerySpecSchema.parse(input);\n\nexport const safeParseQuerySpec = (input: unknown) => QuerySpecSchema.safeParse(input);\n","import { z } from \"zod\";\n\nimport { QueryFilterOperatorSchema } from \"./query.js\";\n\nexport const RegistryVersionSchema = z.literal(\"v1\");\n\nexport const FieldTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"json\",\n \"enum\",\n \"unknown\",\n]);\n\nexport const PhysicalSourceKindSchema = z.enum([\"table\", \"view\", \"model\"]);\n\nexport const RelationKindSchema = z.enum([\"one\", \"many\"]);\n\nexport const AggregationSchema = z.enum([\"count\", \"sum\", \"avg\", \"min\", \"max\"]);\n\nexport const ExposureModeSchema = z.enum([\"deny-by-default\", \"allow-by-default\"]);\n\nconst nonEmptyRecord = <ValueSchema extends z.ZodType>(valueSchema: ValueSchema) =>\n z.record(z.string().min(1), valueSchema).refine((value) => Object.keys(value).length > 0, {\n message: \"Expected at least one entry\",\n });\n\nexport const AdapterMetaSchema = z.record(z.string().min(1), z.unknown());\n\nexport const PhysicalFieldSchema = z.object({\n type: FieldTypeSchema,\n nullable: z.boolean(),\n enumValues: z.array(z.string()).optional(),\n adapterMeta: AdapterMetaSchema.optional(),\n});\n\nexport const PhysicalRelationSchema = z.object({\n kind: RelationKindSchema,\n target: z.string().min(1),\n localFields: z.array(z.string().min(1)).min(1),\n foreignFields: z.array(z.string().min(1)).min(1),\n nullable: z.boolean().optional(),\n adapterMeta: AdapterMetaSchema.optional(),\n});\n\nexport const PhysicalSourceSchema = z.object({\n kind: PhysicalSourceKindSchema,\n name: z.string().min(1),\n schema: z.string().min(1).optional(),\n primaryKey: z.array(z.string().min(1)).optional(),\n fields: nonEmptyRecord(PhysicalFieldSchema),\n relations: z.record(z.string().min(1), PhysicalRelationSchema).optional(),\n adapterMeta: AdapterMetaSchema.optional(),\n});\n\nexport const PhysicalRegistrySchema = z.object({\n version: RegistryVersionSchema,\n sources: nonEmptyRecord(PhysicalSourceSchema),\n});\n\nexport const FieldPolicySchema = z.object({\n expose: z.boolean().optional(),\n exposeAs: z.string().min(1).optional(),\n label: z.string().min(1).optional(),\n description: z.string().min(1).optional(),\n type: FieldTypeSchema.exclude([\"unknown\"]).optional(),\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n sortable: z.boolean().optional(),\n groupable: z.boolean().optional(),\n operators: z.array(QueryFilterOperatorSchema).optional(),\n aggregations: z.array(AggregationSchema).optional(),\n});\n\nexport const RelationPolicySchema = z.object({\n expose: z.boolean().optional(),\n exposeAs: z.string().min(1).optional(),\n target: z.string().min(1).optional(),\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n maxDepth: z.number().int().nonnegative().optional(),\n});\n\nexport const SourcePolicySchema = z.object({\n expose: z.boolean().optional(),\n exposeAs: z.string().min(1).optional(),\n label: z.string().min(1).optional(),\n description: z.string().min(1).optional(),\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n sortable: z.boolean().optional(),\n maxLimit: z.number().int().nonnegative().optional(),\n defaultLimit: z.number().int().nonnegative().optional(),\n fields: z.record(z.string().min(1), FieldPolicySchema).optional(),\n relations: z.record(z.string().min(1), RelationPolicySchema).optional(),\n});\n\nexport const RegistryPolicySchema = z.object({\n version: RegistryVersionSchema,\n sources: z.record(z.string().min(1), SourcePolicySchema).optional(),\n});\n\nexport const SourceDefaultsSchema = z.object({\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n sortable: z.boolean().optional(),\n maxLimit: z.number().int().nonnegative().optional(),\n});\n\nexport const FieldDefaultsSchema = z.object({\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n sortable: z.boolean().optional(),\n groupable: z.boolean().optional(),\n operators: z.union([z.literal(\"byType\"), z.array(QueryFilterOperatorSchema)]).optional(),\n});\n\nexport const RelationDefaultsSchema = z.object({\n selectable: z.boolean().optional(),\n filterable: z.boolean().optional(),\n maxDepth: z.number().int().nonnegative().optional(),\n});\n\nexport const RegistryDefaultsSchema = z.object({\n exposure: ExposureModeSchema.default(\"deny-by-default\"),\n source: SourceDefaultsSchema.optional(),\n field: FieldDefaultsSchema.optional(),\n relation: RelationDefaultsSchema.optional(),\n});\n\nexport const ResolvedFieldSchema = z.object({\n physicalSource: z.string().min(1),\n physicalField: z.string().min(1),\n publicName: z.string().min(1),\n type: FieldTypeSchema,\n nullable: z.boolean(),\n label: z.string().min(1).optional(),\n description: z.string().min(1).optional(),\n selectable: z.boolean(),\n filterable: z.boolean(),\n sortable: z.boolean(),\n groupable: z.boolean(),\n operators: z.array(QueryFilterOperatorSchema),\n aggregations: z.array(AggregationSchema),\n});\n\nexport const ResolvedRelationSchema = z.object({\n physicalSource: z.string().min(1),\n physicalRelation: z.string().min(1),\n publicName: z.string().min(1),\n target: z.string().min(1),\n kind: RelationKindSchema,\n localFields: z.array(z.string().min(1)).min(1),\n foreignFields: z.array(z.string().min(1)).min(1),\n selectable: z.boolean(),\n filterable: z.boolean(),\n maxDepth: z.number().int().nonnegative(),\n});\n\nexport const ResolvedSourceSchema = z.object({\n physicalSource: z.string().min(1),\n publicName: z.string().min(1),\n label: z.string().min(1).optional(),\n description: z.string().min(1).optional(),\n maxLimit: z.number().int().nonnegative().optional(),\n defaultLimit: z.number().int().nonnegative().optional(),\n fields: nonEmptyRecord(ResolvedFieldSchema),\n relations: z.record(z.string().min(1), ResolvedRelationSchema),\n});\n\nexport const ResolvedRegistrySchema = z.object({\n version: RegistryVersionSchema,\n sources: z.record(z.string().min(1), ResolvedSourceSchema),\n});\n\nexport type FieldType = z.infer<typeof FieldTypeSchema>;\nexport type Aggregation = z.infer<typeof AggregationSchema>;\nexport type PhysicalRegistry = z.infer<typeof PhysicalRegistrySchema>;\nexport type PhysicalSource = z.infer<typeof PhysicalSourceSchema>;\nexport type PhysicalField = z.infer<typeof PhysicalFieldSchema>;\nexport type PhysicalRelation = z.infer<typeof PhysicalRelationSchema>;\nexport type RelationKind = z.infer<typeof RelationKindSchema>;\nexport type RegistryPolicy = z.infer<typeof RegistryPolicySchema>;\nexport type SourcePolicy = z.infer<typeof SourcePolicySchema>;\nexport type FieldPolicy = z.infer<typeof FieldPolicySchema>;\nexport type RelationPolicy = z.infer<typeof RelationPolicySchema>;\nexport type RegistryDefaults = z.infer<typeof RegistryDefaultsSchema>;\nexport type ResolvedRegistry = z.infer<typeof ResolvedRegistrySchema>;\nexport type ResolvedSource = z.infer<typeof ResolvedSourceSchema>;\nexport type ResolvedField = z.infer<typeof ResolvedFieldSchema>;\nexport type ResolvedRelation = z.infer<typeof ResolvedRelationSchema>;\n\nexport type PhysicalRegistryLike = {\n readonly sources: Readonly<Record<string, PhysicalSourceLike>>;\n};\n\nexport type PhysicalSourceLike = {\n readonly fields: Readonly<Record<string, unknown>>;\n readonly relations?: Readonly<Record<string, unknown>> | undefined;\n};\n\nexport type Policy<TPhysical extends PhysicalRegistryLike> = Omit<RegistryPolicy, \"sources\"> & {\n readonly sources?: {\n readonly [SourceName in StringKeyOf<TPhysical[\"sources\"]>]?: PolicySource<\n TPhysical[\"sources\"][SourceName]\n >;\n };\n};\n\nexport type PolicySource<TSource extends PhysicalSourceLike> = Omit<\n SourcePolicy,\n \"fields\" | \"relations\"\n> & {\n readonly fields?: {\n readonly [FieldName in StringKeyOf<TSource[\"fields\"]>]?: FieldPolicy;\n };\n readonly relations?: PolicyRelations<TSource>;\n};\n\ntype PolicyRelations<TSource extends PhysicalSourceLike> = TSource extends {\n readonly relations?: infer Relations;\n}\n ? NonNullable<Relations> extends Readonly<Record<string, unknown>>\n ? {\n readonly [RelationName in StringKeyOf<NonNullable<Relations>>]?: RelationPolicy;\n }\n : never\n : never;\n\ntype StringKeyOf<Value> = Extract<keyof Value, string>;\n\nexport const parsePhysicalRegistry = (input: unknown): PhysicalRegistry =>\n PhysicalRegistrySchema.parse(input);\n\nexport const parseRegistryPolicy = (input: unknown): RegistryPolicy =>\n RegistryPolicySchema.parse(input);\n\nexport const parseRegistryDefaults = (input: unknown): RegistryDefaults =>\n RegistryDefaultsSchema.parse(input);\n\nexport const parseResolvedRegistry = (input: unknown): ResolvedRegistry =>\n ResolvedRegistrySchema.parse(input);\n\nexport const safeParsePhysicalRegistry = (input: unknown) =>\n PhysicalRegistrySchema.safeParse(input);\n\nexport const safeParseRegistryPolicy = (input: unknown) => RegistryPolicySchema.safeParse(input);\n\nexport const safeParseRegistryDefaults = (input: unknown) =>\n RegistryDefaultsSchema.safeParse(input);\n\nexport const safeParseResolvedRegistry = (input: unknown) =>\n ResolvedRegistrySchema.safeParse(input);\n","import { Effect, Schema } from \"effect\";\nimport type * as Either from \"effect/Either\";\nimport { ZodError } from \"zod\";\n\nimport type { QueryFilterOperator } from \"../specs/query.js\";\nimport {\n PhysicalRegistrySchema,\n RegistryDefaultsSchema,\n RegistryPolicySchema,\n ResolvedRegistrySchema,\n} from \"../specs/registries.js\";\nimport type {\n FieldPolicy,\n FieldType,\n PhysicalRegistry,\n RegistryDefaults,\n RegistryPolicy,\n RelationPolicy,\n ResolvedField,\n ResolvedRegistry,\n ResolvedRelation,\n ResolvedSource,\n SourcePolicy,\n} from \"../specs/registries.js\";\n\nexport type ResolveRegistryInput = {\n physical: unknown;\n defaults?: unknown;\n policy?: unknown;\n policies?: readonly unknown[];\n};\n\nconst FieldTypeErrorSchema = Schema.Literal(\n \"string\",\n \"number\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"json\",\n \"enum\",\n \"unknown\",\n);\n\nconst QueryFilterOperatorErrorSchema = Schema.Literal(\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"isNull\",\n \"isNotNull\",\n);\n\nexport const RegistryResolutionIssueSchema = Schema.Union(\n Schema.Struct({\n code: Schema.Literal(\"unknown_source\"),\n source: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"unknown_field\"),\n source: Schema.String,\n field: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"unknown_relation\"),\n source: Schema.String,\n relation: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"duplicate_public_source\"),\n publicName: Schema.String,\n sources: Schema.Array(Schema.String),\n }),\n Schema.Struct({\n code: Schema.Literal(\"duplicate_public_field\"),\n source: Schema.String,\n publicName: Schema.String,\n fields: Schema.Array(Schema.String),\n }),\n Schema.Struct({\n code: Schema.Literal(\"duplicate_public_relation\"),\n source: Schema.String,\n publicName: Schema.String,\n relations: Schema.Array(Schema.String),\n }),\n Schema.Struct({\n code: Schema.Literal(\"source_has_no_fields\"),\n source: Schema.String,\n publicName: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"invalid_default_limit\"),\n source: Schema.String,\n defaultLimit: Schema.Number,\n maxLimit: Schema.Number,\n }),\n Schema.Struct({\n code: Schema.Literal(\"unknown_relation_target\"),\n source: Schema.String,\n relation: Schema.String,\n target: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"invalid_operator_for_field_type\"),\n source: Schema.String,\n field: Schema.String,\n type: FieldTypeErrorSchema,\n operator: QueryFilterOperatorErrorSchema,\n }),\n);\n\nexport type RegistryResolutionIssue = typeof RegistryResolutionIssueSchema.Type;\n\nexport class RegistryResolutionError extends Schema.TaggedError<RegistryResolutionError>()(\n \"RegistryResolutionError\",\n {\n issues: Schema.Array(RegistryResolutionIssueSchema),\n },\n) {}\n\nexport class RegistryParseError extends Schema.TaggedError<RegistryParseError>()(\n \"RegistryParseError\",\n {\n error: Schema.Defect,\n },\n) {}\n\nexport type ResolveRegistryError = RegistryParseError | RegistryResolutionError;\n\nexport const resolveRegistryEffect: (\n input: ResolveRegistryInput,\n) => Effect.Effect<ResolvedRegistry, ResolveRegistryError> = Effect.fn(\"resolveRegistry\")(\n function* (input: ResolveRegistryInput) {\n const physical = yield* parseRegistryInput(() => PhysicalRegistrySchema.parse(input.physical));\n const defaults = yield* parseRegistryInput(() =>\n RegistryDefaultsSchema.parse(input.defaults ?? {}),\n );\n const policies = yield* parsePolicies(input);\n const policy = mergePolicies(policies);\n const issues: RegistryResolutionIssue[] = [];\n\n collectStalePolicyReferenceIssues(physical, policy, issues);\n\n if (issues.length > 0) {\n return yield* new RegistryResolutionError({ issues });\n }\n\n const publicSourcesByPhysical = new Map<string, string>();\n const physicalSourcesByPublic = new Map<string, string>();\n const duplicateSourceIssues: RegistryResolutionIssue[] = [];\n\n for (const sourceName of Object.keys(physical.sources)) {\n const sourcePolicy = policy[sourceName];\n\n if (!isExposed(defaults, sourcePolicy?.expose)) {\n continue;\n }\n\n const publicName = sourcePolicy?.exposeAs ?? sourceName;\n const existingSource = physicalSourcesByPublic.get(publicName);\n\n if (existingSource !== undefined) {\n duplicateSourceIssues.push({\n code: \"duplicate_public_source\",\n publicName,\n sources: [existingSource, sourceName],\n });\n continue;\n }\n\n physicalSourcesByPublic.set(publicName, sourceName);\n publicSourcesByPhysical.set(sourceName, publicName);\n }\n\n const sources: Record<string, ResolvedSource> = {};\n\n for (const [sourceName, physicalSource] of Object.entries(physical.sources)) {\n const publicName = publicSourcesByPhysical.get(sourceName);\n\n if (publicName === undefined) {\n continue;\n }\n\n const sourcePolicy = policy[sourceName];\n const sourceCapabilities = resolveSourceCapabilities(defaults, sourcePolicy);\n const fields = resolveFields({\n sourceName,\n physicalFields: physicalSource.fields,\n defaults,\n sourcePolicy,\n sourceCapabilities,\n issues,\n });\n\n const relations = resolveRelations({\n sourceName,\n physicalRelations: physicalSource.relations ?? {},\n defaults,\n sourcePolicy,\n sourceCapabilities,\n publicSourcesByPhysical,\n physicalSourcesByPublic,\n issues,\n });\n\n if (Object.keys(fields).length === 0) {\n issues.push({ code: \"source_has_no_fields\", source: sourceName, publicName });\n continue;\n }\n\n const maxLimit = sourcePolicy?.maxLimit ?? defaults.source?.maxLimit;\n const defaultLimit = sourcePolicy?.defaultLimit;\n\n if (defaultLimit !== undefined && maxLimit !== undefined && defaultLimit > maxLimit) {\n issues.push({ code: \"invalid_default_limit\", source: sourceName, defaultLimit, maxLimit });\n continue;\n }\n\n sources[publicName] = {\n physicalSource: sourceName,\n publicName,\n ...(sourcePolicy?.label === undefined ? {} : { label: sourcePolicy.label }),\n ...(sourcePolicy?.description === undefined\n ? {}\n : { description: sourcePolicy.description }),\n ...(maxLimit === undefined ? {} : { maxLimit }),\n ...(defaultLimit === undefined ? {} : { defaultLimit }),\n fields,\n relations,\n };\n }\n\n issues.push(...duplicateSourceIssues);\n\n if (issues.length > 0) {\n return yield* new RegistryResolutionError({ issues });\n }\n\n return yield* parseRegistryInput(() =>\n ResolvedRegistrySchema.parse({\n version: \"v1\",\n sources,\n }),\n );\n },\n);\n\nexport const resolveRegistry = (input: ResolveRegistryInput): ResolvedRegistry =>\n unwrapResolveRegistryResult(Effect.runSync(Effect.either(resolveRegistryEffect(input))));\n\nexport const resolveRegistryPromise = async (\n input: ResolveRegistryInput,\n): Promise<ResolvedRegistry> =>\n unwrapResolveRegistryResult(await Effect.runPromise(Effect.either(resolveRegistryEffect(input))));\n\ntype MergedSourcePolicy = Omit<SourcePolicy, \"fields\" | \"relations\"> & {\n fields?: Record<string, FieldPolicy> | undefined;\n relations?: Record<string, RelationPolicy> | undefined;\n};\n\ntype SourceCapabilities = {\n selectable: boolean;\n filterable: boolean;\n sortable: boolean;\n};\n\nconst parseRegistryInput = <Value>(parse: () => Value) =>\n Effect.try({\n try: parse,\n catch: (error) => {\n if (error instanceof ZodError) {\n return new RegistryParseError({ error });\n }\n\n throw error;\n },\n });\n\nconst unwrapResolveRegistryResult = (\n result: Either.Either<ResolvedRegistry, ResolveRegistryError>,\n): ResolvedRegistry => {\n if (result._tag === \"Left\") {\n throw result.left;\n }\n\n return result.right;\n};\n\nconst parsePolicies: (\n input: ResolveRegistryInput,\n) => Effect.Effect<RegistryPolicy[], RegistryParseError> = Effect.fn(\"parseRegistryPolicies\")(\n function* (input: ResolveRegistryInput) {\n const policies: RegistryPolicy[] = [];\n\n if (input.policy !== undefined) {\n policies.push(yield* parseRegistryInput(() => RegistryPolicySchema.parse(input.policy)));\n }\n\n for (const policy of input.policies ?? []) {\n policies.push(yield* parseRegistryInput(() => RegistryPolicySchema.parse(policy)));\n }\n\n return policies;\n },\n);\n\nconst mergePolicies = (policies: readonly RegistryPolicy[]): Record<string, MergedSourcePolicy> => {\n const merged: Record<string, MergedSourcePolicy> = {};\n\n for (const policy of policies) {\n for (const [sourceName, sourcePolicy] of Object.entries(policy.sources ?? {})) {\n const currentSourcePolicy = merged[sourceName] ?? {};\n const fields = mergeNestedPolicy(currentSourcePolicy.fields, sourcePolicy.fields);\n const relations = mergeNestedPolicy(currentSourcePolicy.relations, sourcePolicy.relations);\n\n merged[sourceName] = {\n ...currentSourcePolicy,\n ...sourcePolicy,\n ...(fields === undefined ? {} : { fields }),\n ...(relations === undefined ? {} : { relations }),\n };\n }\n }\n\n return merged;\n};\n\nconst mergeNestedPolicy = <Policy extends object>(\n current: Record<string, Policy> | undefined,\n next: Record<string, Policy> | undefined,\n): Record<string, Policy> | undefined => {\n if (current === undefined && next === undefined) {\n return undefined;\n }\n\n const merged: Record<string, Policy> = { ...current };\n\n for (const [name, policy] of Object.entries(next ?? {})) {\n merged[name] = {\n ...merged[name],\n ...policy,\n } as Policy;\n }\n\n return merged;\n};\n\nconst collectStalePolicyReferenceIssues = (\n physical: PhysicalRegistry,\n policy: Record<string, MergedSourcePolicy>,\n issues: RegistryResolutionIssue[],\n) => {\n for (const [sourceName, sourcePolicy] of Object.entries(policy)) {\n const physicalSource = physical.sources[sourceName];\n\n if (physicalSource === undefined) {\n issues.push({ code: \"unknown_source\", source: sourceName });\n continue;\n }\n\n for (const fieldName of Object.keys(sourcePolicy.fields ?? {})) {\n if (physicalSource.fields[fieldName] === undefined) {\n issues.push({ code: \"unknown_field\", source: sourceName, field: fieldName });\n }\n }\n\n for (const relationName of Object.keys(sourcePolicy.relations ?? {})) {\n if (physicalSource.relations?.[relationName] === undefined) {\n issues.push({ code: \"unknown_relation\", source: sourceName, relation: relationName });\n }\n }\n }\n};\n\nconst isExposed = (defaults: RegistryDefaults, expose: boolean | undefined) => {\n if (expose !== undefined) {\n return expose;\n }\n\n return defaults.exposure === \"allow-by-default\";\n};\n\nconst resolveSourceCapabilities = (\n defaults: RegistryDefaults,\n sourcePolicy: MergedSourcePolicy | undefined,\n): SourceCapabilities => ({\n selectable: sourcePolicy?.selectable ?? defaults.source?.selectable ?? true,\n filterable: sourcePolicy?.filterable ?? defaults.source?.filterable ?? true,\n sortable: sourcePolicy?.sortable ?? defaults.source?.sortable ?? true,\n});\n\nconst resolveFields = (input: {\n sourceName: string;\n physicalFields: PhysicalRegistry[\"sources\"][string][\"fields\"];\n defaults: RegistryDefaults;\n sourcePolicy: MergedSourcePolicy | undefined;\n sourceCapabilities: SourceCapabilities;\n issues: RegistryResolutionIssue[];\n}): Record<string, ResolvedField> => {\n const fields: Record<string, ResolvedField> = {};\n const physicalFieldsByPublic = new Map<string, string>();\n\n for (const [fieldName, physicalField] of Object.entries(input.physicalFields)) {\n const fieldPolicy = input.sourcePolicy?.fields?.[fieldName];\n\n if (!isExposed(input.defaults, fieldPolicy?.expose)) {\n continue;\n }\n\n const publicName = fieldPolicy?.exposeAs ?? fieldName;\n const existingField = physicalFieldsByPublic.get(publicName);\n\n if (existingField !== undefined) {\n input.issues.push({\n code: \"duplicate_public_field\",\n source: input.sourceName,\n publicName,\n fields: [existingField, fieldName],\n });\n continue;\n }\n\n physicalFieldsByPublic.set(publicName, fieldName);\n\n const type = fieldPolicy?.type ?? physicalField.type;\n const selectable =\n input.sourceCapabilities.selectable &&\n (fieldPolicy?.selectable ?? input.defaults.field?.selectable ?? true);\n const filterable =\n input.sourceCapabilities.filterable &&\n (fieldPolicy?.filterable ?? input.defaults.field?.filterable ?? false);\n const sortable =\n input.sourceCapabilities.sortable &&\n (fieldPolicy?.sortable ?? input.defaults.field?.sortable ?? false);\n const operators = filterable\n ? resolveOperators({\n sourceName: input.sourceName,\n fieldName,\n type,\n fieldPolicy,\n defaults: input.defaults,\n issues: input.issues,\n })\n : [];\n\n fields[publicName] = {\n physicalSource: input.sourceName,\n physicalField: fieldName,\n publicName,\n type,\n nullable: physicalField.nullable,\n ...(fieldPolicy?.label === undefined ? {} : { label: fieldPolicy.label }),\n ...(fieldPolicy?.description === undefined ? {} : { description: fieldPolicy.description }),\n selectable,\n filterable,\n sortable,\n groupable: fieldPolicy?.groupable ?? input.defaults.field?.groupable ?? false,\n operators,\n aggregations: fieldPolicy?.aggregations ?? [],\n };\n }\n\n return fields;\n};\n\nconst resolveRelations = (input: {\n sourceName: string;\n physicalRelations: NonNullable<PhysicalRegistry[\"sources\"][string][\"relations\"]>;\n defaults: RegistryDefaults;\n sourcePolicy: MergedSourcePolicy | undefined;\n sourceCapabilities: SourceCapabilities;\n publicSourcesByPhysical: Map<string, string>;\n physicalSourcesByPublic: Map<string, string>;\n issues: RegistryResolutionIssue[];\n}): Record<string, ResolvedRelation> => {\n const relations: Record<string, ResolvedRelation> = {};\n const physicalRelationsByPublic = new Map<string, string>();\n\n for (const [relationName, physicalRelation] of Object.entries(input.physicalRelations)) {\n const relationPolicy = input.sourcePolicy?.relations?.[relationName];\n\n if (!isExposed(input.defaults, relationPolicy?.expose)) {\n continue;\n }\n\n const publicName = relationPolicy?.exposeAs ?? relationName;\n const existingRelation = physicalRelationsByPublic.get(publicName);\n\n if (existingRelation !== undefined) {\n input.issues.push({\n code: \"duplicate_public_relation\",\n source: input.sourceName,\n publicName,\n relations: [existingRelation, relationName],\n });\n continue;\n }\n\n const target =\n relationPolicy?.target ?? input.publicSourcesByPhysical.get(physicalRelation.target);\n\n if (target === undefined || !input.physicalSourcesByPublic.has(target)) {\n if (relationPolicy?.expose === true) {\n input.issues.push({\n code: \"unknown_relation_target\",\n source: input.sourceName,\n relation: relationName,\n target: relationPolicy?.target ?? physicalRelation.target,\n });\n }\n\n continue;\n }\n\n physicalRelationsByPublic.set(publicName, relationName);\n\n relations[publicName] = {\n physicalSource: input.sourceName,\n physicalRelation: relationName,\n publicName,\n target,\n kind: physicalRelation.kind,\n localFields: physicalRelation.localFields,\n foreignFields: physicalRelation.foreignFields,\n selectable:\n input.sourceCapabilities.selectable &&\n (relationPolicy?.selectable ?? input.defaults.relation?.selectable ?? false),\n filterable:\n input.sourceCapabilities.filterable &&\n (relationPolicy?.filterable ?? input.defaults.relation?.filterable ?? false),\n maxDepth: relationPolicy?.maxDepth ?? input.defaults.relation?.maxDepth ?? 1,\n };\n }\n\n return relations;\n};\n\nconst resolveOperators = (input: {\n sourceName: string;\n fieldName: string;\n type: FieldType;\n fieldPolicy: FieldPolicy | undefined;\n defaults: RegistryDefaults;\n issues: RegistryResolutionIssue[];\n}): QueryFilterOperator[] => {\n const requestedOperators =\n input.fieldPolicy?.operators ?? input.defaults.field?.operators ?? \"byType\";\n const operators =\n requestedOperators === \"byType\" ? defaultOperatorsByType[input.type] : requestedOperators;\n const validOperators = new Set(defaultOperatorsByType[input.type]);\n\n for (const operator of operators) {\n if (!validOperators.has(operator)) {\n input.issues.push({\n code: \"invalid_operator_for_field_type\",\n source: input.sourceName,\n field: input.fieldName,\n type: input.type,\n operator,\n });\n }\n }\n\n return [...operators];\n};\n\nconst nullableOperators = [\"isNull\", \"isNotNull\"] as const;\nconst equalityOperators = [\"eq\", \"neq\", \"in\", ...nullableOperators] as const;\nconst comparableOperators = [\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n ...nullableOperators,\n] as const;\n\nconst defaultOperatorsByType: Record<FieldType, readonly QueryFilterOperator[]> = {\n string: [\"eq\", \"neq\", \"in\", \"contains\", \"startsWith\", \"endsWith\", ...nullableOperators],\n number: comparableOperators,\n boolean: [\"eq\", \"neq\", ...nullableOperators],\n date: comparableOperators,\n datetime: comparableOperators,\n json: [\"eq\", \"neq\", ...nullableOperators],\n enum: equalityOperators,\n unknown: [],\n};\n","import { Effect, Schema } from \"effect\";\nimport type * as Either from \"effect/Either\";\nimport { ZodError } from \"zod\";\n\nimport { QueryParamsSchema, QuerySpecSchema } from \"../specs/query.js\";\nimport type {\n JsonValue,\n QueryFilter,\n QueryFilterOperator,\n QueryParamRef,\n QueryParams,\n QuerySpec,\n QueryValue,\n} from \"../specs/query.js\";\nimport { ResolvedRegistrySchema } from \"../specs/registries.js\";\nimport type {\n FieldType,\n ResolvedField,\n ResolvedRegistry,\n ResolvedRelation,\n ResolvedSource,\n} from \"../specs/registries.js\";\n\nexport type ValidateQuerySpecInput = {\n readonly query: unknown;\n readonly registry: unknown;\n readonly params?: unknown;\n};\n\nexport type BoundQueryFilter =\n | {\n readonly and: readonly BoundQueryFilter[];\n }\n | {\n readonly or: readonly BoundQueryFilter[];\n }\n | {\n readonly field: string;\n readonly op: QueryFilterOperator;\n readonly value?: JsonValue | undefined;\n };\n\nexport type ValidatedQuerySpec = Omit<QuerySpec, \"where\" | \"limit\" | \"offset\"> & {\n readonly where?: BoundQueryFilter | undefined;\n readonly limit?: number | undefined;\n readonly offset?: number | undefined;\n};\n\ntype BoundQueryFilterWithParamSource =\n | {\n readonly and: readonly BoundQueryFilterWithParamSource[];\n }\n | {\n readonly or: readonly BoundQueryFilterWithParamSource[];\n }\n | {\n readonly field: string;\n readonly op: QueryFilterOperator;\n readonly value?: JsonValue | undefined;\n readonly valueParam?: string | undefined;\n };\n\ntype ValidatedQuerySpecWithParamSource = Omit<QuerySpec, \"where\" | \"limit\" | \"offset\"> & {\n readonly where?: BoundQueryFilterWithParamSource | undefined;\n readonly limit?: number | undefined;\n readonly offset?: number | undefined;\n};\n\nconst QueryFilterOperatorErrorSchema = Schema.Literal(\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"in\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"isNull\",\n \"isNotNull\",\n);\n\nexport const QueryValidationIssueSchema = Schema.Union(\n Schema.Struct({\n code: Schema.Literal(\"unknown_source\"),\n source: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"unknown_field\"),\n source: Schema.String,\n path: Schema.String,\n field: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"unknown_relation\"),\n source: Schema.String,\n path: Schema.String,\n relation: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\n \"field_not_selectable\",\n \"field_not_filterable\",\n \"field_not_sortable\",\n \"field_not_groupable\",\n ),\n source: Schema.String,\n path: Schema.String,\n field: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"relation_not_selectable\", \"relation_not_filterable\"),\n source: Schema.String,\n path: Schema.String,\n relation: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"relation_depth_exceeded\"),\n source: Schema.String,\n path: Schema.String,\n relation: Schema.String,\n requestedDepth: Schema.Number,\n maxDepth: Schema.Number,\n }),\n Schema.Struct({\n code: Schema.Literal(\"operator_not_allowed\"),\n source: Schema.String,\n path: Schema.String,\n field: Schema.String,\n operator: QueryFilterOperatorErrorSchema,\n allowedOperators: Schema.Array(QueryFilterOperatorErrorSchema),\n }),\n Schema.Struct({\n code: Schema.Literal(\"limit_exceeds_max\"),\n source: Schema.String,\n limit: Schema.Number,\n maxLimit: Schema.Number,\n }),\n Schema.Struct({\n code: Schema.Literal(\"missing_param\"),\n param: Schema.String,\n path: Schema.String,\n }),\n Schema.Struct({\n code: Schema.Literal(\"invalid_param_value\"),\n param: Schema.String,\n path: Schema.String,\n expected: Schema.String,\n }),\n);\n\nexport type QueryValidationIssue = typeof QueryValidationIssueSchema.Type;\n\nexport class QueryParseError extends Schema.TaggedError<QueryParseError>()(\"QueryParseError\", {\n input: Schema.Literal(\"query\", \"registry\", \"params\"),\n error: Schema.Defect,\n}) {}\n\nexport class QueryValidationError extends Schema.TaggedError<QueryValidationError>()(\n \"QueryValidationError\",\n {\n issues: Schema.Array(QueryValidationIssueSchema),\n },\n) {}\n\nexport type ValidateQuerySpecError = QueryParseError | QueryValidationError;\n\nexport const validateQuerySpecEffect: (\n input: ValidateQuerySpecInput,\n) => Effect.Effect<ValidatedQuerySpec, ValidateQuerySpecError> = Effect.fn(\"validateQuerySpec\")(\n function* (input: ValidateQuerySpecInput) {\n const parsedQuery = yield* parseValidationInput(\"query\", () =>\n QuerySpecSchema.parse(input.query),\n );\n const params = yield* parseValidationInput(\"params\", () =>\n QueryParamsSchema.parse(input.params ?? {}),\n );\n const registry = yield* parseValidationInput(\"registry\", () =>\n ResolvedRegistrySchema.parse(input.registry),\n );\n const issues: QueryValidationIssue[] = [];\n const query = bindQueryParams({ query: parsedQuery, params, issues });\n const source = registry.sources[query.source];\n\n if (source === undefined) {\n return yield* new QueryValidationError({\n issues: [{ code: \"unknown_source\", source: query.source }],\n });\n }\n\n validateLimit(query, source, issues);\n\n for (const fieldPath of query.select) {\n validateFieldPath({\n registry,\n source,\n fieldPath,\n fieldCapability: \"selectable\",\n relationCapability: \"selectable\",\n issues,\n });\n }\n\n if (query.where !== undefined) {\n validateFilter({ registry, source, filter: query.where, issues });\n }\n\n for (const fieldPath of query.groupBy ?? []) {\n validateFieldPath({\n registry,\n source,\n fieldPath,\n fieldCapability: \"groupable\",\n relationCapability: \"selectable\",\n issues,\n });\n }\n\n for (const orderBy of query.orderBy ?? []) {\n validateFieldPath({\n registry,\n source,\n fieldPath: orderBy.field,\n fieldCapability: \"sortable\",\n relationCapability: \"selectable\",\n issues,\n });\n }\n\n if (issues.length > 0) {\n return yield* new QueryValidationError({ issues });\n }\n\n return stripQueryParamSources(query);\n },\n);\n\nexport const validateQuerySpec = (input: ValidateQuerySpecInput): ValidatedQuerySpec =>\n unwrapValidateQuerySpecResult(Effect.runSync(Effect.either(validateQuerySpecEffect(input))));\n\nexport const validateQuerySpecPromise = async (\n input: ValidateQuerySpecInput,\n): Promise<ValidatedQuerySpec> =>\n unwrapValidateQuerySpecResult(\n await Effect.runPromise(Effect.either(validateQuerySpecEffect(input))),\n );\n\ntype FieldCapability = \"selectable\" | \"filterable\" | \"sortable\" | \"groupable\";\ntype RelationCapability = \"selectable\" | \"filterable\";\n\nconst parseValidationInput = <Value>(input: \"query\" | \"registry\" | \"params\", parse: () => Value) =>\n Effect.try({\n try: parse,\n catch: (error) => {\n if (error instanceof ZodError) {\n return new QueryParseError({ input, error });\n }\n\n throw error;\n },\n });\n\nconst unwrapValidateQuerySpecResult = (\n result: Either.Either<ValidatedQuerySpec, ValidateQuerySpecError>,\n): ValidatedQuerySpec => {\n if (result._tag === \"Left\") {\n throw result.left;\n }\n\n return result.right;\n};\n\nconst stripQueryParamSources = (query: ValidatedQuerySpecWithParamSource): ValidatedQuerySpec => ({\n version: query.version,\n source: query.source,\n select: query.select,\n ...(query.groupBy === undefined ? {} : { groupBy: query.groupBy }),\n ...(query.orderBy === undefined ? {} : { orderBy: query.orderBy }),\n ...(query.where === undefined ? {} : { where: stripFilterParamSources(query.where) }),\n ...(query.limit === undefined ? {} : { limit: query.limit }),\n ...(query.offset === undefined ? {} : { offset: query.offset }),\n});\n\nconst stripFilterParamSources = (filter: BoundQueryFilterWithParamSource): BoundQueryFilter => {\n if (\"and\" in filter) {\n return { and: filter.and.map(stripFilterParamSources) };\n }\n\n if (\"or\" in filter) {\n return { or: filter.or.map(stripFilterParamSources) };\n }\n\n return {\n field: filter.field,\n op: filter.op,\n ...(filter.value === undefined ? {} : { value: filter.value }),\n };\n};\n\nconst bindQueryParams = (input: {\n readonly query: QuerySpec;\n readonly params: QueryParams;\n readonly issues: QueryValidationIssue[];\n}): ValidatedQuerySpecWithParamSource => ({\n version: input.query.version,\n source: input.query.source,\n select: input.query.select,\n ...(input.query.groupBy === undefined ? {} : { groupBy: input.query.groupBy }),\n ...(input.query.orderBy === undefined ? {} : { orderBy: input.query.orderBy }),\n ...(input.query.where === undefined\n ? {}\n : { where: bindFilterParams({ ...input, filter: input.query.where, path: \"where\" }) }),\n ...(input.query.limit === undefined\n ? {}\n : { limit: bindLimitParam({ ...input, value: input.query.limit, path: \"limit\" }) }),\n ...(input.query.offset === undefined\n ? {}\n : { offset: bindLimitParam({ ...input, value: input.query.offset, path: \"offset\" }) }),\n});\n\nconst bindFilterParams = (input: {\n readonly query: QuerySpec;\n readonly params: QueryParams;\n readonly issues: QueryValidationIssue[];\n readonly filter: QueryFilter;\n readonly path: string;\n}): BoundQueryFilterWithParamSource => {\n if (\"and\" in input.filter) {\n return {\n and: input.filter.and.map((filter, index) =>\n bindFilterParams({ ...input, filter, path: `${input.path}.and[${index}]` }),\n ),\n };\n }\n\n if (\"or\" in input.filter) {\n return {\n or: input.filter.or.map((filter, index) =>\n bindFilterParams({ ...input, filter, path: `${input.path}.or[${index}]` }),\n ),\n };\n }\n\n if (input.filter.value === undefined) {\n return {\n field: input.filter.field,\n op: input.filter.op,\n };\n }\n\n const value = bindJsonParam({\n params: input.params,\n issues: input.issues,\n value: input.filter.value,\n path: `${input.path}.value`,\n });\n\n if (\n input.filter.op === \"in\" &&\n isQueryParamRef(input.filter.value) &&\n Object.hasOwn(input.params, input.filter.value.$param) &&\n (!Array.isArray(value) || value.length === 0)\n ) {\n input.issues.push({\n code: \"invalid_param_value\",\n param: input.filter.value.$param,\n path: `${input.path}.value`,\n expected: \"non-empty array\",\n });\n }\n\n return {\n field: input.filter.field,\n op: input.filter.op,\n value,\n ...(isQueryParamRef(input.filter.value) ? { valueParam: input.filter.value.$param } : {}),\n };\n};\n\nconst bindLimitParam = (input: {\n readonly params: QueryParams;\n readonly issues: QueryValidationIssue[];\n readonly value: QuerySpec[\"limit\"];\n readonly path: string;\n}): number | undefined => {\n if (typeof input.value === \"number\") {\n return input.value;\n }\n\n if (isQueryParamRef(input.value) && !Object.hasOwn(input.params, input.value.$param)) {\n input.issues.push({\n code: \"missing_param\",\n param: input.value.$param,\n path: input.path,\n });\n return undefined;\n }\n\n const value = bindJsonParam({\n params: input.params,\n issues: input.issues,\n value: input.value,\n path: input.path,\n });\n\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 0) {\n return value;\n }\n\n if (isQueryParamRef(input.value)) {\n input.issues.push({\n code: \"invalid_param_value\",\n param: input.value.$param,\n path: input.path,\n expected: \"non-negative integer\",\n });\n }\n\n return undefined;\n};\n\nconst bindJsonParam = (input: {\n readonly params: QueryParams;\n readonly issues: QueryValidationIssue[];\n readonly value: QueryValue | undefined;\n readonly path: string;\n}): JsonValue | undefined => {\n if (!isQueryParamRef(input.value)) {\n return input.value;\n }\n\n if (!Object.hasOwn(input.params, input.value.$param)) {\n input.issues.push({\n code: \"missing_param\",\n param: input.value.$param,\n path: input.path,\n });\n return undefined;\n }\n\n return input.params[input.value.$param];\n};\n\nconst isQueryParamRef = (value: unknown): value is QueryParamRef =>\n value !== null &&\n typeof value === \"object\" &&\n Object.keys(value).length === 1 &&\n typeof (value as { readonly $param?: unknown }).$param === \"string\";\n\nconst validateLimit = (\n query: ValidatedQuerySpecWithParamSource,\n source: ResolvedSource,\n issues: QueryValidationIssue[],\n) => {\n if (query.limit !== undefined && source.maxLimit !== undefined && query.limit > source.maxLimit) {\n issues.push({\n code: \"limit_exceeds_max\",\n source: source.publicName,\n limit: query.limit,\n maxLimit: source.maxLimit,\n });\n }\n};\n\nconst validateFilter = (input: {\n registry: ResolvedRegistry;\n source: ResolvedSource;\n filter: BoundQueryFilterWithParamSource;\n issues: QueryValidationIssue[];\n}) => {\n if (\"and\" in input.filter) {\n for (const filter of input.filter.and) {\n validateFilter({ ...input, filter });\n }\n return;\n }\n\n if (\"or\" in input.filter) {\n for (const filter of input.filter.or) {\n validateFilter({ ...input, filter });\n }\n return;\n }\n\n const result = validateFieldPath({\n registry: input.registry,\n source: input.source,\n fieldPath: input.filter.field,\n fieldCapability: \"filterable\",\n relationCapability: \"filterable\",\n issues: input.issues,\n });\n\n if (result === undefined || !result.field.filterable) {\n return;\n }\n\n if (!result.field.operators.includes(input.filter.op)) {\n input.issues.push({\n code: \"operator_not_allowed\",\n source: result.source.publicName,\n path: input.filter.field,\n field: result.field.publicName,\n operator: input.filter.op,\n allowedOperators: result.field.operators,\n });\n }\n\n validateFilterParamValue({ filter: input.filter, field: result.field, issues: input.issues });\n};\n\nconst validateFilterParamValue = (input: {\n readonly filter: Extract<BoundQueryFilterWithParamSource, { readonly field: string }>;\n readonly field: ResolvedField;\n readonly issues: QueryValidationIssue[];\n}) => {\n if (input.filter.valueParam === undefined || input.filter.value === undefined) {\n return;\n }\n\n if (input.filter.op === \"isNull\" || input.filter.op === \"isNotNull\") {\n return;\n }\n\n if (input.filter.op === \"in\") {\n if (!Array.isArray(input.filter.value) || input.filter.value.length === 0) {\n return;\n }\n\n if (input.filter.value.some((value) => !isValueForFieldType(value, input.field.type))) {\n input.issues.push({\n code: \"invalid_param_value\",\n param: input.filter.valueParam,\n path: `${input.filter.field}.value`,\n expected: `array of ${fieldTypeExpectation(input.field.type)}`,\n });\n }\n\n return;\n }\n\n if (!isValueForFieldType(input.filter.value, input.field.type)) {\n input.issues.push({\n code: \"invalid_param_value\",\n param: input.filter.valueParam,\n path: `${input.filter.field}.value`,\n expected: fieldTypeExpectation(input.field.type),\n });\n }\n};\n\nconst isValueForFieldType = (value: JsonValue, type: FieldType): boolean => {\n if (value === null) {\n return true;\n }\n\n switch (type) {\n case \"number\":\n return typeof value === \"number\";\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"string\":\n case \"enum\":\n case \"date\":\n case \"datetime\":\n return typeof value === \"string\";\n case \"json\":\n case \"unknown\":\n return true;\n }\n};\n\nconst fieldTypeExpectation = (type: FieldType): string => {\n switch (type) {\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"string\":\n case \"enum\":\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n case \"unknown\":\n return \"JSON value\";\n }\n};\n\nconst validateFieldPath = (input: {\n registry: ResolvedRegistry;\n source: ResolvedSource;\n fieldPath: string;\n fieldCapability: FieldCapability;\n relationCapability: RelationCapability;\n issues: QueryValidationIssue[];\n}): { source: ResolvedSource; field: ResolvedField } | undefined => {\n const parts = input.fieldPath.split(\".\");\n const fieldName = parts.at(-1);\n\n if (fieldName === undefined || fieldName.length === 0) {\n return undefined;\n }\n\n let source = input.source;\n const relationNames = parts.slice(0, -1);\n\n for (const [index, relationName] of relationNames.entries()) {\n const relation = source.relations[relationName];\n\n if (relation === undefined) {\n input.issues.push({\n code: \"unknown_relation\",\n source: source.publicName,\n path: input.fieldPath,\n relation: relationName,\n });\n return undefined;\n }\n\n validateRelationPath({\n relation,\n source,\n relationName,\n requestedDepth: relationNames.length - index,\n fieldPath: input.fieldPath,\n relationCapability: input.relationCapability,\n issues: input.issues,\n });\n\n const targetSource = input.registry.sources[relation.target];\n\n if (targetSource === undefined) {\n input.issues.push({ code: \"unknown_source\", source: relation.target });\n return undefined;\n }\n\n source = targetSource;\n }\n\n const field = source.fields[fieldName];\n\n if (field === undefined) {\n input.issues.push({\n code: \"unknown_field\",\n source: source.publicName,\n path: input.fieldPath,\n field: fieldName,\n });\n return undefined;\n }\n\n validateFieldCapability({\n source,\n field,\n fieldPath: input.fieldPath,\n fieldCapability: input.fieldCapability,\n issues: input.issues,\n });\n\n return { source, field };\n};\n\nconst validateRelationPath = (input: {\n relation: ResolvedRelation;\n source: ResolvedSource;\n relationName: string;\n requestedDepth: number;\n fieldPath: string;\n relationCapability: RelationCapability;\n issues: QueryValidationIssue[];\n}) => {\n if (!input.relation[input.relationCapability]) {\n input.issues.push({\n code:\n input.relationCapability === \"filterable\"\n ? \"relation_not_filterable\"\n : \"relation_not_selectable\",\n source: input.source.publicName,\n path: input.fieldPath,\n relation: input.relationName,\n });\n }\n\n if (input.requestedDepth > input.relation.maxDepth) {\n input.issues.push({\n code: \"relation_depth_exceeded\",\n source: input.source.publicName,\n path: input.fieldPath,\n relation: input.relationName,\n requestedDepth: input.requestedDepth,\n maxDepth: input.relation.maxDepth,\n });\n }\n};\n\nconst validateFieldCapability = (input: {\n source: ResolvedSource;\n field: ResolvedField;\n fieldPath: string;\n fieldCapability: FieldCapability;\n issues: QueryValidationIssue[];\n}) => {\n if (input.field[input.fieldCapability]) {\n return;\n }\n\n input.issues.push({\n code: fieldCapabilityIssueCode[input.fieldCapability],\n source: input.source.publicName,\n path: input.fieldPath,\n field: input.field.publicName,\n });\n};\n\nconst fieldCapabilityIssueCode = {\n selectable: \"field_not_selectable\",\n filterable: \"field_not_filterable\",\n sortable: \"field_not_sortable\",\n groupable: \"field_not_groupable\",\n} as const;\n","import { Effect } from \"effect\";\nimport type * as Either from \"effect/Either\";\n\nimport type { JsonValue, QueryFilterOperator, QuerySortDirection } from \"../specs/query.js\";\nimport { ResolvedRegistrySchema } from \"../specs/registries.js\";\nimport type {\n FieldType,\n RelationKind,\n ResolvedRegistry,\n ResolvedSource,\n} from \"../specs/registries.js\";\nimport {\n validateQuerySpecEffect,\n type BoundQueryFilter,\n type ValidateQuerySpecError,\n type ValidateQuerySpecInput,\n} from \"./validate.js\";\n\nexport type LowerQuerySpecInput = ValidateQuerySpecInput;\n\nexport type LowerQuerySpecError = ValidateQuerySpecError;\n\nexport type QueryIR = {\n readonly kind: \"select\";\n readonly source: QueryIRSourceRef;\n readonly select: readonly QueryIRFieldRef[];\n readonly joins: readonly QueryIRJoin[];\n readonly where?: QueryIRFilter | undefined;\n readonly groupBy: readonly QueryIRFieldRef[];\n readonly orderBy: readonly QueryIROrderBy[];\n readonly limit?: number | undefined;\n readonly offset?: number | undefined;\n};\n\nexport type QueryIRSourceRef = {\n readonly publicName: string;\n readonly physicalSource: string;\n};\n\nexport type QueryIRFieldRef = {\n readonly path: string;\n readonly source: QueryIRSourceRef;\n readonly field: {\n readonly publicName: string;\n readonly physicalField: string;\n };\n readonly type: FieldType;\n readonly nullable: boolean;\n};\n\nexport type QueryIRJoin = {\n readonly path: string;\n readonly relation: {\n readonly publicName: string;\n readonly physicalRelation: string;\n };\n readonly kind: RelationKind;\n readonly from: QueryIRSourceRef;\n readonly to: QueryIRSourceRef;\n readonly localFields: readonly string[];\n readonly foreignFields: readonly string[];\n};\n\nexport type QueryIRFilter =\n | {\n readonly and: readonly QueryIRFilter[];\n }\n | {\n readonly or: readonly QueryIRFilter[];\n }\n | {\n readonly field: QueryIRFieldRef;\n readonly op: QueryFilterOperator;\n readonly value?: JsonValue | undefined;\n };\n\nexport type QueryIROrderBy = {\n readonly field: QueryIRFieldRef;\n readonly direction: QuerySortDirection;\n};\n\nexport const lowerQuerySpecToIREffect: (\n input: LowerQuerySpecInput,\n) => Effect.Effect<QueryIR, LowerQuerySpecError> = Effect.fn(\"lowerQuerySpecToIR\")(function* (\n input: LowerQuerySpecInput,\n) {\n const query = yield* validateQuerySpecEffect(input);\n const registry = ResolvedRegistrySchema.parse(input.registry);\n const source = registry.sources[query.source]!;\n const joins = new Map<string, QueryIRJoin>();\n const context: LoweringContext = { registry, joins };\n const where = query.where === undefined ? undefined : lowerFilter(context, source, query.where);\n const select = query.select.map((fieldPath) => lowerFieldPath(context, source, fieldPath));\n const groupBy = (query.groupBy ?? []).map((fieldPath) =>\n lowerFieldPath(context, source, fieldPath),\n );\n const orderBy = (query.orderBy ?? []).map((orderBy) => ({\n field: lowerFieldPath(context, source, orderBy.field),\n direction: orderBy.direction,\n }));\n\n return {\n kind: \"select\",\n source: sourceRef(source),\n select,\n joins: [...joins.values()],\n ...(where === undefined ? {} : { where }),\n groupBy,\n orderBy,\n ...(query.limit === undefined ? {} : { limit: query.limit }),\n ...(query.offset === undefined ? {} : { offset: query.offset }),\n };\n});\n\nexport const lowerQuerySpecToIR = (input: LowerQuerySpecInput): QueryIR =>\n unwrapLowerQuerySpecResult(Effect.runSync(Effect.either(lowerQuerySpecToIREffect(input))));\n\nexport const lowerQuerySpecToIRPromise = async (input: LowerQuerySpecInput): Promise<QueryIR> =>\n unwrapLowerQuerySpecResult(\n await Effect.runPromise(Effect.either(lowerQuerySpecToIREffect(input))),\n );\n\ntype LoweringContext = {\n readonly registry: ResolvedRegistry;\n readonly joins: Map<string, QueryIRJoin>;\n};\n\nconst unwrapLowerQuerySpecResult = (\n result: Either.Either<QueryIR, LowerQuerySpecError>,\n): QueryIR => {\n if (result._tag === \"Left\") {\n throw result.left;\n }\n\n return result.right;\n};\n\nconst lowerFilter = (\n context: LoweringContext,\n source: ResolvedSource,\n filter: BoundQueryFilter,\n): QueryIRFilter => {\n if (\"and\" in filter) {\n return {\n and: filter.and.map((child) => lowerFilter(context, source, child)),\n };\n }\n\n if (\"or\" in filter) {\n return {\n or: filter.or.map((child) => lowerFilter(context, source, child)),\n };\n }\n\n return {\n field: lowerFieldPath(context, source, filter.field),\n op: filter.op,\n ...(filter.value === undefined ? {} : { value: filter.value }),\n };\n};\n\nconst lowerFieldPath = (\n context: LoweringContext,\n source: ResolvedSource,\n fieldPath: string,\n): QueryIRFieldRef => {\n const parts = fieldPath.split(\".\");\n const fieldName = parts.at(-1)!;\n const relationNames = parts.slice(0, -1);\n let currentSource = source;\n const joinPathParts: string[] = [];\n\n for (const relationName of relationNames) {\n const relation = currentSource.relations[relationName]!;\n const targetSource = context.registry.sources[relation.target]!;\n joinPathParts.push(relationName);\n const joinPath = joinPathParts.join(\".\");\n\n if (!context.joins.has(joinPath)) {\n context.joins.set(joinPath, {\n path: joinPath,\n relation: {\n publicName: relation.publicName,\n physicalRelation: relation.physicalRelation,\n },\n kind: relation.kind,\n from: sourceRef(currentSource),\n to: sourceRef(targetSource),\n localFields: relation.localFields,\n foreignFields: relation.foreignFields,\n });\n }\n\n currentSource = targetSource;\n }\n\n const field = currentSource.fields[fieldName]!;\n\n return {\n path: fieldPath,\n source: {\n publicName: currentSource.publicName,\n physicalSource: field.physicalSource,\n },\n field: {\n publicName: field.publicName,\n physicalField: field.physicalField,\n },\n type: field.type,\n nullable: field.nullable,\n };\n};\n\nconst sourceRef = (source: ResolvedSource): QueryIRSourceRef => ({\n publicName: source.publicName,\n physicalSource: source.physicalSource,\n});\n","import type { SQLDialectCompiler } from \"../types.js\";\n\nexport const mysqlDialectCompiler: SQLDialectCompiler = {\n dialect: \"mysql\",\n quoteIdentifier: (identifier) => `\\`${identifier.replaceAll(\"`\", \"``\")}\\``,\n placeholder: () => \"?\",\n likeEscapeSql: \" escape '\\\\\\\\'\",\n};\n","import type { SQLDialectCompiler } from \"../types.js\";\n\nexport const postgresDialectCompiler: SQLDialectCompiler = {\n dialect: \"postgres\",\n quoteIdentifier: (identifier) => `\"${identifier.replaceAll('\"', '\"\"')}\"`,\n placeholder: (index) => `$${index}`,\n likeEscapeSql: \" escape '\\\\'\",\n};\n","import type { SQLDialectCompiler } from \"../types.js\";\n\nexport const sqliteDialectCompiler: SQLDialectCompiler = {\n dialect: \"sqlite\",\n quoteIdentifier: (identifier) => `\"${identifier.replaceAll('\"', '\"\"')}\"`,\n placeholder: () => \"?\",\n likeEscapeSql: \" escape '\\\\'\",\n};\n","import { Effect } from \"effect\";\nimport type * as Either from \"effect/Either\";\n\nimport {\n lowerQuerySpecToIREffect,\n type LowerQuerySpecError,\n type LowerQuerySpecInput,\n type QueryIR,\n type QueryIRFieldRef,\n type QueryIRFilter,\n} from \"../../query/lower.js\";\nimport type { JsonValue, QueryFilterOperator } from \"../../specs/query.js\";\nimport { mysqlDialectCompiler } from \"./dialects/mysql.js\";\nimport { postgresDialectCompiler } from \"./dialects/postgres.js\";\nimport { sqliteDialectCompiler } from \"./dialects/sqlite.js\";\nimport type { SQLDialect, SQLDialectCompiler, SQLPlan } from \"./types.js\";\n\nexport type { SQLDialect, SQLPlan } from \"./types.js\";\n\nexport type CompileQuerySpecToSQLInput = LowerQuerySpecInput & {\n readonly dialect?: SQLDialect;\n};\n\nexport type CompileQuerySpecToSQLError = LowerQuerySpecError;\n\nexport const compileQuerySpecToSQLEffect: (\n input: CompileQuerySpecToSQLInput,\n) => Effect.Effect<SQLPlan, CompileQuerySpecToSQLError> = Effect.fn(\"compileQuerySpecToSQL\")(\n function* (input: CompileQuerySpecToSQLInput) {\n const ir = yield* lowerQuerySpecToIREffect(input);\n\n return compileIRToSQL(ir, dialectCompilerFor(input.dialect ?? \"mysql\"));\n },\n);\n\nexport const compileQuerySpecToSQL = (input: CompileQuerySpecToSQLInput): SQLPlan =>\n unwrapCompileQuerySpecToSQLResult(\n Effect.runSync(Effect.either(compileQuerySpecToSQLEffect(input))),\n );\n\nexport const compileQuerySpecToSQLPromise = async (\n input: CompileQuerySpecToSQLInput,\n): Promise<SQLPlan> =>\n unwrapCompileQuerySpecToSQLResult(\n await Effect.runPromise(Effect.either(compileQuerySpecToSQLEffect(input))),\n );\n\ntype SQLCompileContext = {\n readonly compiler: SQLDialectCompiler;\n readonly params: JsonValue[];\n readonly aliasesByPath: Map<string, string>;\n};\n\nconst dialectCompilers = {\n mysql: mysqlDialectCompiler,\n postgres: postgresDialectCompiler,\n sqlite: sqliteDialectCompiler,\n} satisfies Record<SQLDialect, SQLDialectCompiler>;\n\nconst dialectCompilerFor = (dialect: SQLDialect): SQLDialectCompiler => dialectCompilers[dialect];\n\nconst unwrapCompileQuerySpecToSQLResult = (\n result: Either.Either<SQLPlan, CompileQuerySpecToSQLError>,\n): SQLPlan => {\n if (result._tag === \"Left\") {\n throw result.left;\n }\n\n return result.right;\n};\n\nconst compileIRToSQL = (ir: QueryIR, compiler: SQLDialectCompiler): SQLPlan => {\n const context: SQLCompileContext = {\n compiler,\n params: [],\n aliasesByPath: new Map([[\"\", \"t0\"]]),\n };\n\n ir.joins.forEach((join, index) => {\n context.aliasesByPath.set(join.path, `t${index + 1}`);\n });\n\n const sqlParts = [\n compileSelect(ir, context),\n `from ${quoteIdentifier(context, ir.source.physicalSource)} as ${quoteIdentifier(context, \"t0\")}`,\n ...ir.joins.map((join) => {\n const fromAlias = aliasForPath(context, parentPath(join.path));\n const toAlias = aliasForPath(context, join.path);\n const on = join.localFields\n .map(\n (localField, index) =>\n `${quoteIdentifier(context, fromAlias)}.${quoteIdentifier(context, localField)} = ${quoteIdentifier(\n context,\n toAlias,\n )}.${quoteIdentifier(context, join.foreignFields[index]!)}`,\n )\n .join(\" and \");\n\n return `left join ${quoteIdentifier(context, join.to.physicalSource)} as ${quoteIdentifier(\n context,\n toAlias,\n )} on ${on}`;\n }),\n ...(ir.where === undefined ? [] : [`where ${compileFilter(context, ir.where)}`]),\n ...(ir.groupBy.length === 0\n ? []\n : [`group by ${ir.groupBy.map((field) => compileFieldRef(context, field)).join(\", \")}`]),\n ...(ir.orderBy.length === 0\n ? []\n : [\n `order by ${ir.orderBy\n .map((orderBy) => `${compileFieldRef(context, orderBy.field)} ${orderBy.direction}`)\n .join(\", \")}`,\n ]),\n ...(ir.limit === undefined ? [] : [`limit ${addParam(context, ir.limit)}`]),\n ...(ir.offset === undefined ? [] : [`offset ${addParam(context, ir.offset)}`]),\n ];\n\n return {\n dialect: compiler.dialect,\n sql: sqlParts.join(\"\\n\"),\n params: context.params,\n };\n};\n\nconst compileSelect = (ir: QueryIR, context: SQLCompileContext): string =>\n `select ${ir.select\n .map((field) => `${compileFieldRef(context, field)} as ${quoteIdentifier(context, field.path)}`)\n .join(\", \")}`;\n\nconst compileFilter = (context: SQLCompileContext, filter: QueryIRFilter): string => {\n if (\"and\" in filter) {\n return filter.and.map((child) => `(${compileFilter(context, child)})`).join(\" and \");\n }\n\n if (\"or\" in filter) {\n return filter.or.map((child) => `(${compileFilter(context, child)})`).join(\" or \");\n }\n\n return compilePredicate(context, filter.field, filter.op, filter.value);\n};\n\nconst compilePredicate = (\n context: SQLCompileContext,\n field: QueryIRFieldRef,\n operator: QueryFilterOperator,\n value: JsonValue | undefined,\n): string => {\n const fieldRef = compileFieldRef(context, field);\n\n switch (operator) {\n case \"eq\":\n if (value === null) {\n return `${fieldRef} is null`;\n }\n return `${fieldRef} = ${addParam(context, value ?? null)}`;\n case \"neq\":\n if (value === null) {\n return `${fieldRef} is not null`;\n }\n return `${fieldRef} <> ${addParam(context, value ?? null)}`;\n case \"gt\":\n return `${fieldRef} > ${addParam(context, value ?? null)}`;\n case \"gte\":\n return `${fieldRef} >= ${addParam(context, value ?? null)}`;\n case \"lt\":\n return `${fieldRef} < ${addParam(context, value ?? null)}`;\n case \"lte\":\n return `${fieldRef} <= ${addParam(context, value ?? null)}`;\n case \"in\":\n return `${fieldRef} in (${compileInList(context, value)})`;\n case \"contains\":\n return `${fieldRef} like ${addParam(\n context,\n `%${escapeLikePattern(stringValue(value))}%`,\n )}${context.compiler.likeEscapeSql}`;\n case \"startsWith\":\n return `${fieldRef} like ${addParam(\n context,\n `${escapeLikePattern(stringValue(value))}%`,\n )}${context.compiler.likeEscapeSql}`;\n case \"endsWith\":\n return `${fieldRef} like ${addParam(\n context,\n `%${escapeLikePattern(stringValue(value))}`,\n )}${context.compiler.likeEscapeSql}`;\n case \"isNull\":\n return `${fieldRef} is null`;\n case \"isNotNull\":\n return `${fieldRef} is not null`;\n }\n};\n\nconst compileInList = (context: SQLCompileContext, value: JsonValue | undefined): string => {\n if (!Array.isArray(value) || value.length === 0) {\n return \"null\";\n }\n\n return value.map((item) => addParam(context, item)).join(\", \");\n};\n\nconst compileFieldRef = (context: SQLCompileContext, field: QueryIRFieldRef): string => {\n const fieldRelationPath = parentPath(field.path);\n const alias = aliasForPath(context, fieldRelationPath);\n\n return `${quoteIdentifier(context, alias)}.${quoteIdentifier(context, field.field.physicalField)}`;\n};\n\nconst addParam = (context: SQLCompileContext, value: JsonValue): string => {\n context.params.push(value);\n return context.compiler.placeholder(context.params.length);\n};\n\nconst aliasForPath = (context: SQLCompileContext, path: string): string =>\n context.aliasesByPath.get(path)!;\n\nconst parentPath = (path: string): string => {\n const parts = path.split(\".\");\n parts.pop();\n\n return parts.join(\".\");\n};\n\nconst quoteIdentifier = (context: SQLCompileContext, identifier: string): string =>\n context.compiler.quoteIdentifier(identifier);\n\nconst stringValue = (value: JsonValue | undefined): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n};\n\nconst escapeLikePattern = (value: string): string => value.replaceAll(/([\\\\%_])/g, \"\\\\$1\");\n","import { z } from \"zod\";\n\nimport type { QueryIR, QueryIRFieldRef } from \"../query/lower.js\";\nimport { JsonValueSchema } from \"../specs/query.js\";\nimport type { FieldType } from \"../specs/registries.js\";\n\nexport type QueryResultRow = Record<string, unknown>;\nexport type QueryResultRows = readonly QueryResultRow[];\n\nexport const buildQueryIRRowSchema = (ir: QueryIR) => {\n const shape: Record<string, z.ZodType> = {};\n\n for (const field of ir.select) {\n shape[field.path] = fieldSchemaForOutput(field);\n }\n\n return z.object(shape).strict();\n};\n\nexport const buildQueryIRResultSchema = (ir: QueryIR) => z.array(buildQueryIRRowSchema(ir));\n\nexport const parseQueryIRResultRows = (ir: QueryIR, rows: unknown): QueryResultRows =>\n buildQueryIRResultSchema(ir).parse(rows);\n\nexport const safeParseQueryIRResultRows = (ir: QueryIR, rows: unknown) =>\n buildQueryIRResultSchema(ir).safeParse(rows);\n\nconst fieldSchemaForOutput = (field: QueryIRFieldRef): z.ZodType => {\n const schema = fieldTypeSchema(field.type);\n\n if (field.nullable || isRelationPath(field.path)) {\n return schema.nullable();\n }\n\n return schema;\n};\n\nconst fieldTypeSchema = (type: FieldType): z.ZodType => {\n switch (type) {\n case \"string\":\n case \"enum\":\n return z.string();\n case \"number\":\n return z.number();\n case \"boolean\":\n return z.boolean();\n case \"date\":\n case \"datetime\":\n return z.union([z.string(), z.date()]);\n case \"json\":\n return JsonValueSchema;\n case \"unknown\":\n return z.unknown();\n }\n};\n\nconst isRelationPath = (path: string): boolean => path.includes(\".\");\n","import type { QueryIR } from \"./query/lower.js\";\nimport { lowerQuerySpecToIRPromise } from \"./query/lower.js\";\nimport type { ResolveRegistryError } from \"./registry/resolve.js\";\nimport { resolveRegistryPromise } from \"./registry/resolve.js\";\nimport { parseQueryIRResultRows, type QueryResultRows } from \"./results/schema.js\";\nimport type { QueryParams } from \"./specs/query.js\";\nimport type { ResolvedRegistry } from \"./specs/registries.js\";\nimport type { CompileQuerySpecToSQLError } from \"./compiler/sql/index.js\";\nimport { compileQuerySpecToSQLPromise } from \"./compiler/sql/index.js\";\nimport type { SQLDialect, SQLPlan } from \"./compiler/sql/types.js\";\n\nexport type QueryRuntimeExecutor<TDb, TResult = unknown> = (input: {\n readonly db: TDb;\n readonly plan: SQLPlan;\n}) => TResult | Promise<TResult>;\n\nexport type CreateQueryRuntimeInput<TDb, TResult = unknown> = {\n readonly db: TDb;\n readonly physicalRegistry: unknown;\n readonly defaults?: unknown;\n readonly policy?: unknown;\n readonly policies?: readonly unknown[] | undefined;\n readonly dialect?: SQLDialect | undefined;\n readonly executor: QueryRuntimeExecutor<TDb, TResult>;\n};\n\nexport type QueryRuntimeRunInputBase = {\n readonly spec: unknown;\n readonly params?: QueryParams | undefined;\n};\n\nexport type QueryRuntimeRunInput = QueryRuntimeRunInputBase & {\n readonly explain?: boolean | undefined;\n};\n\nexport type QueryRuntimeRunInputWithExplain = QueryRuntimeRunInputBase & {\n readonly explain: true;\n};\n\nexport type QueryRuntimeRunInputWithoutExplain = QueryRuntimeRunInputBase & {\n readonly explain?: false | undefined;\n};\n\nexport type QueryRuntimeExplain = {\n readonly registry: ResolvedRegistry;\n readonly ir: QueryIR;\n readonly sqlPlan: SQLPlan;\n};\n\nexport type QueryRuntimeResult = {\n readonly rows: QueryResultRows;\n};\n\nexport type QueryRuntimeResultWithExplain = QueryRuntimeResult & {\n readonly explain: QueryRuntimeExplain;\n};\n\nexport type QueryRuntimeRunError = ResolveRegistryError | CompileQuerySpecToSQLError;\n\nexport type QueryRuntime = {\n run(input: QueryRuntimeRunInputWithExplain): Promise<QueryRuntimeResultWithExplain>;\n run(input: QueryRuntimeRunInputWithoutExplain): Promise<QueryRuntimeResult>;\n run(input: QueryRuntimeRunInput): Promise<QueryRuntimeResult | QueryRuntimeResultWithExplain>;\n};\n\nexport const createQueryRuntime = <TDb, TResult = unknown>(\n input: CreateQueryRuntimeInput<TDb, TResult>,\n): QueryRuntime => {\n async function run(\n input: QueryRuntimeRunInputWithExplain,\n ): Promise<QueryRuntimeResultWithExplain>;\n async function run(input: QueryRuntimeRunInputWithoutExplain): Promise<QueryRuntimeResult>;\n async function run(\n input: QueryRuntimeRunInput,\n ): Promise<QueryRuntimeResult | QueryRuntimeResultWithExplain>;\n async function run(\n runInput: QueryRuntimeRunInput,\n ): Promise<QueryRuntimeResult | QueryRuntimeResultWithExplain> {\n const registry = await resolveRegistryPromise({\n physical: input.physicalRegistry,\n ...(input.defaults === undefined ? {} : { defaults: input.defaults }),\n ...(input.policy === undefined ? {} : { policy: input.policy }),\n ...(input.policies === undefined ? {} : { policies: input.policies }),\n });\n const queryInput = {\n query: runInput.spec,\n registry,\n params: runInput.params,\n };\n const ir = await lowerQuerySpecToIRPromise(queryInput);\n const sqlPlan = await compileQuerySpecToSQLPromise({\n ...queryInput,\n ...(input.dialect === undefined ? {} : { dialect: input.dialect }),\n });\n const result = await input.executor({ db: input.db, plan: sqlPlan });\n const rows = parseQueryIRResultRows(ir, result);\n\n if (runInput.explain === true) {\n return {\n rows,\n explain: {\n registry,\n ir,\n sqlPlan,\n },\n };\n }\n\n return { rows };\n }\n\n return { run };\n};\n","export const queryKitVersion = \"0.0.2-alpha.0\";\n\nexport {\n JsonValueSchema,\n parseQuerySpec,\n QueryParamRefSchema,\n QueryParamsSchema,\n QueryFilterOperatorSchema,\n QueryFilterSchema,\n QueryOrderBySchema,\n QuerySortDirectionSchema,\n QuerySpecSchema,\n QueryVersionSchema,\n safeParseQuerySpec,\n} from \"./specs/query.js\";\nexport type {\n JsonValue,\n QueryLimitValue,\n QueryParamRef,\n QueryParams,\n QueryValue,\n QueryFilter,\n QueryFilterOperator,\n QueryOrderBy,\n QuerySortDirection,\n QuerySpec,\n} from \"./specs/query.js\";\n\nexport {\n AdapterMetaSchema,\n AggregationSchema,\n ExposureModeSchema,\n FieldDefaultsSchema,\n FieldPolicySchema,\n FieldTypeSchema,\n parsePhysicalRegistry,\n parseRegistryDefaults,\n parseRegistryPolicy,\n parseResolvedRegistry,\n PhysicalFieldSchema,\n PhysicalRegistrySchema,\n PhysicalRelationSchema,\n PhysicalSourceKindSchema,\n PhysicalSourceSchema,\n RegistryDefaultsSchema,\n RegistryPolicySchema,\n RegistryVersionSchema,\n RelationDefaultsSchema,\n RelationKindSchema,\n RelationPolicySchema,\n ResolvedFieldSchema,\n ResolvedRegistrySchema,\n ResolvedRelationSchema,\n ResolvedSourceSchema,\n safeParsePhysicalRegistry,\n safeParseRegistryDefaults,\n safeParseRegistryPolicy,\n safeParseResolvedRegistry,\n SourceDefaultsSchema,\n SourcePolicySchema,\n} from \"./specs/registries.js\";\nexport type {\n Aggregation,\n FieldPolicy,\n FieldType,\n PhysicalRegistryLike,\n PhysicalField,\n PhysicalRegistry,\n PhysicalRelation,\n PhysicalSource,\n PhysicalSourceLike,\n Policy,\n PolicySource,\n RegistryDefaults,\n RegistryPolicy,\n RelationPolicy,\n ResolvedField,\n ResolvedRegistry,\n ResolvedRelation,\n ResolvedSource,\n SourcePolicy,\n} from \"./specs/registries.js\";\n\nexport {\n RegistryParseError,\n RegistryResolutionError,\n RegistryResolutionIssueSchema,\n resolveRegistry,\n resolveRegistryEffect,\n resolveRegistryPromise,\n} from \"./registry/resolve.js\";\nexport type {\n RegistryResolutionIssue,\n ResolveRegistryError,\n ResolveRegistryInput,\n} from \"./registry/resolve.js\";\n\nexport {\n QueryParseError,\n QueryValidationError,\n QueryValidationIssueSchema,\n validateQuerySpec,\n validateQuerySpecEffect,\n validateQuerySpecPromise,\n} from \"./query/validate.js\";\nexport type {\n QueryValidationIssue,\n ValidateQuerySpecError,\n ValidateQuerySpecInput,\n ValidatedQuerySpec,\n} from \"./query/validate.js\";\n\nexport {\n lowerQuerySpecToIR,\n lowerQuerySpecToIREffect,\n lowerQuerySpecToIRPromise,\n} from \"./query/lower.js\";\nexport type {\n LowerQuerySpecError,\n LowerQuerySpecInput,\n QueryIR,\n QueryIRFieldRef,\n QueryIRFilter,\n QueryIRJoin,\n QueryIROrderBy,\n QueryIRSourceRef,\n} from \"./query/lower.js\";\n\nexport {\n compileQuerySpecToSQL,\n compileQuerySpecToSQLEffect,\n compileQuerySpecToSQLPromise,\n} from \"./compiler/sql/index.js\";\nexport type {\n CompileQuerySpecToSQLError,\n CompileQuerySpecToSQLInput,\n SQLDialect,\n SQLPlan,\n} from \"./compiler/sql/index.js\";\n\nexport {\n buildQueryIRResultSchema,\n buildQueryIRRowSchema,\n parseQueryIRResultRows,\n safeParseQueryIRResultRows,\n} from \"./results/schema.js\";\nexport type { QueryResultRow, QueryResultRows } from \"./results/schema.js\";\n\nexport { createQueryRuntime } from \"./runtime.js\";\nexport type {\n CreateQueryRuntimeInput,\n QueryRuntime,\n QueryRuntimeExecutor,\n QueryRuntimeExplain,\n QueryRuntimeResult,\n QueryRuntimeResultWithExplain,\n QueryRuntimeRunError,\n QueryRuntimeRunInput,\n QueryRuntimeRunInputBase,\n QueryRuntimeRunInputWithExplain,\n QueryRuntimeRunInputWithoutExplain,\n} from \"./runtime.js\";\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ypanagidis/joqi",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Registry-backed JSON query compiler for TypeScript apps.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"type": "module",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./effect": {
|
|
17
|
+
"types": "./dist/effect.d.ts",
|
|
18
|
+
"import": "./dist/effect.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public",
|
|
23
|
+
"tag": "latest"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsdown",
|
|
27
|
+
"dev": "tsdown --watch",
|
|
28
|
+
"test": "vitest run --passWithNoTests",
|
|
29
|
+
"typecheck": "tsgo --noEmit"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"effect": "3.21.2",
|
|
33
|
+
"zod": "4.4.3"
|
|
34
|
+
}
|
|
35
|
+
}
|