adorn-api 1.0.11 → 1.0.13
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 +318 -620
- package/dist/adapter/express/auth.d.ts +5 -0
- package/dist/adapter/express/auth.d.ts.map +1 -0
- package/dist/adapter/express/bootstrap.d.ts.map +1 -1
- package/dist/adapter/express/coercion.d.ts +22 -0
- package/dist/adapter/express/coercion.d.ts.map +1 -0
- package/dist/adapter/express/index.d.ts +3 -50
- package/dist/adapter/express/index.d.ts.map +1 -1
- package/dist/adapter/express/merge.d.ts +0 -3
- package/dist/adapter/express/merge.d.ts.map +1 -1
- package/dist/adapter/express/openapi.d.ts +11 -0
- package/dist/adapter/express/openapi.d.ts.map +1 -0
- package/dist/adapter/express/router.d.ts +4 -0
- package/dist/adapter/express/router.d.ts.map +1 -0
- package/dist/adapter/express/swagger.d.ts +4 -0
- package/dist/adapter/express/swagger.d.ts.map +1 -0
- package/dist/adapter/express/types.d.ts +64 -0
- package/dist/adapter/express/types.d.ts.map +1 -0
- package/dist/adapter/express/validation.d.ts +10 -0
- package/dist/adapter/express/validation.d.ts.map +1 -0
- package/dist/cli.cjs +1003 -434
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1003 -434
- package/dist/cli.js.map +1 -1
- package/dist/compiler/analyze/scanControllers.d.ts +0 -1
- package/dist/compiler/analyze/scanControllers.d.ts.map +1 -1
- package/dist/compiler/cache/isStale.d.ts.map +1 -1
- package/dist/compiler/cache/writeCache.d.ts.map +1 -1
- package/dist/compiler/manifest/emit.d.ts.map +1 -1
- package/dist/compiler/manifest/format.d.ts +1 -1
- package/dist/compiler/manifest/format.d.ts.map +1 -1
- package/dist/compiler/schema/intersectionHandler.d.ts +7 -0
- package/dist/compiler/schema/intersectionHandler.d.ts.map +1 -0
- package/dist/compiler/schema/objectHandler.d.ts +20 -0
- package/dist/compiler/schema/objectHandler.d.ts.map +1 -0
- package/dist/compiler/schema/openapi.d.ts +1 -1
- package/dist/compiler/schema/openapi.d.ts.map +1 -1
- package/dist/compiler/schema/parameters.d.ts +18 -0
- package/dist/compiler/schema/parameters.d.ts.map +1 -0
- package/dist/compiler/schema/primitives.d.ts +10 -0
- package/dist/compiler/schema/primitives.d.ts.map +1 -0
- package/dist/compiler/schema/typeToJsonSchema.d.ts +3 -46
- package/dist/compiler/schema/typeToJsonSchema.d.ts.map +1 -1
- package/dist/compiler/schema/types.d.ts +54 -0
- package/dist/compiler/schema/types.d.ts.map +1 -0
- package/dist/compiler/schema/unionHandler.d.ts +10 -0
- package/dist/compiler/schema/unionHandler.d.ts.map +1 -0
- package/dist/decorators/index.d.ts +0 -1
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/express.cjs +522 -502
- package/dist/express.cjs.map +1 -1
- package/dist/express.js +522 -502
- package/dist/express.js.map +1 -1
- package/dist/http.d.ts +1 -10
- package/dist/http.d.ts.map +1 -1
- package/dist/index.cjs +3 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -34
- package/dist/index.js.map +1 -1
- package/dist/metal/applyListQuery.d.ts +27 -0
- package/dist/metal/applyListQuery.d.ts.map +1 -0
- package/dist/metal/index.cjs +61 -2
- package/dist/metal/index.cjs.map +1 -1
- package/dist/metal/index.d.ts +4 -0
- package/dist/metal/index.d.ts.map +1 -1
- package/dist/metal/index.js +57 -2
- package/dist/metal/index.js.map +1 -1
- package/dist/metal/listQuery.d.ts +7 -0
- package/dist/metal/listQuery.d.ts.map +1 -0
- package/dist/metal/queryOptions.d.ts +8 -0
- package/dist/metal/queryOptions.d.ts.map +1 -0
- package/dist/metal/registerMetalEntities.d.ts.map +1 -1
- package/dist/runtime/metadata/types.d.ts +0 -3
- package/dist/runtime/metadata/types.d.ts.map +1 -1
- package/package.json +4 -1
- package/dist/compiler/analyze/extractQueryStyle.d.ts +0 -8
- package/dist/compiler/analyze/extractQueryStyle.d.ts.map +0 -1
- package/dist/decorators/Paginated.d.ts +0 -5
- package/dist/decorators/Paginated.d.ts.map +0 -1
package/dist/metal/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metal/index.ts","../../src/metal/symbolMetadata.ts","../../src/metal/readMetalBag.ts","../../src/metal/schemaFromEntity.ts","../../src/metal/registerMetalEntities.ts"],"sourcesContent":["export { ensureSymbolMetadata } from \"./symbolMetadata.js\";\nexport { readMetalDecoratorBagFromConstructor, METAL_METADATA_KEY } from \"./readMetalBag.js\";\nexport { schemaFromEntity } from \"./schemaFromEntity.js\";\nexport { registerMetalEntities } from \"./registerMetalEntities.js\";\n\nexport type { SchemaFromEntityOptions, EntitySchemaMode, JsonSchema } from \"./schemaFromEntity.js\";\nexport type { SearchWhere, SearchWhereDepth, SearchWhereOptions, SearchWherePath } from \"./searchWhere.js\";\n","export function ensureSymbolMetadata(): symbol {\n const s = Symbol as unknown as { metadata?: symbol };\n if (!s.metadata) {\n s.metadata = Symbol(\"Symbol.metadata\");\n }\n return s.metadata;\n}\n","import { ensureSymbolMetadata } from \"./symbolMetadata.js\";\n\nexport const METAL_METADATA_KEY = \"metal-orm:decorators\";\n\nexport type MetalColumnDef = {\n type: string;\n args?: unknown[];\n dialectTypes?: unknown;\n notNull?: boolean;\n primary?: boolean;\n tsType?: unknown;\n unique?: boolean;\n default?: unknown;\n autoIncrement?: boolean;\n generated?: unknown;\n check?: unknown;\n references?: unknown;\n comment?: string;\n};\n\nexport type MetalRelationMetadata = {\n kind: string;\n propertyKey: string;\n target?: (...args: any[]) => any;\n};\n\nexport type MetalDecoratorBag = {\n columns: Array<{ propertyName: string; column: MetalColumnDef }>;\n relations: Array<{ propertyName: string; relation: MetalRelationMetadata }>;\n};\n\nexport function readMetalDecoratorBagFromConstructor(ctor: object): MetalDecoratorBag | undefined {\n const metadataSymbol = ensureSymbolMetadata();\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METAL_METADATA_KEY] as MetalDecoratorBag | undefined;\n}\n","import { readMetalDecoratorBagFromConstructor, type MetalColumnDef, type MetalDecoratorBag } from \"./readMetalBag.js\";\n\nexport type JsonSchema = Record<string, any>;\n\nexport type EntitySchemaMode = \"read\" | \"create\" | \"update\";\n\nexport interface SchemaFromEntityOptions {\n name?: string;\n stripEntitySuffix?: boolean;\n mode?: EntitySchemaMode;\n additionalProperties?: boolean;\n includeRelations?: \"none\" | \"inline\";\n}\n\nfunction defaultSchemaName(ctor: Function, strip: boolean) {\n const raw = ctor.name || \"AnonymousEntity\";\n return strip ? raw.replace(/Entity$/i, \"\") || raw : raw;\n}\n\nfunction columnTypeToSchema(col: MetalColumnDef): JsonSchema {\n const t = String(col.type).toLowerCase();\n const s: JsonSchema = {};\n\n if ([\"varchar\", \"text\", \"string\", \"char\", \"citext\"].includes(t)) {\n s.type = \"string\";\n const a0 = Array.isArray(col.args) ? col.args[0] : undefined;\n if (typeof a0 === \"number\" && Number.isFinite(a0) && a0 > 0) s.maxLength = a0;\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"uuid\"].includes(t)) {\n s.type = \"string\";\n s.format = \"uuid\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"timestamp\", \"timestamptz\", \"datetime\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date-time\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n if ([\"date\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bool\", \"boolean\"].includes(t)) {\n s.type = \"boolean\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"int\", \"int4\", \"integer\", \"smallint\", \"int2\", \"serial\", \"bigserial\"].includes(t)) {\n s.type = \"integer\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bigint\", \"int8\"].includes(t)) {\n s.type = \"string\";\n s.format = \"int64\";\n s.pattern = \"^-?\\\\d+$\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"float\", \"float4\", \"float8\", \"double\", \"decimal\", \"numeric\", \"real\"].includes(t)) {\n s.type = \"number\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"json\", \"jsonb\"].includes(t)) {\n s.type = [\"object\", \"array\", \"string\", \"number\", \"boolean\", \"null\"];\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n s.type = \"string\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n}\n\nfunction isLiteralDefault(v: unknown) {\n return v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v);\n}\n\nfunction makeNullable(schema: JsonSchema): JsonSchema {\n if (schema.type === \"null\") return schema;\n if (Array.isArray(schema.type)) {\n if (!schema.type.includes(\"null\")) schema.type = [...schema.type, \"null\"];\n return schema;\n }\n if (typeof schema.type === \"string\") {\n schema.type = [schema.type, \"null\"];\n } else {\n schema.type = [\"null\"];\n }\n return schema;\n}\n\nfunction isGenerated(col: MetalColumnDef) {\n return !!col.primary || !!col.autoIncrement || col.generated != null;\n}\n\nfunction shouldIncludeColumn(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"read\") return true;\n if (mode === \"create\") return !isGenerated(col);\n if (mode === \"update\") return true;\n return true;\n}\n\nfunction shouldRequire(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"update\") return false;\n if (!col.notNull) return false;\n if (mode === \"create\" && col.default != null) return false;\n return true;\n}\n\nexport function schemaFromEntity(ctor: Function, opts: SchemaFromEntityOptions = {}): JsonSchema | undefined {\n const bag = readMetalDecoratorBagFromConstructor(ctor);\n if (!bag || !Array.isArray(bag.columns) || bag.columns.length === 0) return undefined;\n\n const mode = opts.mode ?? \"read\";\n const name = opts.name ?? defaultSchemaName(ctor, opts.stripEntitySuffix ?? true);\n\n const schema: JsonSchema = {\n title: name,\n type: \"object\",\n properties: {},\n additionalProperties: opts.additionalProperties ?? true\n };\n\n const required: string[] = [];\n\n for (const entry of bag.columns) {\n const prop = entry.propertyName;\n const col = entry.column;\n\n if (!shouldIncludeColumn(col, mode)) continue;\n\n const propSchema = columnTypeToSchema(col);\n\n if (!col.notNull) makeNullable(propSchema);\n\n if (isLiteralDefault(col.default)) propSchema.default = col.default;\n\n if (mode === \"read\" && col.primary) propSchema.readOnly = true;\n\n (schema.properties as any)[prop] = propSchema;\n\n if (shouldRequire(col, mode)) required.push(prop);\n }\n\n if (required.length) schema.required = required;\n\n if ((opts.includeRelations ?? \"none\") === \"inline\") {\n for (const r of bag.relations ?? []) {\n const rel = r.relation;\n if (typeof rel?.target !== \"function\") continue;\n\n let target: any;\n try {\n target = rel.target();\n } catch {\n continue;\n }\n if (typeof target !== \"function\") continue;\n\n const targetName = defaultSchemaName(target, true);\n (schema.properties as any)[r.propertyName] = { $ref: `#/components/schemas/${targetName}` };\n }\n }\n\n return schema;\n}\n","import { schemaFromEntity, type SchemaFromEntityOptions, type JsonSchema } from \"./schemaFromEntity.js\";\n\nfunction deepMerge(a: any, b: any): any {\n if (Array.isArray(a) || Array.isArray(b)) return b ?? a;\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n const out: any = { ...a };\n for (const [k, v] of Object.entries(b)) out[k] = deepMerge(out[k], v);\n return out;\n }\n return b ?? a;\n}\n\nexport interface RegisterMetalEntitiesOptions extends SchemaFromEntityOptions {\n merge?: \"override\" | \"merge\";\n}\n\nexport function registerMetalEntities(\n openapi: any,\n entities: Function[],\n opts: RegisterMetalEntitiesOptions = {}\n) {\n openapi.components ??= {};\n openapi.components.schemas ??= {};\n\n const mergeMode = opts.merge ?? \"merge\";\n\n for (const ctor of entities) {\n const s = schemaFromEntity(ctor, opts);\n if (!s) continue;\n\n const name = s.title || ctor.name;\n const existing = openapi.components.schemas[name];\n\n if (!existing || mergeMode === \"override\") {\n openapi.components.schemas[name] = s;\n } else {\n openapi.components.schemas[name] = deepMerge(existing, s);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/metal/index.ts","../../src/metal/symbolMetadata.ts","../../src/metal/readMetalBag.ts","../../src/metal/schemaFromEntity.ts","../../src/metal/registerMetalEntities.ts","../../src/metal/applyListQuery.ts"],"sourcesContent":["export { ensureSymbolMetadata } from \"./symbolMetadata.js\";\nexport { readMetalDecoratorBagFromConstructor, METAL_METADATA_KEY } from \"./readMetalBag.js\";\nexport { schemaFromEntity } from \"./schemaFromEntity.js\";\nexport { registerMetalEntities } from \"./registerMetalEntities.js\";\nexport type { ListQuery } from \"./listQuery.js\";\nexport { applyListQuery, normalizeSort, pagedOptions, parseSort } from \"./applyListQuery.js\";\n\nexport type { SchemaFromEntityOptions, EntitySchemaMode, JsonSchema } from \"./schemaFromEntity.js\";\nexport type { SearchWhere, SearchWhereDepth, SearchWhereOptions, SearchWherePath } from \"./searchWhere.js\";\nexport type { QueryOptions } from \"./queryOptions.js\";\n\nexport type { SortDirection, SortToken, ParseSortOptions } from \"./applyListQuery.js\";\n","export function ensureSymbolMetadata(): symbol {\n const s = Symbol as unknown as { metadata?: symbol };\n if (!s.metadata) {\n s.metadata = Symbol(\"Symbol.metadata\");\n }\n return s.metadata;\n}\n","import { ensureSymbolMetadata } from \"./symbolMetadata.js\";\n\nexport const METAL_METADATA_KEY = \"metal-orm:decorators\";\n\nexport type MetalColumnDef = {\n type: string;\n args?: unknown[];\n dialectTypes?: unknown;\n notNull?: boolean;\n primary?: boolean;\n tsType?: unknown;\n unique?: boolean;\n default?: unknown;\n autoIncrement?: boolean;\n generated?: unknown;\n check?: unknown;\n references?: unknown;\n comment?: string;\n};\n\nexport type MetalRelationMetadata = {\n kind: string;\n propertyKey: string;\n target?: (...args: any[]) => any;\n};\n\nexport type MetalDecoratorBag = {\n columns: Array<{ propertyName: string; column: MetalColumnDef }>;\n relations: Array<{ propertyName: string; relation: MetalRelationMetadata }>;\n};\n\nexport function readMetalDecoratorBagFromConstructor(ctor: object): MetalDecoratorBag | undefined {\n const metadataSymbol = ensureSymbolMetadata();\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METAL_METADATA_KEY] as MetalDecoratorBag | undefined;\n}\n","import { readMetalDecoratorBagFromConstructor, type MetalColumnDef } from \"./readMetalBag.js\";\n\nexport type JsonSchema = Record<string, any>;\n\nexport type EntitySchemaMode = \"read\" | \"create\" | \"update\";\n\nexport interface SchemaFromEntityOptions {\n name?: string;\n stripEntitySuffix?: boolean;\n mode?: EntitySchemaMode;\n additionalProperties?: boolean;\n includeRelations?: \"none\" | \"inline\";\n}\n\nfunction defaultSchemaName(ctor: Function, strip: boolean) {\n const raw = ctor.name || \"AnonymousEntity\";\n return strip ? raw.replace(/Entity$/i, \"\") || raw : raw;\n}\n\nfunction columnTypeToSchema(col: MetalColumnDef): JsonSchema {\n const t = String(col.type).toLowerCase();\n const s: JsonSchema = {};\n\n if ([\"varchar\", \"text\", \"string\", \"char\", \"citext\"].includes(t)) {\n s.type = \"string\";\n const a0 = Array.isArray(col.args) ? col.args[0] : undefined;\n if (typeof a0 === \"number\" && Number.isFinite(a0) && a0 > 0) s.maxLength = a0;\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"uuid\"].includes(t)) {\n s.type = \"string\";\n s.format = \"uuid\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"timestamp\", \"timestamptz\", \"datetime\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date-time\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n if ([\"date\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bool\", \"boolean\"].includes(t)) {\n s.type = \"boolean\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"int\", \"int4\", \"integer\", \"smallint\", \"int2\", \"serial\", \"bigserial\"].includes(t)) {\n s.type = \"integer\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bigint\", \"int8\"].includes(t)) {\n s.type = \"string\";\n s.format = \"int64\";\n s.pattern = \"^-?\\\\d+$\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"float\", \"float4\", \"float8\", \"double\", \"decimal\", \"numeric\", \"real\"].includes(t)) {\n s.type = \"number\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"json\", \"jsonb\"].includes(t)) {\n s.type = [\"object\", \"array\", \"string\", \"number\", \"boolean\", \"null\"];\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n s.type = \"string\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n}\n\nfunction isLiteralDefault(v: unknown) {\n return v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v);\n}\n\nfunction makeNullable(schema: JsonSchema): JsonSchema {\n if (schema.type === \"null\") return schema;\n if (Array.isArray(schema.type)) {\n if (!schema.type.includes(\"null\")) schema.type = [...schema.type, \"null\"];\n return schema;\n }\n if (typeof schema.type === \"string\") {\n schema.type = [schema.type, \"null\"];\n } else {\n schema.type = [\"null\"];\n }\n return schema;\n}\n\nfunction isGenerated(col: MetalColumnDef) {\n return !!col.primary || !!col.autoIncrement || (col.generated !== null && col.generated !== undefined);\n}\n\nfunction shouldIncludeColumn(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"read\") return true;\n if (mode === \"create\") return !isGenerated(col);\n if (mode === \"update\") return true;\n return true;\n}\n\nfunction shouldRequire(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"update\") return false;\n if (!col.notNull) return false;\n if (mode === \"create\" && (col.default !== null && col.default !== undefined)) return false;\n return true;\n}\n\nexport function schemaFromEntity(ctor: Function, opts: SchemaFromEntityOptions = {}): JsonSchema | undefined {\n const bag = readMetalDecoratorBagFromConstructor(ctor);\n if (!bag || !Array.isArray(bag.columns) || bag.columns.length === 0) return undefined;\n\n const mode = opts.mode ?? \"read\";\n const name = opts.name ?? defaultSchemaName(ctor, opts.stripEntitySuffix ?? true);\n\n const schema: JsonSchema = {\n title: name,\n type: \"object\",\n properties: {},\n additionalProperties: opts.additionalProperties ?? true\n };\n\n const required: string[] = [];\n\n for (const entry of bag.columns) {\n const prop = entry.propertyName;\n const col = entry.column;\n\n if (!shouldIncludeColumn(col, mode)) continue;\n\n const propSchema = columnTypeToSchema(col);\n\n if (!col.notNull) makeNullable(propSchema);\n\n if (isLiteralDefault(col.default)) propSchema.default = col.default;\n\n if (mode === \"read\" && col.primary) propSchema.readOnly = true;\n\n (schema.properties as any)[prop] = propSchema;\n\n if (shouldRequire(col, mode)) required.push(prop);\n }\n\n if (required.length) schema.required = required;\n\n if ((opts.includeRelations ?? \"none\") === \"inline\") {\n for (const r of bag.relations ?? []) {\n const rel = r.relation;\n if (typeof rel?.target !== \"function\") continue;\n\n let target: any;\n try {\n target = rel.target();\n } catch {\n continue;\n }\n if (typeof target !== \"function\") continue;\n\n const targetName = defaultSchemaName(target, true);\n (schema.properties as any)[r.propertyName] = { $ref: `#/components/schemas/${targetName}` };\n }\n }\n\n return schema;\n}\n","import { schemaFromEntity, type SchemaFromEntityOptions } from \"./schemaFromEntity.js\";\n\nfunction deepMerge(a: any, b: any): any {\n if (Array.isArray(a) || Array.isArray(b)) return b ?? a;\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n const out: any = { ...a };\n for (const [k, v] of Object.entries(b)) out[k] = deepMerge(out[k], v);\n return out;\n }\n return b ?? a;\n}\n\nexport interface RegisterMetalEntitiesOptions extends SchemaFromEntityOptions {\n merge?: \"override\" | \"merge\";\n}\n\nexport function registerMetalEntities(\n openapi: any,\n entities: Function[],\n opts: RegisterMetalEntitiesOptions = {}\n) {\n openapi.components ??= {};\n openapi.components.schemas ??= {};\n\n const mergeMode = opts.merge ?? \"merge\";\n\n for (const ctor of entities) {\n const s = schemaFromEntity(ctor, opts);\n if (!s) continue;\n\n const name = s.title || ctor.name;\n const existing = openapi.components.schemas[name];\n\n if (!existing || mergeMode === \"override\") {\n openapi.components.schemas[name] = s;\n } else {\n openapi.components.schemas[name] = deepMerge(existing, s);\n }\n }\n}\n","import type { ListQuery } from \"./listQuery.js\";\nimport type { SelectQueryBuilder } from \"metal-orm\";\nimport type { OrmSession } from \"metal-orm\";\nimport type { PaginatedResult } from \"metal-orm\";\n\nexport async function applyListQuery<TEntity extends object>(\n qb: SelectQueryBuilder<TEntity>,\n session: OrmSession,\n query?: ListQuery<TEntity>\n): Promise<PaginatedResult<TEntity>> {\n return qb.executePaged(session, pagedOptions(query));\n}\n\nexport function pagedOptions(query?: { page?: number; pageSize?: number }): {\n page: number;\n pageSize: number;\n} {\n return {\n page: query?.page ?? 1,\n pageSize: query?.pageSize ?? 10,\n };\n}\n\nexport function normalizeSort(sort: unknown): string[] {\n if (Array.isArray(sort)) {\n return sort.flatMap((v) => String(v).split(\",\"));\n }\n if (typeof sort === \"string\") {\n return sort.split(\",\");\n }\n return [];\n}\n\nexport type SortDirection = \"ASC\" | \"DESC\";\n\nexport type SortToken = {\n raw: string;\n field: string;\n path: string[];\n direction: SortDirection;\n isRelationField: boolean;\n};\n\nexport type ParseSortOptions = {\n max?: number;\n whitelist?: string[];\n};\n\nfunction matchWhitelist(path: string[], whitelist: string[]): boolean {\n const pathStr = path.join(\".\");\n\n for (const pattern of whitelist) {\n if (pattern === pathStr) return true;\n\n if (pattern.endsWith(\"*\")) {\n const prefix = pattern.slice(0, -1);\n if (pathStr.startsWith(prefix)) return true;\n }\n }\n\n return false;\n}\n\nexport function parseSort(sort: unknown, opts?: ParseSortOptions): SortToken[] {\n const max = opts?.max ?? 20;\n const whitelist = opts?.whitelist;\n\n const tokens = normalizeSort(sort)\n .map((s) => s.trim())\n .filter(Boolean)\n .slice(0, max)\n .map((raw) => {\n const direction: SortDirection = raw.startsWith(\"-\") ? \"DESC\" : \"ASC\";\n const field = raw.replace(/^[-+]/, \"\").trim();\n const path = field.split(\".\").map((p) => p.trim()).filter(Boolean);\n\n return {\n raw,\n field,\n path,\n direction,\n isRelationField: path.length > 1,\n };\n })\n .filter((t) => t.field.length > 0);\n\n if (whitelist && whitelist.length > 0) {\n return tokens.filter((t) => matchWhitelist(t.path, whitelist));\n }\n\n return tokens;\n}\n"],"mappings":"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","names":[]}
|
package/dist/metal/index.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ export { ensureSymbolMetadata } from "./symbolMetadata.js";
|
|
|
2
2
|
export { readMetalDecoratorBagFromConstructor, METAL_METADATA_KEY } from "./readMetalBag.js";
|
|
3
3
|
export { schemaFromEntity } from "./schemaFromEntity.js";
|
|
4
4
|
export { registerMetalEntities } from "./registerMetalEntities.js";
|
|
5
|
+
export type { ListQuery } from "./listQuery.js";
|
|
6
|
+
export { applyListQuery, normalizeSort, pagedOptions, parseSort } from "./applyListQuery.js";
|
|
5
7
|
export type { SchemaFromEntityOptions, EntitySchemaMode, JsonSchema } from "./schemaFromEntity.js";
|
|
6
8
|
export type { SearchWhere, SearchWhereDepth, SearchWhereOptions, SearchWherePath } from "./searchWhere.js";
|
|
9
|
+
export type { QueryOptions } from "./queryOptions.js";
|
|
10
|
+
export type { SortDirection, SortToken, ParseSortOptions } from "./applyListQuery.js";
|
|
7
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oCAAoC,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oCAAoC,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7F,YAAY,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnG,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/metal/index.js
CHANGED
|
@@ -96,7 +96,7 @@ function makeNullable(schema) {
|
|
|
96
96
|
return schema;
|
|
97
97
|
}
|
|
98
98
|
function isGenerated(col) {
|
|
99
|
-
return !!col.primary || !!col.autoIncrement || col.generated
|
|
99
|
+
return !!col.primary || !!col.autoIncrement || col.generated !== null && col.generated !== void 0;
|
|
100
100
|
}
|
|
101
101
|
function shouldIncludeColumn(col, mode) {
|
|
102
102
|
if (mode === "read") return true;
|
|
@@ -107,7 +107,7 @@ function shouldIncludeColumn(col, mode) {
|
|
|
107
107
|
function shouldRequire(col, mode) {
|
|
108
108
|
if (mode === "update") return false;
|
|
109
109
|
if (!col.notNull) return false;
|
|
110
|
-
if (mode === "create" && col.default
|
|
110
|
+
if (mode === "create" && (col.default !== null && col.default !== void 0)) return false;
|
|
111
111
|
return true;
|
|
112
112
|
}
|
|
113
113
|
function schemaFromEntity(ctor, opts = {}) {
|
|
@@ -178,9 +178,64 @@ function registerMetalEntities(openapi, entities, opts = {}) {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
|
+
|
|
182
|
+
// src/metal/applyListQuery.ts
|
|
183
|
+
async function applyListQuery(qb, session, query) {
|
|
184
|
+
return qb.executePaged(session, pagedOptions(query));
|
|
185
|
+
}
|
|
186
|
+
function pagedOptions(query) {
|
|
187
|
+
return {
|
|
188
|
+
page: query?.page ?? 1,
|
|
189
|
+
pageSize: query?.pageSize ?? 10
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function normalizeSort(sort) {
|
|
193
|
+
if (Array.isArray(sort)) {
|
|
194
|
+
return sort.flatMap((v) => String(v).split(","));
|
|
195
|
+
}
|
|
196
|
+
if (typeof sort === "string") {
|
|
197
|
+
return sort.split(",");
|
|
198
|
+
}
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
function matchWhitelist(path, whitelist) {
|
|
202
|
+
const pathStr = path.join(".");
|
|
203
|
+
for (const pattern of whitelist) {
|
|
204
|
+
if (pattern === pathStr) return true;
|
|
205
|
+
if (pattern.endsWith("*")) {
|
|
206
|
+
const prefix = pattern.slice(0, -1);
|
|
207
|
+
if (pathStr.startsWith(prefix)) return true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
function parseSort(sort, opts) {
|
|
213
|
+
const max = opts?.max ?? 20;
|
|
214
|
+
const whitelist = opts?.whitelist;
|
|
215
|
+
const tokens = normalizeSort(sort).map((s) => s.trim()).filter(Boolean).slice(0, max).map((raw) => {
|
|
216
|
+
const direction = raw.startsWith("-") ? "DESC" : "ASC";
|
|
217
|
+
const field = raw.replace(/^[-+]/, "").trim();
|
|
218
|
+
const path = field.split(".").map((p) => p.trim()).filter(Boolean);
|
|
219
|
+
return {
|
|
220
|
+
raw,
|
|
221
|
+
field,
|
|
222
|
+
path,
|
|
223
|
+
direction,
|
|
224
|
+
isRelationField: path.length > 1
|
|
225
|
+
};
|
|
226
|
+
}).filter((t) => t.field.length > 0);
|
|
227
|
+
if (whitelist && whitelist.length > 0) {
|
|
228
|
+
return tokens.filter((t) => matchWhitelist(t.path, whitelist));
|
|
229
|
+
}
|
|
230
|
+
return tokens;
|
|
231
|
+
}
|
|
181
232
|
export {
|
|
182
233
|
METAL_METADATA_KEY,
|
|
234
|
+
applyListQuery,
|
|
183
235
|
ensureSymbolMetadata,
|
|
236
|
+
normalizeSort,
|
|
237
|
+
pagedOptions,
|
|
238
|
+
parseSort,
|
|
184
239
|
readMetalDecoratorBagFromConstructor,
|
|
185
240
|
registerMetalEntities,
|
|
186
241
|
schemaFromEntity
|
package/dist/metal/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metal/symbolMetadata.ts","../../src/metal/readMetalBag.ts","../../src/metal/schemaFromEntity.ts","../../src/metal/registerMetalEntities.ts"],"sourcesContent":["export function ensureSymbolMetadata(): symbol {\n const s = Symbol as unknown as { metadata?: symbol };\n if (!s.metadata) {\n s.metadata = Symbol(\"Symbol.metadata\");\n }\n return s.metadata;\n}\n","import { ensureSymbolMetadata } from \"./symbolMetadata.js\";\n\nexport const METAL_METADATA_KEY = \"metal-orm:decorators\";\n\nexport type MetalColumnDef = {\n type: string;\n args?: unknown[];\n dialectTypes?: unknown;\n notNull?: boolean;\n primary?: boolean;\n tsType?: unknown;\n unique?: boolean;\n default?: unknown;\n autoIncrement?: boolean;\n generated?: unknown;\n check?: unknown;\n references?: unknown;\n comment?: string;\n};\n\nexport type MetalRelationMetadata = {\n kind: string;\n propertyKey: string;\n target?: (...args: any[]) => any;\n};\n\nexport type MetalDecoratorBag = {\n columns: Array<{ propertyName: string; column: MetalColumnDef }>;\n relations: Array<{ propertyName: string; relation: MetalRelationMetadata }>;\n};\n\nexport function readMetalDecoratorBagFromConstructor(ctor: object): MetalDecoratorBag | undefined {\n const metadataSymbol = ensureSymbolMetadata();\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METAL_METADATA_KEY] as MetalDecoratorBag | undefined;\n}\n","import { readMetalDecoratorBagFromConstructor, type MetalColumnDef, type MetalDecoratorBag } from \"./readMetalBag.js\";\n\nexport type JsonSchema = Record<string, any>;\n\nexport type EntitySchemaMode = \"read\" | \"create\" | \"update\";\n\nexport interface SchemaFromEntityOptions {\n name?: string;\n stripEntitySuffix?: boolean;\n mode?: EntitySchemaMode;\n additionalProperties?: boolean;\n includeRelations?: \"none\" | \"inline\";\n}\n\nfunction defaultSchemaName(ctor: Function, strip: boolean) {\n const raw = ctor.name || \"AnonymousEntity\";\n return strip ? raw.replace(/Entity$/i, \"\") || raw : raw;\n}\n\nfunction columnTypeToSchema(col: MetalColumnDef): JsonSchema {\n const t = String(col.type).toLowerCase();\n const s: JsonSchema = {};\n\n if ([\"varchar\", \"text\", \"string\", \"char\", \"citext\"].includes(t)) {\n s.type = \"string\";\n const a0 = Array.isArray(col.args) ? col.args[0] : undefined;\n if (typeof a0 === \"number\" && Number.isFinite(a0) && a0 > 0) s.maxLength = a0;\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"uuid\"].includes(t)) {\n s.type = \"string\";\n s.format = \"uuid\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"timestamp\", \"timestamptz\", \"datetime\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date-time\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n if ([\"date\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bool\", \"boolean\"].includes(t)) {\n s.type = \"boolean\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"int\", \"int4\", \"integer\", \"smallint\", \"int2\", \"serial\", \"bigserial\"].includes(t)) {\n s.type = \"integer\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bigint\", \"int8\"].includes(t)) {\n s.type = \"string\";\n s.format = \"int64\";\n s.pattern = \"^-?\\\\d+$\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"float\", \"float4\", \"float8\", \"double\", \"decimal\", \"numeric\", \"real\"].includes(t)) {\n s.type = \"number\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"json\", \"jsonb\"].includes(t)) {\n s.type = [\"object\", \"array\", \"string\", \"number\", \"boolean\", \"null\"];\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n s.type = \"string\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n}\n\nfunction isLiteralDefault(v: unknown) {\n return v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v);\n}\n\nfunction makeNullable(schema: JsonSchema): JsonSchema {\n if (schema.type === \"null\") return schema;\n if (Array.isArray(schema.type)) {\n if (!schema.type.includes(\"null\")) schema.type = [...schema.type, \"null\"];\n return schema;\n }\n if (typeof schema.type === \"string\") {\n schema.type = [schema.type, \"null\"];\n } else {\n schema.type = [\"null\"];\n }\n return schema;\n}\n\nfunction isGenerated(col: MetalColumnDef) {\n return !!col.primary || !!col.autoIncrement || col.generated != null;\n}\n\nfunction shouldIncludeColumn(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"read\") return true;\n if (mode === \"create\") return !isGenerated(col);\n if (mode === \"update\") return true;\n return true;\n}\n\nfunction shouldRequire(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"update\") return false;\n if (!col.notNull) return false;\n if (mode === \"create\" && col.default != null) return false;\n return true;\n}\n\nexport function schemaFromEntity(ctor: Function, opts: SchemaFromEntityOptions = {}): JsonSchema | undefined {\n const bag = readMetalDecoratorBagFromConstructor(ctor);\n if (!bag || !Array.isArray(bag.columns) || bag.columns.length === 0) return undefined;\n\n const mode = opts.mode ?? \"read\";\n const name = opts.name ?? defaultSchemaName(ctor, opts.stripEntitySuffix ?? true);\n\n const schema: JsonSchema = {\n title: name,\n type: \"object\",\n properties: {},\n additionalProperties: opts.additionalProperties ?? true\n };\n\n const required: string[] = [];\n\n for (const entry of bag.columns) {\n const prop = entry.propertyName;\n const col = entry.column;\n\n if (!shouldIncludeColumn(col, mode)) continue;\n\n const propSchema = columnTypeToSchema(col);\n\n if (!col.notNull) makeNullable(propSchema);\n\n if (isLiteralDefault(col.default)) propSchema.default = col.default;\n\n if (mode === \"read\" && col.primary) propSchema.readOnly = true;\n\n (schema.properties as any)[prop] = propSchema;\n\n if (shouldRequire(col, mode)) required.push(prop);\n }\n\n if (required.length) schema.required = required;\n\n if ((opts.includeRelations ?? \"none\") === \"inline\") {\n for (const r of bag.relations ?? []) {\n const rel = r.relation;\n if (typeof rel?.target !== \"function\") continue;\n\n let target: any;\n try {\n target = rel.target();\n } catch {\n continue;\n }\n if (typeof target !== \"function\") continue;\n\n const targetName = defaultSchemaName(target, true);\n (schema.properties as any)[r.propertyName] = { $ref: `#/components/schemas/${targetName}` };\n }\n }\n\n return schema;\n}\n","import { schemaFromEntity, type SchemaFromEntityOptions, type JsonSchema } from \"./schemaFromEntity.js\";\n\nfunction deepMerge(a: any, b: any): any {\n if (Array.isArray(a) || Array.isArray(b)) return b ?? a;\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n const out: any = { ...a };\n for (const [k, v] of Object.entries(b)) out[k] = deepMerge(out[k], v);\n return out;\n }\n return b ?? a;\n}\n\nexport interface RegisterMetalEntitiesOptions extends SchemaFromEntityOptions {\n merge?: \"override\" | \"merge\";\n}\n\nexport function registerMetalEntities(\n openapi: any,\n entities: Function[],\n opts: RegisterMetalEntitiesOptions = {}\n) {\n openapi.components ??= {};\n openapi.components.schemas ??= {};\n\n const mergeMode = opts.merge ?? \"merge\";\n\n for (const ctor of entities) {\n const s = schemaFromEntity(ctor, opts);\n if (!s) continue;\n\n const name = s.title || ctor.name;\n const existing = openapi.components.schemas[name];\n\n if (!existing || mergeMode === \"override\") {\n openapi.components.schemas[name] = s;\n } else {\n openapi.components.schemas[name] = deepMerge(existing, s);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/metal/symbolMetadata.ts","../../src/metal/readMetalBag.ts","../../src/metal/schemaFromEntity.ts","../../src/metal/registerMetalEntities.ts","../../src/metal/applyListQuery.ts"],"sourcesContent":["export function ensureSymbolMetadata(): symbol {\n const s = Symbol as unknown as { metadata?: symbol };\n if (!s.metadata) {\n s.metadata = Symbol(\"Symbol.metadata\");\n }\n return s.metadata;\n}\n","import { ensureSymbolMetadata } from \"./symbolMetadata.js\";\n\nexport const METAL_METADATA_KEY = \"metal-orm:decorators\";\n\nexport type MetalColumnDef = {\n type: string;\n args?: unknown[];\n dialectTypes?: unknown;\n notNull?: boolean;\n primary?: boolean;\n tsType?: unknown;\n unique?: boolean;\n default?: unknown;\n autoIncrement?: boolean;\n generated?: unknown;\n check?: unknown;\n references?: unknown;\n comment?: string;\n};\n\nexport type MetalRelationMetadata = {\n kind: string;\n propertyKey: string;\n target?: (...args: any[]) => any;\n};\n\nexport type MetalDecoratorBag = {\n columns: Array<{ propertyName: string; column: MetalColumnDef }>;\n relations: Array<{ propertyName: string; relation: MetalRelationMetadata }>;\n};\n\nexport function readMetalDecoratorBagFromConstructor(ctor: object): MetalDecoratorBag | undefined {\n const metadataSymbol = ensureSymbolMetadata();\n const metadata = Reflect.get(ctor, metadataSymbol) as Record<PropertyKey, unknown> | undefined;\n return metadata?.[METAL_METADATA_KEY] as MetalDecoratorBag | undefined;\n}\n","import { readMetalDecoratorBagFromConstructor, type MetalColumnDef } from \"./readMetalBag.js\";\n\nexport type JsonSchema = Record<string, any>;\n\nexport type EntitySchemaMode = \"read\" | \"create\" | \"update\";\n\nexport interface SchemaFromEntityOptions {\n name?: string;\n stripEntitySuffix?: boolean;\n mode?: EntitySchemaMode;\n additionalProperties?: boolean;\n includeRelations?: \"none\" | \"inline\";\n}\n\nfunction defaultSchemaName(ctor: Function, strip: boolean) {\n const raw = ctor.name || \"AnonymousEntity\";\n return strip ? raw.replace(/Entity$/i, \"\") || raw : raw;\n}\n\nfunction columnTypeToSchema(col: MetalColumnDef): JsonSchema {\n const t = String(col.type).toLowerCase();\n const s: JsonSchema = {};\n\n if ([\"varchar\", \"text\", \"string\", \"char\", \"citext\"].includes(t)) {\n s.type = \"string\";\n const a0 = Array.isArray(col.args) ? col.args[0] : undefined;\n if (typeof a0 === \"number\" && Number.isFinite(a0) && a0 > 0) s.maxLength = a0;\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"uuid\"].includes(t)) {\n s.type = \"string\";\n s.format = \"uuid\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"timestamp\", \"timestamptz\", \"datetime\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date-time\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n if ([\"date\"].includes(t)) {\n s.type = \"string\";\n s.format = \"date\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bool\", \"boolean\"].includes(t)) {\n s.type = \"boolean\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"int\", \"int4\", \"integer\", \"smallint\", \"int2\", \"serial\", \"bigserial\"].includes(t)) {\n s.type = \"integer\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"bigint\", \"int8\"].includes(t)) {\n s.type = \"string\";\n s.format = \"int64\";\n s.pattern = \"^-?\\\\d+$\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"float\", \"float4\", \"float8\", \"double\", \"decimal\", \"numeric\", \"real\"].includes(t)) {\n s.type = \"number\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n if ([\"json\", \"jsonb\"].includes(t)) {\n s.type = [\"object\", \"array\", \"string\", \"number\", \"boolean\", \"null\"];\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n }\n\n s.type = \"string\";\n if (typeof col.comment === \"string\") s.description = col.comment;\n return s;\n}\n\nfunction isLiteralDefault(v: unknown) {\n return v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v);\n}\n\nfunction makeNullable(schema: JsonSchema): JsonSchema {\n if (schema.type === \"null\") return schema;\n if (Array.isArray(schema.type)) {\n if (!schema.type.includes(\"null\")) schema.type = [...schema.type, \"null\"];\n return schema;\n }\n if (typeof schema.type === \"string\") {\n schema.type = [schema.type, \"null\"];\n } else {\n schema.type = [\"null\"];\n }\n return schema;\n}\n\nfunction isGenerated(col: MetalColumnDef) {\n return !!col.primary || !!col.autoIncrement || (col.generated !== null && col.generated !== undefined);\n}\n\nfunction shouldIncludeColumn(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"read\") return true;\n if (mode === \"create\") return !isGenerated(col);\n if (mode === \"update\") return true;\n return true;\n}\n\nfunction shouldRequire(col: MetalColumnDef, mode: \"read\" | \"create\" | \"update\") {\n if (mode === \"update\") return false;\n if (!col.notNull) return false;\n if (mode === \"create\" && (col.default !== null && col.default !== undefined)) return false;\n return true;\n}\n\nexport function schemaFromEntity(ctor: Function, opts: SchemaFromEntityOptions = {}): JsonSchema | undefined {\n const bag = readMetalDecoratorBagFromConstructor(ctor);\n if (!bag || !Array.isArray(bag.columns) || bag.columns.length === 0) return undefined;\n\n const mode = opts.mode ?? \"read\";\n const name = opts.name ?? defaultSchemaName(ctor, opts.stripEntitySuffix ?? true);\n\n const schema: JsonSchema = {\n title: name,\n type: \"object\",\n properties: {},\n additionalProperties: opts.additionalProperties ?? true\n };\n\n const required: string[] = [];\n\n for (const entry of bag.columns) {\n const prop = entry.propertyName;\n const col = entry.column;\n\n if (!shouldIncludeColumn(col, mode)) continue;\n\n const propSchema = columnTypeToSchema(col);\n\n if (!col.notNull) makeNullable(propSchema);\n\n if (isLiteralDefault(col.default)) propSchema.default = col.default;\n\n if (mode === \"read\" && col.primary) propSchema.readOnly = true;\n\n (schema.properties as any)[prop] = propSchema;\n\n if (shouldRequire(col, mode)) required.push(prop);\n }\n\n if (required.length) schema.required = required;\n\n if ((opts.includeRelations ?? \"none\") === \"inline\") {\n for (const r of bag.relations ?? []) {\n const rel = r.relation;\n if (typeof rel?.target !== \"function\") continue;\n\n let target: any;\n try {\n target = rel.target();\n } catch {\n continue;\n }\n if (typeof target !== \"function\") continue;\n\n const targetName = defaultSchemaName(target, true);\n (schema.properties as any)[r.propertyName] = { $ref: `#/components/schemas/${targetName}` };\n }\n }\n\n return schema;\n}\n","import { schemaFromEntity, type SchemaFromEntityOptions } from \"./schemaFromEntity.js\";\n\nfunction deepMerge(a: any, b: any): any {\n if (Array.isArray(a) || Array.isArray(b)) return b ?? a;\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n const out: any = { ...a };\n for (const [k, v] of Object.entries(b)) out[k] = deepMerge(out[k], v);\n return out;\n }\n return b ?? a;\n}\n\nexport interface RegisterMetalEntitiesOptions extends SchemaFromEntityOptions {\n merge?: \"override\" | \"merge\";\n}\n\nexport function registerMetalEntities(\n openapi: any,\n entities: Function[],\n opts: RegisterMetalEntitiesOptions = {}\n) {\n openapi.components ??= {};\n openapi.components.schemas ??= {};\n\n const mergeMode = opts.merge ?? \"merge\";\n\n for (const ctor of entities) {\n const s = schemaFromEntity(ctor, opts);\n if (!s) continue;\n\n const name = s.title || ctor.name;\n const existing = openapi.components.schemas[name];\n\n if (!existing || mergeMode === \"override\") {\n openapi.components.schemas[name] = s;\n } else {\n openapi.components.schemas[name] = deepMerge(existing, s);\n }\n }\n}\n","import type { ListQuery } from \"./listQuery.js\";\nimport type { SelectQueryBuilder } from \"metal-orm\";\nimport type { OrmSession } from \"metal-orm\";\nimport type { PaginatedResult } from \"metal-orm\";\n\nexport async function applyListQuery<TEntity extends object>(\n qb: SelectQueryBuilder<TEntity>,\n session: OrmSession,\n query?: ListQuery<TEntity>\n): Promise<PaginatedResult<TEntity>> {\n return qb.executePaged(session, pagedOptions(query));\n}\n\nexport function pagedOptions(query?: { page?: number; pageSize?: number }): {\n page: number;\n pageSize: number;\n} {\n return {\n page: query?.page ?? 1,\n pageSize: query?.pageSize ?? 10,\n };\n}\n\nexport function normalizeSort(sort: unknown): string[] {\n if (Array.isArray(sort)) {\n return sort.flatMap((v) => String(v).split(\",\"));\n }\n if (typeof sort === \"string\") {\n return sort.split(\",\");\n }\n return [];\n}\n\nexport type SortDirection = \"ASC\" | \"DESC\";\n\nexport type SortToken = {\n raw: string;\n field: string;\n path: string[];\n direction: SortDirection;\n isRelationField: boolean;\n};\n\nexport type ParseSortOptions = {\n max?: number;\n whitelist?: string[];\n};\n\nfunction matchWhitelist(path: string[], whitelist: string[]): boolean {\n const pathStr = path.join(\".\");\n\n for (const pattern of whitelist) {\n if (pattern === pathStr) return true;\n\n if (pattern.endsWith(\"*\")) {\n const prefix = pattern.slice(0, -1);\n if (pathStr.startsWith(prefix)) return true;\n }\n }\n\n return false;\n}\n\nexport function parseSort(sort: unknown, opts?: ParseSortOptions): SortToken[] {\n const max = opts?.max ?? 20;\n const whitelist = opts?.whitelist;\n\n const tokens = normalizeSort(sort)\n .map((s) => s.trim())\n .filter(Boolean)\n .slice(0, max)\n .map((raw) => {\n const direction: SortDirection = raw.startsWith(\"-\") ? \"DESC\" : \"ASC\";\n const field = raw.replace(/^[-+]/, \"\").trim();\n const path = field.split(\".\").map((p) => p.trim()).filter(Boolean);\n\n return {\n raw,\n field,\n path,\n direction,\n isRelationField: path.length > 1,\n };\n })\n .filter((t) => t.field.length > 0);\n\n if (whitelist && whitelist.length > 0) {\n return tokens.filter((t) => matchWhitelist(t.path, whitelist));\n }\n\n return tokens;\n}\n"],"mappings":";AAAO,SAAS,uBAA+B;AAC7C,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,UAAU;AACf,MAAE,WAAW,uBAAO,iBAAiB;AAAA,EACvC;AACA,SAAO,EAAE;AACX;;;ACJO,IAAM,qBAAqB;AA6B3B,SAAS,qCAAqC,MAA6C;AAChG,QAAM,iBAAiB,qBAAqB;AAC5C,QAAM,WAAW,QAAQ,IAAI,MAAM,cAAc;AACjD,SAAO,WAAW,kBAAkB;AACtC;;;ACrBA,SAAS,kBAAkB,MAAgB,OAAgB;AACzD,QAAM,MAAM,KAAK,QAAQ;AACzB,SAAO,QAAQ,IAAI,QAAQ,YAAY,EAAE,KAAK,MAAM;AACtD;AAEA,SAAS,mBAAmB,KAAiC;AAC3D,QAAM,IAAI,OAAO,IAAI,IAAI,EAAE,YAAY;AACvC,QAAM,IAAgB,CAAC;AAEvB,MAAI,CAAC,WAAW,QAAQ,UAAU,QAAQ,QAAQ,EAAE,SAAS,CAAC,GAAG;AAC/D,MAAE,OAAO;AACT,UAAM,KAAK,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI;AACnD,QAAI,OAAO,OAAO,YAAY,OAAO,SAAS,EAAE,KAAK,KAAK,EAAG,GAAE,YAAY;AAC3E,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;AACxB,MAAE,OAAO;AACT,MAAE,SAAS;AACX,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,eAAe,UAAU,EAAE,SAAS,CAAC,GAAG;AACxD,MAAE,OAAO;AACT,MAAE,SAAS;AACX,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;AACxB,MAAE,OAAO;AACT,MAAE,SAAS;AACX,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,SAAS,EAAE,SAAS,CAAC,GAAG;AACnC,MAAE,OAAO;AACT,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,QAAQ,WAAW,YAAY,QAAQ,UAAU,WAAW,EAAE,SAAS,CAAC,GAAG;AACrF,MAAE,OAAO;AACT,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,MAAM,EAAE,SAAS,CAAC,GAAG;AAClC,MAAE,OAAO;AACT,MAAE,SAAS;AACX,MAAE,UAAU;AACZ,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,UAAU,UAAU,UAAU,WAAW,WAAW,MAAM,EAAE,SAAS,CAAC,GAAG;AACrF,MAAE,OAAO;AACT,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,OAAO,EAAE,SAAS,CAAC,GAAG;AACjC,MAAE,OAAO,CAAC,UAAU,SAAS,UAAU,UAAU,WAAW,MAAM;AAClE,QAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,WAAO;AAAA,EACT;AAEA,IAAE,OAAO;AACT,MAAI,OAAO,IAAI,YAAY,SAAU,GAAE,cAAc,IAAI;AACzD,SAAO;AACT;AAEA,SAAS,iBAAiB,GAAY;AACpC,SAAO,MAAM,QAAQ,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAO,CAAC;AACxE;AAEA,SAAS,aAAa,QAAgC;AACpD,MAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,QAAI,CAAC,OAAO,KAAK,SAAS,MAAM,EAAG,QAAO,OAAO,CAAC,GAAG,OAAO,MAAM,MAAM;AACxE,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,SAAS,UAAU;AACnC,WAAO,OAAO,CAAC,OAAO,MAAM,MAAM;AAAA,EACpC,OAAO;AACL,WAAO,OAAO,CAAC,MAAM;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,iBAAkB,IAAI,cAAc,QAAQ,IAAI,cAAc;AAC9F;AAEA,SAAS,oBAAoB,KAAqB,MAAoC;AACpF,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,SAAS,SAAU,QAAO,CAAC,YAAY,GAAG;AAC9C,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO;AACT;AAEA,SAAS,cAAc,KAAqB,MAAoC;AAC9E,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,CAAC,IAAI,QAAS,QAAO;AACzB,MAAI,SAAS,aAAa,IAAI,YAAY,QAAQ,IAAI,YAAY,QAAY,QAAO;AACrF,SAAO;AACT;AAEO,SAAS,iBAAiB,MAAgB,OAAgC,CAAC,GAA2B;AAC3G,QAAM,MAAM,qCAAqC,IAAI;AACrD,MAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,WAAW,EAAG,QAAO;AAE5E,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,OAAO,KAAK,QAAQ,kBAAkB,MAAM,KAAK,qBAAqB,IAAI;AAEhF,QAAM,SAAqB;AAAA,IACzB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,sBAAsB,KAAK,wBAAwB;AAAA,EACrD;AAEA,QAAM,WAAqB,CAAC;AAE5B,aAAW,SAAS,IAAI,SAAS;AAC/B,UAAM,OAAO,MAAM;AACnB,UAAM,MAAM,MAAM;AAElB,QAAI,CAAC,oBAAoB,KAAK,IAAI,EAAG;AAErC,UAAM,aAAa,mBAAmB,GAAG;AAEzC,QAAI,CAAC,IAAI,QAAS,cAAa,UAAU;AAEzC,QAAI,iBAAiB,IAAI,OAAO,EAAG,YAAW,UAAU,IAAI;AAE5D,QAAI,SAAS,UAAU,IAAI,QAAS,YAAW,WAAW;AAE1D,IAAC,OAAO,WAAmB,IAAI,IAAI;AAEnC,QAAI,cAAc,KAAK,IAAI,EAAG,UAAS,KAAK,IAAI;AAAA,EAClD;AAEA,MAAI,SAAS,OAAQ,QAAO,WAAW;AAEvC,OAAK,KAAK,oBAAoB,YAAY,UAAU;AAClD,eAAW,KAAK,IAAI,aAAa,CAAC,GAAG;AACnC,YAAM,MAAM,EAAE;AACd,UAAI,OAAO,KAAK,WAAW,WAAY;AAEvC,UAAI;AACJ,UAAI;AACF,iBAAS,IAAI,OAAO;AAAA,MACtB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,OAAO,WAAW,WAAY;AAElC,YAAM,aAAa,kBAAkB,QAAQ,IAAI;AACjD,MAAC,OAAO,WAAmB,EAAE,YAAY,IAAI,EAAE,MAAM,wBAAwB,UAAU,GAAG;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO;AACT;;;AClLA,SAAS,UAAU,GAAQ,GAAa;AACtC,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,EAAG,QAAO,KAAK;AACtD,MAAI,KAAK,OAAO,MAAM,YAAY,KAAK,OAAO,MAAM,UAAU;AAC5D,UAAM,MAAW,EAAE,GAAG,EAAE;AACxB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAI,CAAC,IAAI,UAAU,IAAI,CAAC,GAAG,CAAC;AACpE,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AACd;AAMO,SAAS,sBACd,SACA,UACA,OAAqC,CAAC,GACtC;AACA,UAAQ,eAAe,CAAC;AACxB,UAAQ,WAAW,YAAY,CAAC;AAEhC,QAAM,YAAY,KAAK,SAAS;AAEhC,aAAW,QAAQ,UAAU;AAC3B,UAAM,IAAI,iBAAiB,MAAM,IAAI;AACrC,QAAI,CAAC,EAAG;AAER,UAAM,OAAO,EAAE,SAAS,KAAK;AAC7B,UAAM,WAAW,QAAQ,WAAW,QAAQ,IAAI;AAEhD,QAAI,CAAC,YAAY,cAAc,YAAY;AACzC,cAAQ,WAAW,QAAQ,IAAI,IAAI;AAAA,IACrC,OAAO;AACL,cAAQ,WAAW,QAAQ,IAAI,IAAI,UAAU,UAAU,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;;;AClCA,eAAsB,eACpB,IACA,SACA,OACmC;AACnC,SAAO,GAAG,aAAa,SAAS,aAAa,KAAK,CAAC;AACrD;AAEO,SAAS,aAAa,OAG3B;AACA,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ;AAAA,IACrB,UAAU,OAAO,YAAY;AAAA,EAC/B;AACF;AAEO,SAAS,cAAc,MAAyB;AACrD,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,QAAQ,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,EACjD;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AACA,SAAO,CAAC;AACV;AAiBA,SAAS,eAAe,MAAgB,WAA8B;AACpE,QAAM,UAAU,KAAK,KAAK,GAAG;AAE7B,aAAW,WAAW,WAAW;AAC/B,QAAI,YAAY,QAAS,QAAO;AAEhC,QAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,YAAM,SAAS,QAAQ,MAAM,GAAG,EAAE;AAClC,UAAI,QAAQ,WAAW,MAAM,EAAG,QAAO;AAAA,IACzC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,MAAe,MAAsC;AAC7E,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,YAAY,MAAM;AAExB,QAAM,SAAS,cAAc,IAAI,EAC9B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,MAAM,GAAG,GAAG,EACZ,IAAI,CAAC,QAAQ;AACZ,UAAM,YAA2B,IAAI,WAAW,GAAG,IAAI,SAAS;AAChE,UAAM,QAAQ,IAAI,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC5C,UAAM,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEjE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,KAAK,SAAS;AAAA,IACjC;AAAA,EACF,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,OAAO,OAAO,CAAC,MAAM,eAAe,EAAE,MAAM,SAAS,CAAC;AAAA,EAC/D;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SearchWhereDepth } from "./searchWhere.js";
|
|
2
|
+
import type { QueryOptions } from "./queryOptions.js";
|
|
3
|
+
export type ListQuery<TEntity extends object, Depth extends SearchWhereDepth = 2> = QueryOptions<TEntity, Depth> & {
|
|
4
|
+
page?: number;
|
|
5
|
+
pageSize?: number;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=listQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listQuery.d.ts","sourceRoot":"","sources":["../../src/metal/listQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK,SAAS,gBAAgB,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG;IACjH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SearchWhere, SearchWhereDepth } from "./searchWhere.js";
|
|
2
|
+
export type QueryOptions<TEntity extends object, Depth extends SearchWhereDepth = 5> = {
|
|
3
|
+
where?: SearchWhere<TEntity, {
|
|
4
|
+
maxDepth: Depth;
|
|
5
|
+
}>;
|
|
6
|
+
sort?: string | string[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=queryOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryOptions.d.ts","sourceRoot":"","sources":["../../src/metal/queryOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,MAAM,YAAY,CACpB,OAAO,SAAS,MAAM,EACtB,KAAK,SAAS,gBAAgB,GAAG,CAAC,IAClC;IACA,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerMetalEntities.d.ts","sourceRoot":"","sources":["../../src/metal/registerMetalEntities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"registerMetalEntities.d.ts","sourceRoot":"","sources":["../../src/metal/registerMetalEntities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAYvF,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;CAC9B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,QAAQ,EAAE,EACpB,IAAI,GAAE,4BAAiC,QAoBxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/runtime/metadata/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/runtime/metadata/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C,GAAG,EAAE,cAAc,EAAE,CAAC;CACvB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adorn-api",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.13",
|
|
4
4
|
"description": "Stage-3 decorator-first OpenAPI + routing toolkit",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -77,10 +77,13 @@
|
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
+
"@eslint/js": "^9.39.2",
|
|
80
81
|
"@types/express": "^4.17.0",
|
|
81
82
|
"@types/node": "^20.0.0",
|
|
82
83
|
"@types/supertest": "^6.0.0",
|
|
83
84
|
"@types/swagger-ui-express": "^4.1.6",
|
|
85
|
+
"@typescript-eslint/eslint-plugin": "^8.52.0",
|
|
86
|
+
"@typescript-eslint/parser": "^8.52.0",
|
|
84
87
|
"eslint": "^9.39.2",
|
|
85
88
|
"express": "^5.2.1",
|
|
86
89
|
"rimraf": "^6.0.0",
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
export interface QueryStyleOptions {
|
|
3
|
-
style?: "form" | "spaceDelimited" | "pipeDelimited" | "deepObject";
|
|
4
|
-
explode?: boolean;
|
|
5
|
-
allowReserved?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export declare function extractQueryStyleOptions(checker: ts.TypeChecker, method: ts.MethodDeclaration): QueryStyleOptions | null;
|
|
8
|
-
//# sourceMappingURL=extractQueryStyle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extractQueryStyle.d.ts","sourceRoot":"","sources":["../../../src/compiler/analyze/extractQueryStyle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,MAAM,EAAE,EAAE,CAAC,iBAAiB,GAC3B,iBAAiB,GAAG,IAAI,CA2B1B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Paginated.d.ts","sourceRoot":"","sources":["../../src/decorators/Paginated.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,IAEpD,SAAS,GAAG,EACZ,SAAS,2BAA2B,UAsBvC"}
|