@huanglangjian/specs 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1728 -482
- package/dist/index.mjs +1382 -841
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -11
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["generateModelSignature","generateStaticValue","ret","arr","set","map"],"sources":["../src/type-system/basic.ts","../src/type-system/http.ts","../src/generator/java.ts","../src/generator/rust.ts","../src/type-system/serialize.ts"],"sourcesContent":["import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchemaObject } from \"@/schemas/json-schema-draft-2020-12\"\nimport type { ArraySchema, MapSchema, NumberSchema, SetSchema, StringSchema } from \"@/schemas/schema-variants\"\n\nexport interface BasicModel<T> {\n id?: string\n title?: string\n description?: string\n examples?: T[]\n default?: T\n deprecated?: boolean\n}\n\nexport interface Int32Model extends BasicModel<number> {\n kind: \"int32\"\n schema?: NumberSchema\n}\n\nexport interface Int32ModelOptions extends Omit<Int32Model, \"kind\"> {}\n\nexport function int32(options?: Int32ModelOptions): Int32Model {\n return { kind: \"int32\", ...options }\n}\n\nexport interface Int64Model extends BasicModel<string> {\n kind: \"int64\"\n schema?: StringSchema\n}\n\nexport interface Int64ModelOptions extends Omit<Int64Model, \"kind\"> {}\n\nexport function int64(options?: Int64ModelOptions): Int64Model {\n return { kind: \"int64\", ...options }\n}\n\nexport interface Float32Model extends BasicModel<number> {\n kind: \"float32\"\n schema?: NumberSchema\n}\n\nexport interface Float32ModelOptions extends Omit<Float32Model, \"kind\"> {}\n\nexport function float32(options?: Float32ModelOptions): Float32Model {\n return { kind: \"float32\", ...options }\n}\n\nexport interface Float64Model extends BasicModel<number> {\n kind: \"float64\"\n schema?: NumberSchema\n}\n\nexport interface Float64ModelOptions extends Omit<Float64Model, \"kind\"> {}\n\nexport function float64(options?: Float64ModelOptions): Float64Model {\n return { kind: \"float64\", ...options }\n}\n\nexport interface BooleanModel extends BasicModel<boolean> {\n kind: \"boolean\"\n}\n\nexport interface BooleanModelOptions extends Omit<BooleanModel, \"kind\"> {}\n\nexport function boolean(options?: BooleanModelOptions): BooleanModel {\n return { kind: \"boolean\", ...options }\n}\n\nexport interface StringModel extends BasicModel<string> {\n kind: \"string\"\n schema?: StringSchema\n}\n\nexport interface StringModelOptions extends Omit<StringModel, \"kind\"> {}\n\nexport function string(options?: StringModelOptions): StringModel {\n return { kind: \"string\", ...options }\n}\n\nexport interface LiteralModel<T extends string | number | boolean> extends BasicModel<T> {\n kind: \"literal\"\n value: T\n}\n\nexport interface LiteralModelOptions<T extends string | number | boolean> extends Omit<LiteralModel<T>, \"kind\"> {}\n\nexport function literal<const T extends string | number | boolean>(options: LiteralModelOptions<T>): LiteralModel<T> {\n return { kind: \"literal\", ...options }\n}\n\n/**\n * 表示一个可选类型,代表\"值可能存在也可能不存在\"的语义。\n *\n * 设计理念:\n * - 统一\"空白\"语义:将 `null`、`undefined` 和缺失值等多种\"空\"的概念合并为单一语义,\n * 避免类型系统中存在多个含义模糊的\"空\"状态。\n * - 序列化到 JSON 时,`Optional` 可以表示为 `null` 或完全省略(取决于上下文)。\n * `InferModelJsonType<T> | null | undefined` 表示该值可以是基础类型、`null` 或 `undefined`。\n * - 如果需要区分\"显式设置为空\"和\"从未设置\"等细分语义,应当另行设计专用类型。\n *\n * @template T 基础模型类型\n */\nexport interface OptionalModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T> | null | undefined> {\n kind: \"optional\"\n base: T\n}\n\n/**\n * 将类型模型转换为可选类型。\n *\n * @template T 基础模型类型\n */\nexport type Optionalize<T extends TypeModels> = T extends TypeModels ? OptionalModel<T> : never\n\nexport interface OptionalModelOptions<T extends TypeModels> extends Omit<OptionalModel<T>, \"kind\" | \"base\"> {}\n\n/**\n * 创建一个可选类型模型。\n *\n * @param base 基础模型类型\n * @param options 可选配置选项\n * @returns 可选类型模型\n */\nexport function optional<T extends TypeModels>(base: T, options?: OptionalModelOptions<T>): OptionalModel<T> {\n return { kind: \"optional\", base, ...options }\n}\n\nexport interface ArrayModel<T> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"array\"\n base: T\n schema?: ArraySchema\n}\n\nexport interface ArrayModelOptions<T extends TypeModels> extends Omit<ArrayModel<T>, \"kind\" | \"base\"> {}\n\nexport function array<T extends TypeModels>(base: T, options?: ArrayModelOptions<T>): ArrayModel<T> {\n return { kind: \"array\", base, ...options }\n}\n\nexport interface SetModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"set\"\n base: T\n schema?: SetSchema\n}\n\nexport interface SetModelOptions<T extends TypeModels> extends Omit<SetModel<T>, \"kind\" | \"base\"> {}\n\nexport function set<T extends TypeModels>(base: T, options?: SetModelOptions<T>): SetModel<T> {\n return { kind: \"set\", base, ...options }\n}\n\nexport interface MapModel<T> extends BasicModel<{ [key: string]: InferModelJsonType<T> }> {\n kind: \"map\"\n base: T\n schema?: MapSchema\n}\n\nexport interface MapModelOptions<T extends TypeModels> extends Omit<MapModel<T>, \"kind\" | \"base\"> {}\n\nexport function map<T extends TypeModels>(base: T, options?: MapModelOptions<T>): MapModel<T> {\n return { kind: \"map\", base, ...options }\n}\n\nexport interface RecordModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferRecordJsonType<T>> {\n kind: \"record\"\n id: string\n properties: T\n}\n\nexport type KeyOfOptional<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: T[key] extends OptionalModel<any> ? key : never\n}[keyof T]\n\n/* prettier-ignore */\nexport type InferRecordJsonType<T extends { [key: string]: TypeModels },O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferModelJsonType<T[key]> } \n & { [key in O]?: InferModelJsonType<T[key]> }\n>\n\nexport interface RecordModelOptions<T extends { [key: string]: TypeModels }> extends Omit<RecordModel<T>, \"kind\"> {}\n\nexport function record<const T extends { [key: string]: TypeModels }>(options: RecordModelOptions<T>): RecordModel<T> {\n return { kind: \"record\", ...options }\n}\n\nexport interface UnionModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferUnionJsonType<T>> {\n kind: \"union\"\n id: string\n variants: T\n}\n\nexport type InferUnionJsonType<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferModelJsonType<T[key]> }\n}[keyof T]\n\nexport interface UnionModelOptions<T extends { [key: string]: TypeModels }> extends Omit<UnionModel<T>, \"kind\"> {}\n\nexport function union<const T extends { [key: string]: TypeModels }>(options: UnionModelOptions<T>): UnionModel<T> {\n return { kind: \"union\", ...options }\n}\n\nexport interface DatetimeModel extends BasicModel<string> {\n kind: \"datetime\"\n schema?: StringSchema\n}\n\nexport interface DatetimeModelOptions extends Omit<DatetimeModel, \"kind\"> {}\n\nexport function datetime(options?: DatetimeModelOptions): DatetimeModel {\n return { kind: \"datetime\", ...options }\n}\n\nexport interface DateModel extends BasicModel<string> {\n kind: \"date\"\n schema?: StringSchema\n}\n\nexport interface DateModelOptions extends Omit<DateModel, \"kind\"> {}\n\nexport function date(options?: DateModelOptions): DateModel {\n return { kind: \"date\", ...options }\n}\n\nexport interface DurationModel extends BasicModel<string> {\n kind: \"duration\"\n schema?: StringSchema\n}\n\nexport interface DurationModelOptions extends Omit<DurationModel, \"kind\"> {}\n\nexport function duration(options?: DurationModelOptions): DurationModel {\n return { kind: \"duration\", ...options }\n}\n\nexport interface ErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> extends BasicModel<\n InferErrorModel<Code, Context>\n> {\n kind: \"error\"\n id: string\n code: Code\n context: Context\n}\n\n/* prettier-ignore */\nexport type InferErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> = { \n code: Code\n context: InferRecordJsonType<Context> \n}\n\nexport interface ErrorModelOptions<Code extends string, Context extends { [key: string]: TypeModels }> extends Omit<\n ErrorModel<Code, Context>,\n \"kind\"\n> {}\n\nexport function error<const Code extends string, Context extends { [key: string]: TypeModels }>(\n options: ErrorModelOptions<Code, Context>,\n): ErrorModel<Code, Context> {\n return { kind: \"error\", ...options }\n}\n\nexport interface EnumsModel<T extends { [key: string]: string }> extends BasicModel<T[keyof T]> {\n id: string\n kind: \"enums\"\n variants: T\n}\n\nexport interface EnumsModelOptions<T extends { [key: string]: string }> extends Omit<EnumsModel<T>, \"kind\"> {}\n\nexport function enums<const T extends { [key: string]: string }>(options: EnumsModelOptions<T>): EnumsModel<T> {\n return { kind: \"enums\", ...options }\n}\n\nexport interface TaggedUnionModel<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends BasicModel<InferTaggedUnionJsonType<Tag, Variants>> {\n id: string\n kind: \"tagged-union\"\n tag: Tag\n variants: Variants\n}\n\nexport type InferTaggedUnionJsonType<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> = {\n [key in keyof Variants]: Variants[key] extends RecordModel<infer R> ? InferRecordJsonType<R> : never\n}[keyof Variants]\n\nexport interface TaggedUnionModelOptions<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends Omit<TaggedUnionModel<Tag, Variants>, \"kind\"> {}\n\nexport function taggedUnion<\n const Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n>(options: TaggedUnionModelOptions<Tag, Variants>): TaggedUnionModel<Tag, Variants> {\n return { kind: \"tagged-union\", ...options }\n}\n\nexport type TypeModels =\n | Int32Model\n | Int64Model\n | Float32Model\n | Float64Model\n | BooleanModel\n | StringModel\n | LiteralModel<string | number | boolean>\n | OptionalModel<TypeModels>\n | ArrayModel<TypeModels>\n | SetModel<TypeModels>\n | MapModel<TypeModels>\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | TaggedUnionModel<string, { [key: string]: any }>\n | DatetimeModel\n | DateModel\n | DurationModel\n | ErrorModel<string, { [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n\n/* prettier-ignore */\nexport type InferModelJsonType<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model? number\n : T extends Int64Model? string\n : T extends Float32Model? number\n : T extends Float64Model? number\n : T extends BooleanModel? boolean\n : T extends StringModel? string\n : T extends LiteralModel<infer R>? R\n : T extends OptionalModel<infer R> ? InferModelJsonType<R> | undefined | null\n : T extends ArrayModel<infer R>? InferModelJsonType<R>[]\n : T extends SetModel<infer R>? InferModelJsonType<R>[]\n : T extends MapModel<infer R>? Record<string, InferModelJsonType<R>>\n : T extends RecordModel<infer R>? InferRecordJsonType<R>\n : T extends UnionModel<infer R>? InferUnionJsonType<R>\n : T extends TaggedUnionModel<infer Tag, infer Variants> ? InferTaggedUnionJsonType<Tag, Variants>\n : T extends DatetimeModel? string\n : T extends DateModel? string\n : T extends DurationModel? string\n : T extends ErrorModel<infer Code, infer Context>? InferErrorModel<Code, Context>\n : T extends EnumsModel<infer R>? R[keyof R]\n : never\n\nexport interface ModelToJsonSchemaOptions {\n model: TypeModels\n target?: \"draft-2020-12\"\n reference?: \"inline\" | \"json-schema\" | \"openapi\"\n depth?: number\n}\n\nexport function generateJsonSchema(options: ModelToJsonSchemaOptions): JsonSchemaObject {\n const { model, target = \"draft-2020-12\", reference = \"json-schema\", depth = 0 } = options ?? {}\n\n const $schema = getSchemaRef(target)\n\n const convert = (partial?: JsonSchemaObject): JsonSchemaObject => ({\n $schema: depth === 0 ? $schema : undefined,\n title: model.title,\n description: model.description,\n examples: model.examples,\n deprecated: model.deprecated,\n default: model.default,\n ...partial,\n ...(\"schema\" in model ? model.schema : {}),\n })\n\n const getReferenceSchema = (schema: TypeModels): JsonSchemaObject => {\n switch (reference) {\n case \"inline\":\n return generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"json-schema\":\n return schema.id != null\n ? { $ref: \"#/$defs/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"openapi\":\n return schema.id != null\n ? { $ref: \"#/components/schemas/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n }\n }\n\n switch (model.kind) {\n case \"int32\":\n return convert({\n type: \"integer\",\n format: \"int32\",\n })\n\n case \"float32\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"float64\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"int64\":\n return convert({\n type: \"string\",\n format: \"int64\",\n })\n\n case \"boolean\":\n return convert({\n type: \"boolean\",\n })\n\n case \"string\":\n return convert({\n type: \"string\",\n })\n\n case \"literal\":\n return convert({\n const: model.value,\n })\n\n case \"optional\": {\n const baseSchema = getReferenceSchema(model.base)\n\n if (\"$ref\" in baseSchema)\n return convert({\n oneOf: [baseSchema, { type: \"null\" }],\n })\n\n const { type = [], ...others } = baseSchema\n\n return convert({\n type: Array.isArray(type) ? ([...new Set([...type, \"null\"])] as JsonSchemaObject[\"type\"]) : [type, \"null\"],\n ...others,\n })\n }\n\n case \"array\":\n return convert({\n type: \"array\",\n items: getReferenceSchema(model.base),\n })\n\n case \"set\":\n return {\n $schema,\n type: \"array\",\n items: getReferenceSchema(model.base),\n uniqueItems: true,\n }\n\n case \"map\":\n return convert({\n type: \"object\",\n additionalProperties: getReferenceSchema(model.base),\n })\n\n case \"record\":\n return convert({\n type: \"object\",\n properties: Object.fromEntries(Object.entries(model.properties).map(([k, v]) => [k, getReferenceSchema(v)])),\n required: Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"optional\")\n .map(([k]) => k),\n additionalProperties: false,\n })\n\n case \"union\":\n return convert({\n oneOf: Object.entries(model.variants).map(([k, v]) => ({\n type: \"object\",\n title: v.title ?? k,\n properties: { [k]: getReferenceSchema(v as TypeModels) },\n required: [k],\n additionalProperties: false,\n })),\n })\n\n case \"tagged-union\":\n return convert({\n oneOf: Object.values(model.variants).map((o) => getReferenceSchema(o)),\n })\n\n case \"datetime\":\n return convert({\n type: \"string\",\n format: \"date-time\",\n })\n\n case \"date\":\n return convert({\n type: \"string\",\n format: \"date\",\n })\n\n case \"duration\":\n return convert({\n type: \"string\",\n format: \"duration\",\n })\n\n case \"error\":\n return convert({\n type: \"object\",\n properties: {\n code: { const: model.code },\n context:\n model.context == null\n ? undefined\n : {\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(model.context).map(([k, v]) => [k, getReferenceSchema(v as TypeModels)]),\n ),\n additionalProperties: false,\n },\n },\n additionalProperties: false,\n })\n\n case \"enums\":\n return convert({\n type: \"string\",\n enum: Object.values(model.variants),\n })\n }\n}\n\nfunction getSchemaRef(target: ModelToJsonSchemaOptions[\"target\"]) {\n switch (target) {\n case \"draft-2020-12\":\n return \"https://json-schema.org/draft/2020-12/schema\"\n }\n}\n\nexport type NamedModel =\n | RecordModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | UnionModel<{ [key: string]: TypeModels }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n","import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchema } from \"@/schemas/json-schema-draft-2020-12\"\nimport type {\n HeaderObject,\n MediaTypeObject,\n OpenAPIObject,\n OperationObject,\n ParameterObjectAsSchema,\n PathItemObject,\n PathsObject,\n RequestBodyObject,\n ResponseObject,\n} from \"@/schemas/openapi-schema\"\nimport { type ExtractPathParams } from \"@/utils\"\n\nimport {\n generateJsonSchema,\n type BooleanModel,\n type Int32Model,\n type Int64Model,\n type LiteralModel,\n type Optionalize,\n type OptionalModel,\n type RecordModel,\n type StringModel,\n type TypeModels,\n} from \"./basic\"\n\nexport type AllowedHttpValue =\n | StringModel\n | Int32Model\n | Int64Model\n | BooleanModel\n | LiteralModel<string | number | boolean>\n | Optionalize<StringModel | Int32Model | Int64Model | BooleanModel | LiteralModel<string | number | boolean>>\n\nexport type PartialOf<T extends { [key: string]: any }, K extends keyof T> = Simplify<\n { [key in Exclude<keyof T, K>]: T[key] } & { [key in K]?: T[key] }\n>\n\nexport interface GenerateOpenapiOptions {\n info: OpenAPIObject[\"info\"]\n routes: HttpRouteModel[]\n securitySchemes?: NonNullable<OpenAPIObject[\"components\"]>[\"securitySchemes\"]\n tags?: OpenAPIObject[\"tags\"]\n servers?: OpenAPIObject[\"servers\"]\n}\n\nexport function generateOpenapi(options: GenerateOpenapiOptions): OpenAPIObject {\n const { info, routes, securitySchemes, tags, servers } = options\n\n const models = collectModelFromRoutes(routes)\n\n return {\n openapi: \"3.2.0\",\n info,\n paths: generatePathsObject(routes),\n components: {\n schemas: Object.fromEntries(generateComponentSchemasFromModels(models)),\n securitySchemes,\n },\n tags,\n servers,\n }\n}\n\nexport function collectModelFromRoutes(routes: HttpRouteModel[]): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const route of routes)\n for (const [id, model] of collectModelsFromRoute(route)) {\n models.set(id, model)\n }\n\n return models\n}\n\nexport function collectModelDeep(model: TypeModels): Map<string, TypeModels> {\n const ret = new Map<string, TypeModels>()\n\n if (model.id != null) ret.set(model.id, model)\n\n switch (model.kind) {\n case \"optional\":\n case \"array\":\n case \"set\":\n case \"map\": {\n for (const [id, nestModel] of collectModelDeep(model.base)) {\n ret.set(id, nestModel)\n }\n\n return ret\n }\n\n case \"record\": {\n for (const property of Object.values(model.properties))\n for (const [id, nestedModel] of collectModelDeep(property)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"union\": {\n for (const variant of Object.values(model.variants))\n for (const [id, nestedModel] of collectModelDeep(variant)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"error\": {\n if (model.context)\n for (const detail of Object.values(model.context)) {\n for (const [id, nestedModel] of collectModelDeep(detail)) ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n default:\n return ret\n }\n}\n\nfunction collectModelsFromRoute(route: HttpRouteModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [route.variables, route.queries, route.headers, route.cookies]\n .filter((o) => !!o)\n .flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (route.content)\n for (const [id, subModel] of collectModelsFromContent(route.content)) {\n models.set(id, subModel)\n }\n\n if (route.responses)\n for (const response of Object.values(route.responses)) {\n for (const [id, subModel] of collectModelsFromResponse(response)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromContent(content: HttpContentModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n if (content.kind !== \"binary-stream-content\") {\n if (content.model)\n for (const [id, subModel] of collectModelDeep(content.model)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromResponse(response: HttpResponseModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [response.cookies, response.headers].filter((o) => !!o).flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (response.content)\n for (const [id, subModel] of collectModelsFromContent(response.content)) {\n models.set(id, subModel)\n }\n\n return models\n}\n\nfunction generateComponentSchemasFromModels(models: Map<string, TypeModels>): Map<string, JsonSchema> {\n const ret = new Map<string, JsonSchema>()\n\n for (const [id, model] of models) {\n const schema = generateJsonSchema({ model, reference: \"openapi\" })\n ret.set(id, schema)\n }\n\n return ret\n}\n\nfunction generatePathsObject(routes: HttpRouteModel[]): PathsObject {\n const pathItems = new Map<string, PathItemObject>()\n\n for (const route of routes) {\n const item = pathItems.get(route.path) ?? {}\n\n pathItems.set(route.path, { ...item, ...generatePathItemObject(route) })\n }\n\n return Object.fromEntries(pathItems)\n}\n\nfunction generatePathItemObject(route: HttpRouteModel): PathItemObject {\n return { [route.method as \"get\"]: generateOperationObject(route) }\n}\n\nfunction getSchemaReference(model: TypeModels) {\n return model.id != null\n ? { $ref: \"#/components/schemas/\" + model.id }\n : generateJsonSchema({ model, reference: \"openapi\" })\n}\n\nfunction generateOperationObject(route: HttpRouteModel): OperationObject {\n const { id, summary, description, variables, queries, headers, cookies, content, responses } = route\n\n const parameterObjects: ParameterObjectAsSchema[] = []\n\n for (const [name, model] of Object.entries(variables)) {\n parameterObjects.push({ in: \"path\", name, required: true, schema: getSchemaReference(model) })\n }\n\n if (queries)\n for (const [name, model] of Object.entries(queries)) {\n parameterObjects.push({\n in: \"query\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (headers)\n for (const [name, model] of Object.entries(headers)) {\n parameterObjects.push({\n in: \"header\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (cookies)\n for (const [name, model] of Object.entries(cookies)) {\n parameterObjects.push({\n in: \"cookie\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n const responseObjects = new Map<string, ResponseObject>()\n\n if (responses)\n for (const [name, response] of Object.entries(responses)) {\n responseObjects.set(response.status.toString(), generateResponseObjectFromResponse(name, response))\n }\n\n return {\n operationId: id,\n summary: summary ?? route.id,\n description,\n parameters: parameterObjects,\n responses: Object.fromEntries(responseObjects),\n requestBody: content == null ? undefined : generateRequestBodyObject(content),\n }\n}\n\nfunction generateRequestBodyObject(content: HttpContentModel): RequestBodyObject {\n switch (content.kind) {\n case \"plain-text-content\":\n case \"json-content\":\n case \"form-content\":\n case \"server-sent-event-content\":\n return {\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n\n default:\n return {\n description: content.description,\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n }\n}\n\nfunction generateMeidaTypeObject(content: HttpContentModel): MediaTypeObject {\n switch (content.kind) {\n case \"plain-text-content\":\n return {\n schema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"json-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n\n case \"json-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: getSchemaReference(content.model),\n }\n\n case \"binary-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: { type: \"string\", format: \"binary\" },\n }\n\n case \"server-sent-event-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"form-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n }\n}\n\nfunction generateResponseObjectFromResponse(name: string, response: HttpResponseModel): ResponseObject {\n const headerObjects = new Map<string, HeaderObject>()\n\n if (response.headers)\n for (const [name, model] of Object.entries(response.headers)) {\n headerObjects.set(name, { schema: getSchemaReference(model), required: model.kind !== \"optional\" })\n }\n\n return {\n description: response.description ?? name,\n headers: headerObjects.size > 0 ? Object.fromEntries(headerObjects) : undefined,\n content:\n response.content == null ? undefined : { [response.content.type]: generateMeidaTypeObject(response.content) },\n }\n}\n\nexport interface HttpResponseModel {\n status: number\n description?: string\n content?: HttpContentModel\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n}\n\nexport interface HttpRouteModel<Path extends string = string> {\n kind: \"http-route\"\n id: string\n path: Path\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\" | \"TRACE\"\n description?: string\n summary?: string\n variables: { [key in ExtractPathParams<Path>]: AllowedHttpValue }\n queries?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n content?: HttpContentModel\n responses?: { [key: string]: HttpResponseModel }\n tags?: string[]\n security?: { [key: string]: string[] }\n}\n\nexport interface HttpRouteModelOptions<Path extends string> extends Omit<HttpRouteModel<Path>, \"kind\"> {}\n\nexport function route<const Path extends string>(options: HttpRouteModelOptions<Path>): HttpRouteModel<Path> {\n return { kind: \"http-route\", ...options }\n}\n\nexport interface PlainTextContentModel {\n kind: \"plain-text-content\"\n type: PlainTextLikeContentType\n model?: StringModel\n}\n\nexport interface PlainTextContentOptions extends Omit<PlainTextContentModel, \"kind\"> {}\n\nexport function plainText(options: PlainTextContentOptions): PlainTextContentModel {\n return { kind: \"plain-text-content\", ...options }\n}\n\nexport interface JsonContentModel {\n kind: \"json-content\"\n type: JsonLikeContentType\n model: TypeModels\n}\n\nexport interface JsonContentOptions extends Omit<JsonContentModel, \"kind\"> {}\n\nexport function json(options: JsonContentOptions): JsonContentModel {\n return { kind: \"json-content\", ...options }\n}\n\nexport interface JsonStreamContentModel {\n kind: \"json-stream-content\"\n type: JsonStreamLikeContentType\n model: TypeModels\n description?: string\n}\n\nexport interface JsonStreamContentOptions extends Omit<JsonStreamContentModel, \"kind\"> {}\n\nexport function jsonStream(options: JsonStreamContentOptions): JsonStreamContentModel {\n return { kind: \"json-stream-content\", ...options }\n}\n\nexport interface BinaryStreamContentModel {\n kind: \"binary-stream-content\"\n type: BinaryLikeContentType\n description?: string\n}\n\nexport interface BinaryStreamContentOptions extends Omit<BinaryStreamContentModel, \"kind\"> {}\n\nexport function binary(options: BinaryStreamContentOptions): BinaryStreamContentModel {\n return { kind: \"binary-stream-content\", ...options }\n}\n\nexport interface FormContentModel<T extends { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }> {\n kind: \"form-content\"\n type: FormLikeContentType\n model: RecordModel<T>\n}\n\nexport interface FormContentOptions<T extends { [key: string]: AllowedHttpValue }> extends Omit<\n FormContentModel<T>,\n \"kind\"\n> {}\n\nexport function form<T extends { [key: string]: AllowedHttpValue }>(\n options: FormContentOptions<T>,\n): FormContentModel<T> {\n return { kind: \"form-content\", ...options }\n}\n\nexport type HttpContentModel =\n | PlainTextContentModel\n | JsonContentModel\n | JsonStreamContentModel\n | BinaryStreamContentModel\n | FormContentModel<{ [key: string]: AllowedHttpValue }>\n | ServerSentEventContentModel\n\nexport type PlainTextLikeContentType =\n | (string & {})\n | \"text/plain\"\n | \"text/html\"\n | \"text/css\"\n | \"text/xml\"\n | \"text/markdown\"\n | \"text/csv\"\n\nexport type JsonLikeContentType =\n | (string & {})\n | \"application/json\"\n | \"application/json; charset=utf-8\"\n | \"application/ld+json\"\n | \"application/hal+json\"\n | \"application/vnd.api+json\"\n | \"application/problem+json\"\n | \"application/schema+json\"\n\nexport type PlainTextStreamLikeContentType = (string & {}) | \"text/event-stream\"\n\nexport type JsonStreamLikeContentType =\n | (string & {})\n | \"application/ndjson\"\n | \"application/x-ndjson\"\n | \"application/jsonl\"\n | \"application/json-seq\"\n | \"application/stream+json\"\n\nexport type BinaryLikeContentType =\n | (string & {})\n | \"application/octet-stream\"\n | \"application/pdf\"\n | \"application/zip\"\n | \"application/gzip\"\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\"\n | \"image/svg+xml\"\n | \"audio/mpeg\"\n | \"audio/wav\"\n | \"video/mp4\"\n | \"video/webm\"\n\nexport type FormLikeContentType = (string & {}) | \"application/x-www-form-urlencoded\" | \"multipart/form-data\"\n\nexport interface ServerSentEventContentModel {\n kind: \"server-sent-event-content\"\n type: \"text/event-stream\"\n model?: TypeModels\n}\n\nexport type ServerSentEventContentOptions = Partial<ServerSentEventContentModel>\n\nexport function sse(options?: ServerSentEventContentOptions): ServerSentEventContentModel {\n const { kind = \"server-sent-event-content\", type = \"text/event-stream\", model } = options ?? {}\n return { kind, type, model }\n}\n","import { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierJavaPlugin from \"prettier-plugin-java\"\n\nimport { literal, type LiteralModel, type NamedModel, type TypeModels } from \"@/type-system/basic\"\nimport { collectModelDeep, collectModelFromRoutes, type HttpRouteModel } from \"@/type-system/http\"\n\nexport interface GenerateJavaClassOptions {\n package: string\n model: NamedModel\n}\n\nexport function generateJavaClass(options: GenerateJavaClassOptions): string {\n const { model, package: packageName } = options\n\n switch (model.kind) {\n case \"record\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(\n ${Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.properties)\n .filter(([__dirname, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n `\n\n case \"union\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n \n @NullMarked\n public sealed interface ${model.id}{\n ${Object.entries(model.variants)\n .map(([k, v]) => generateUnionVariantCode(packageName, model.id, k, v))\n .join(\"\\n\")}\n }\n `\n\n case \"error\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(Context context){\n ${generateStaticPropertyCode(packageName, \"code\", literal({ value: model.code }))}\n\n public ${model.id}(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n this(new Context(${getPropertyNames(model.context)}));\n }\n\n public record Context(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n }\n `\n\n case \"enums\":\n return `\n \n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n public enum ${model.id} {\n\n ${Object.entries(model.variants).map(([k, v]) => `${k}(\"${v}\")`)};\n \n private final String value;\n\n public ${model.id}(String value){\n this.value = value;\n }\n\n @com.fasterxml.jackson.annotation.JsonValue\n public String getValue() { \n return value;\n }\n }\n `\n }\n}\n\nfunction getPropertyNames(properties?: { [key: string]: TypeModels }): string {\n if (properties == null) return \"\"\n return Object.keys(properties).join(\",\")\n}\n\nfunction generateUnionVariantCode(\n packageName: string,\n unionId: string,\n variantName: string,\n variant: TypeModels,\n): string {\n switch (variant.kind) {\n case \"literal\":\n return `\n record ${variantName}() implements ${unionId} {\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateStaticPropertyCode(packageName, \"value\", variant)}\n }\n `\n\n default:\n return `\n record ${variantName}(\n @com.fasterxml.jackson.annotation.JsonCreator\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateModelSignature(packageName, variant)} value\n ) implements ${unionId} {}\n `\n }\n}\n\nfunction generatePropertyCode(packageName: string, name: string, property: TypeModels): string {\n return `${generateModelSignature(packageName, property)} ${name}`\n}\n\nfunction generateStaticPropertyCode(\n packageName: string,\n name: string,\n property: LiteralModel<string | number | boolean>,\n): string {\n return `public ${generateModelSignature(packageName, property)} ${name} = ${generateStaticValue(property.value)}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : value + \"d\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(packageName: string, model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"int\"\n case \"int64\":\n return \"long\"\n case \"float32\":\n return \"float\"\n case \"float64\":\n return \"double\"\n case \"boolean\":\n return \"boolean\"\n case \"date\":\n return \"java.time.LocalDate\"\n case \"datetime\":\n return \"java.time.LocalDateTime\"\n case \"duration\":\n return \"java.time.Duration\"\n case \"array\":\n return `Array<${generateModelSignature(packageName, model.base)}>`\n case \"set\":\n return `Set<${generateModelSignature(packageName, model.base)}>`\n case \"map\":\n return `Map<String, ${generateModelSignature(packageName, model.base)}>`\n case \"optional\":\n switch (model.base.kind) {\n case \"int32\":\n return \"@Nullable Integer\"\n case \"int64\":\n return \"@Nullable Long\"\n case \"float32\":\n return \"@Nullable Float\"\n case \"float64\":\n return \"@Nullable Double\"\n case \"boolean\":\n return \"@Nullable Boolean\"\n case \"optional\":\n return generateModelSignature(packageName, model.base)\n default:\n return `@Nullable ${generateModelSignature(packageName, model.base)}`\n }\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"String\"\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return Number.isInteger(model.value) ? \"int\" : \"double\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return packageName + \".\" + model.id\n }\n}\n\nexport async function formatJava(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"java\",\n plugins: [PrettierJavaPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateJavaOptions {\n package: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateJavaCodes(options: GenerateJavaOptions): Promise<{ path: string; code: string }[]> {\n const { package: packageName, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = packageName + \".\" + id\n\n const path = resolve(srcDir, ...fullname.split(\".\"), \".java\")\n\n const code = await formatJava(generateJavaClass({ package: packageName, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierRustPlugin from \"prettier-plugin-rust\"\n\nimport {\n type EnumsModel,\n type ErrorModel,\n type LiteralModel,\n type RecordModel,\n type TypeModels,\n type UnionModel,\n} from \"@/type-system/basic\"\nimport type { HttpRouteModel } from \"@/type-system/http\"\nimport { collectModelDeep, collectModelFromRoutes } from \"@/type-system/http\"\n\nexport interface GenerateRustCodeOptions {\n module_name: string\n model:\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n}\n\nexport function generateRustCode(options: GenerateRustCodeOptions): string {\n const { model } = options\n\n switch (model.kind) {\n case \"record\":\n return generateRecordCode(model)\n case \"union\":\n return generateUnionCode(model)\n case \"error\":\n return generateErrorCode(model)\n case \"enums\":\n return generateEnumCode(model)\n }\n}\n\nfunction generateRecordCode(model: RecordModel<{ [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const structFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n const hasConstants = constFields.length > 0\n const hasFields = structFields.length > 0\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (hasConstants && hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else if (hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f},\\n`\n })\n code += `}\\n`\n } else if (hasConstants) {\n code += `#[derive(Serialize)]\\npub struct ${structName};\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateUnionCode(model: UnionModel<{ [key: string]: TypeModels }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize)]\\n#[serde(tag = \"type\", content = \"value\")]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toPascalCase(k)\n if (v.kind === \"literal\") {\n code += ` ${variantName},\\n`\n } else {\n const variantType = generateModelSignature(v)\n code += ` ${variantName}(${variantType}),\\n`\n }\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateErrorCode(model: ErrorModel<string, { [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const contextFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (contextFields.length > 0 || constFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n if (contextFields.length > 0) {\n code += ` pub context: ${structName}Context,\\n`\n }\n code += `}\\n\\n`\n\n if (contextFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName}Context {\\n`\n contextFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n }\n\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateEnumCode(model: EnumsModel<{ [key: string]: string }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toUpperSnakeCase(k)\n code += ` #[serde(rename = \"${v}\")]\\n`\n code += ` ${variantName},\\n`\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateStructField(name: string, property: TypeModels): string {\n const fieldName = toSnakeCase(name)\n const fieldType = generateModelSignature(property)\n return `pub ${fieldName}: ${fieldType}`\n}\n\nfunction generateConstField(name: string, property: LiteralModel<string | number | boolean>): string {\n const constName = toUpperSnakeCase(name)\n const constType = generateModelSignature(property)\n const constValue = generateStaticValue(property.value)\n return `const ${constName}: ${constType} = ${constValue}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : `${value}.0`\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"i32\"\n case \"int64\":\n return \"i64\"\n case \"float32\":\n return \"f32\"\n case \"float64\":\n return \"f64\"\n case \"boolean\":\n return \"bool\"\n case \"date\":\n return \"chrono::NaiveDate\"\n case \"datetime\":\n return \"chrono::DateTime<chrono::Utc>\"\n case \"duration\":\n return \"serde_json::Value\"\n case \"array\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"set\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"map\":\n return `std::collections::HashMap<String, ${generateModelSignature(model.base)}>`\n case \"optional\":\n return `Option<${generateModelSignature(model.base)}>`\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"&str\"\n case \"boolean\":\n return \"bool\"\n case \"number\":\n return Number.isInteger(model.value) ? \"i64\" : \"f64\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return model.id ? toPascalCase(model.id) : \"()\"\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^(.)/, (_, c) => (c ? c.toUpperCase() : \"\"))\n}\n\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .replace(/[-\\s]+/g, \"_\")\n .replace(/^_/, \"\")\n .toLowerCase()\n}\n\nfunction toUpperSnakeCase(str: string): string {\n return toSnakeCase(str).toUpperCase()\n}\n\nexport async function formatRust(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"jinx-rust\",\n plugins: [PrettierRustPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateRustOptions {\n module_name: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateRustCodes(options: GenerateRustOptions): Promise<{ path: string; code: string }[]> {\n const { module_name, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = module_name + \"::\" + toSnakeCase(id)\n\n const path = resolve(srcDir, ...fullname.split(\"::\"), \".rs\")\n\n const code = await formatRust(generateRustCode({ module_name: fullname, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import type { Simplify } from \"type-fest\"\n\nimport {\n type ArrayModel,\n type BooleanModel,\n type DateModel,\n type DatetimeModel,\n type DurationModel,\n type EnumsModel,\n type ErrorModel,\n type Float32Model,\n type Float64Model,\n type Int32Model,\n type Int64Model,\n type KeyOfOptional,\n type LiteralModel,\n type MapModel,\n type OptionalModel,\n type RecordModel,\n type SetModel,\n type StringModel,\n type TaggedUnionModel,\n type TypeModels,\n type UnionModel,\n} from \"./basic\"\n\n/* prettier-ignore */\nexport type InferDeserialized<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model ? number\n : T extends Int64Model ? bigint\n : T extends Float32Model ? number\n : T extends Float64Model ? number\n : T extends BooleanModel ? boolean\n : T extends StringModel ? string\n : T extends LiteralModel<infer R> ? R\n : T extends OptionalModel<infer R> ? InferDeserialized<R> | undefined | null\n : T extends ArrayModel<infer R> ? InferDeserialized<R>[]\n : T extends SetModel<infer R> ? Set<InferDeserialized<R>>\n : T extends MapModel<infer R> ? Map<string, InferDeserialized<R>>\n : T extends RecordModel<infer R> ? InferDeserializedRecord<R>\n : T extends UnionModel<infer R> ? InferDeserializedUnion<R>\n : T extends TaggedUnionModel<infer _Tag, infer R> ? InferDeserializedTaggedUnion<R>\n : T extends DatetimeModel ? Temporal.Instant\n : T extends DateModel ? Temporal.Instant\n : T extends DurationModel ? Temporal.Duration\n : T extends ErrorModel<infer Code, infer Context> ? InferDeserializedError<Code, Context>\n : T extends EnumsModel<infer R> ? R[keyof R]\n : never\n\n// prettier-ignore\nexport type InferDeserializedRecord<T extends {[key: string]: TypeModels}, O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferDeserialized<T[key]> } \n & { [key in O]?: InferDeserialized<T[key]> }\n>\n\n// prettier-ignore\nexport type InferDeserializedUnion<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferDeserialized<T[key]> }\n}[keyof T]\n\n// prettier-ignore\nexport type InferDeserializedTaggedUnion<Variants extends {[key: string]: RecordModel<{[key: string]: TypeModels}>}> = {\n [key in keyof Variants]: InferDeserialized<Variants[key]>\n}[keyof Variants]\n\n// prettier-ignore\nexport type InferDeserializedError<Code extends string, Context extends { [key: string]: TypeModels }> = [Context] extends [never] \n ? { code: Code }\n : { code: Code; context: InferDeserializedRecord<Context> }\n\nexport function deserialize<T extends TypeModels>(model: T, json: string): DeserializeResult<InferDeserialized<T>> {\n return deserializeInner(model, JSON.parse(json))\n}\n\nexport function deserializeInner<T extends TypeModels>(model: T, value: any): DeserializeResult<InferDeserialized<T>> {\n type Ret = DeserializeResult<InferDeserialized<T>>\n\n const success = (value: any): Ret => ({ isSuccess: true, value })\n\n if (model.kind === \"string\") {\n if (typeof value === \"string\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"boolean\") {\n if (typeof value === \"boolean\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\") {\n if (typeof value === \"number\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int64\") {\n if (typeof value === \"string\") {\n try {\n return success(BigInt(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"date\" || model.kind === \"datetime\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Instant.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"duration\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Duration.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"optional\") {\n return value == null ? success(undefined) : deserializeInner(model.base, value)\n }\n\n if (model.kind === \"literal\") {\n if (model.value === value) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"array\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(value.map((o) => deserializeInner(model.base, o)))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"set\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(new Set(value.map((o) => deserializeInner(model.base, o))))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"map\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in value) {\n const result = deserializeInner(model.base, value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success(properties)\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"enums\") {\n if (typeof value === \"string\" && Object.values(model.variants).includes(value)) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"record\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in model.properties) {\n const result = deserializeInner(model.properties[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return deserializeFailed(model, value)\n }\n\n return success(Object.fromEntries(properties))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n const result = deserializeInner(model.variants[key], value[key])\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"tagged-union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const tag = value[model.tag]\n\n for (const [key, variant] of Object.entries(model.variants)) {\n const tagModel = variant.properties[model.tag] as TypeModels\n\n if (tagModel.kind === \"literal\" && tagModel.value === tag) {\n const result = deserializeInner(variant, value)\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"code\" in value &&\n \"context\" in value &&\n value.code === model.code &&\n typeof value.context === \"object\" &&\n !Array.isArray(value.context)\n ) {\n const properties = new Map<string, any>()\n\n for (const key in model.context) {\n const result = deserializeInner(model.context[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success({ code: model.code, context: Object.fromEntries(properties) })\n }\n\n return deserializeFailed(model, value)\n}\n\nexport interface DeserializeSuccess<T> {\n isSuccess: true\n value: T\n}\n\nexport interface DeserializeFailed {\n isSuccess: false\n code: \"deserial-failed\"\n context: {\n expect: TypeModels\n receive: any\n }\n}\n\nfunction deserializeFailed(expect: TypeModels, receive: any): DeserializeFailed {\n return {\n isSuccess: false,\n code: \"deserial-failed\",\n context: { expect, receive },\n }\n}\n\nexport type DeserializeResult<T> = DeserializeSuccess<T> | DeserializeFailed\n\nexport function serialize<T extends TypeModels>(model: T, value: InferDeserialized<T>): string {\n if (model.kind === \"string\" || model.kind === \"int64\") {\n const ret = value as string | bigint\n return `\"${ret.toString()}\"`\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\" || model.kind === \"boolean\") {\n const ret = value as string | number | boolean | bigint\n return ret.toString()\n }\n\n if (model.kind === \"array\") {\n const arr = value as unknown[]\n return arr.map((o) => serialize(model.base, o)).join(\",\")\n }\n\n if (model.kind === \"set\") {\n const set = value as Set<unknown>\n return set\n .values()\n .map((o) => serialize(model.base, o))\n .toArray()\n .join(\",\")\n }\n\n if (model.kind === \"map\") {\n const map = value as Map<string, unknown>\n return `{${map.entries().map(([k, v]) => `\"${k}\": ${serialize(model.base, v)}`)}}`\n }\n\n if (model.kind === \"literal\") return model.value.toString()\n\n if (model.kind === \"date\" || model.kind === \"datetime\" || model.kind === \"duration\") {\n const ret = value as Temporal.Instant | Temporal.Duration\n return ret.toJSON()\n }\n\n if (model.kind === \"optional\") {\n return value == null ? \"null\" : serialize(model.base, value)\n }\n\n if (model.kind === \"error\") {\n const properties: string[] = []\n\n for (const key in model.context) {\n properties.push(`\"${key}\": ${serialize(model.context[key], value[key])}`)\n }\n\n return `{\"code\":\"${model.code}\",context:{${properties}}}`\n }\n\n if (model.kind === \"record\") {\n const properties: string[] = []\n\n for (const key in model.properties) {\n properties.push(`\"${key}\": ${serialize(model.properties[key], value[key])}`)\n }\n\n return `{${properties}}`\n }\n\n if (model.kind === \"union\") {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n return `{\"${key}\":${serialize(model.variants[key], value[key])}}`\n }\n }\n\n if (model.kind === \"tagged-union\") {\n return JSON.stringify(value)\n }\n\n // Enums\n return String(value)\n}\n"],"mappings":";;;;;AAqBA,SAAgB,MAAM,SAAyC;CAC7D,OAAO;EAAE,MAAM;EAAS,GAAG;EAAS;;AAUtC,SAAgB,MAAM,SAAyC;CAC7D,OAAO;EAAE,MAAM;EAAS,GAAG;EAAS;;AAUtC,SAAgB,QAAQ,SAA6C;CACnE,OAAO;EAAE,MAAM;EAAW,GAAG;EAAS;;AAUxC,SAAgB,QAAQ,SAA6C;CACnE,OAAO;EAAE,MAAM;EAAW,GAAG;EAAS;;AASxC,SAAgB,QAAQ,SAA6C;CACnE,OAAO;EAAE,MAAM;EAAW,GAAG;EAAS;;AAUxC,SAAgB,OAAO,SAA2C;CAChE,OAAO;EAAE,MAAM;EAAU,GAAG;EAAS;;AAUvC,SAAgB,QAAmD,SAAkD;CACnH,OAAO;EAAE,MAAM;EAAW,GAAG;EAAS;;;;;;;;;AAoCxC,SAAgB,SAA+B,MAAS,SAAqD;CAC3G,OAAO;EAAE,MAAM;EAAY;EAAM,GAAG;EAAS;;AAW/C,SAAgB,MAA4B,MAAS,SAA+C;CAClG,OAAO;EAAE,MAAM;EAAS;EAAM,GAAG;EAAS;;AAW5C,SAAgB,IAA0B,MAAS,SAA2C;CAC5F,OAAO;EAAE,MAAM;EAAO;EAAM,GAAG;EAAS;;AAW1C,SAAgB,IAA0B,MAAS,SAA2C;CAC5F,OAAO;EAAE,MAAM;EAAO;EAAM,GAAG;EAAS;;AAqB1C,SAAgB,OAAsD,SAAgD;CACpH,OAAO;EAAE,MAAM;EAAU,GAAG;EAAS;;AAevC,SAAgB,MAAqD,SAA8C;CACjH,OAAO;EAAE,MAAM;EAAS,GAAG;EAAS;;AAUtC,SAAgB,SAAS,SAA+C;CACtE,OAAO;EAAE,MAAM;EAAY,GAAG;EAAS;;AAUzC,SAAgB,KAAK,SAAuC;CAC1D,OAAO;EAAE,MAAM;EAAQ,GAAG;EAAS;;AAUrC,SAAgB,SAAS,SAA+C;CACtE,OAAO;EAAE,MAAM;EAAY,GAAG;EAAS;;AAuBzC,SAAgB,MACd,SAC2B;CAC3B,OAAO;EAAE,MAAM;EAAS,GAAG;EAAS;;AAWtC,SAAgB,MAAiD,SAA8C;CAC7G,OAAO;EAAE,MAAM;EAAS,GAAG;EAAS;;AAyBtC,SAAgB,YAGd,SAAkF;CAClF,OAAO;EAAE,MAAM;EAAgB,GAAG;EAAS;;AAwD7C,SAAgB,mBAAmB,SAAqD;CACtF,MAAM,EAAE,OAAO,SAAS,iBAAiB,YAAY,eAAe,QAAQ,MAAM,WAAW,EAAE;CAE/F,MAAM,UAAU,aAAa,OAAO;CAEpC,MAAM,WAAW,aAAkD;EACjE,SAAS,UAAU,IAAI,UAAU,KAAA;EACjC,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,SAAS,MAAM;EACf,GAAG;EACH,GAAI,YAAY,QAAQ,MAAM,SAAS,EAAE;EAC1C;CAED,MAAM,sBAAsB,WAAyC;EACnE,QAAQ,WAAR;GACE,KAAK,UACH,OAAO,mBAAmB;IAAE,OAAO;IAAQ;IAAQ;IAAW,OAAO,QAAQ;IAAG,CAAC;GAEnF,KAAK,eACH,OAAO,OAAO,MAAM,OAChB,EAAE,MAAM,aAAa,OAAO,IAAI,GAChC,mBAAmB;IAAE,OAAO;IAAQ;IAAQ;IAAW,OAAO,QAAQ;IAAG,CAAC;GAEhF,KAAK,WACH,OAAO,OAAO,MAAM,OAChB,EAAE,MAAM,0BAA0B,OAAO,IAAI,GAC7C,mBAAmB;IAAE,OAAO;IAAQ;IAAQ;IAAW,OAAO,QAAQ;IAAG,CAAC;;;CAIpF,QAAQ,MAAM,MAAd;EACE,KAAK,SACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,WACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,WACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,SACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,WACH,OAAO,QAAQ,EACb,MAAM,WACP,CAAC;EAEJ,KAAK,UACH,OAAO,QAAQ,EACb,MAAM,UACP,CAAC;EAEJ,KAAK,WACH,OAAO,QAAQ,EACb,OAAO,MAAM,OACd,CAAC;EAEJ,KAAK,YAAY;GACf,MAAM,aAAa,mBAAmB,MAAM,KAAK;GAEjD,IAAI,UAAU,YACZ,OAAO,QAAQ,EACb,OAAO,CAAC,YAAY,EAAE,MAAM,QAAQ,CAAC,EACtC,CAAC;GAEJ,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,WAAW;GAEjC,OAAO,QAAQ;IACb,MAAM,MAAM,QAAQ,KAAK,GAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,GAAgC,CAAC,MAAM,OAAO;IAC1G,GAAG;IACJ,CAAC;;EAGJ,KAAK,SACH,OAAO,QAAQ;GACb,MAAM;GACN,OAAO,mBAAmB,MAAM,KAAK;GACtC,CAAC;EAEJ,KAAK,OACH,OAAO;GACL;GACA,MAAM;GACN,OAAO,mBAAmB,MAAM,KAAK;GACrC,aAAa;GACd;EAEH,KAAK,OACH,OAAO,QAAQ;GACb,MAAM;GACN,sBAAsB,mBAAmB,MAAM,KAAK;GACrD,CAAC;EAEJ,KAAK,UACH,OAAO,QAAQ;GACb,MAAM;GACN,YAAY,OAAO,YAAY,OAAO,QAAQ,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,mBAAmB,EAAE,CAAC,CAAC,CAAC;GAC5G,UAAU,OAAO,QAAQ,MAAM,WAAW,CACvC,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,WAAW,CACzC,KAAK,CAAC,OAAO,EAAE;GAClB,sBAAsB;GACvB,CAAC;EAEJ,KAAK,SACH,OAAO,QAAQ,EACb,OAAO,OAAO,QAAQ,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,QAAQ;GACrD,MAAM;GACN,OAAO,EAAE,SAAS;GAClB,YAAY,GAAG,IAAI,mBAAmB,EAAgB,EAAE;GACxD,UAAU,CAAC,EAAE;GACb,sBAAsB;GACvB,EAAE,EACJ,CAAC;EAEJ,KAAK,gBACH,OAAO,QAAQ,EACb,OAAO,OAAO,OAAO,MAAM,SAAS,CAAC,KAAK,MAAM,mBAAmB,EAAE,CAAC,EACvE,CAAC;EAEJ,KAAK,YACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,QACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,YACH,OAAO,QAAQ;GACb,MAAM;GACN,QAAQ;GACT,CAAC;EAEJ,KAAK,SACH,OAAO,QAAQ;GACb,MAAM;GACN,YAAY;IACV,MAAM,EAAE,OAAO,MAAM,MAAM;IAC3B,SACE,MAAM,WAAW,OACb,KAAA,IACA;KACE,MAAM;KACN,YAAY,OAAO,YACjB,OAAO,QAAQ,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,mBAAmB,EAAgB,CAAC,CAAC,CACxF;KACD,sBAAsB;KACvB;IACR;GACD,sBAAsB;GACvB,CAAC;EAEJ,KAAK,SACH,OAAO,QAAQ;GACb,MAAM;GACN,MAAM,OAAO,OAAO,MAAM,SAAS;GACpC,CAAC;;;AAIR,SAAS,aAAa,QAA4C;CAChE,QAAQ,QAAR;EACE,KAAK,iBACH,OAAO;;;;;ACxeb,SAAgB,gBAAgB,SAAgD;CAC9E,MAAM,EAAE,MAAM,QAAQ,iBAAiB,MAAM,YAAY;CAEzD,MAAM,SAAS,uBAAuB,OAAO;CAE7C,OAAO;EACL,SAAS;EACT;EACA,OAAO,oBAAoB,OAAO;EAClC,YAAY;GACV,SAAS,OAAO,YAAY,mCAAmC,OAAO,CAAC;GACvE;GACD;EACD;EACA;EACD;;AAGH,SAAgB,uBAAuB,QAAmD;CACxF,MAAM,yBAAS,IAAI,KAAyB;CAE5C,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,CAAC,IAAI,UAAU,uBAAuB,MAAM,EACrD,OAAO,IAAI,IAAI,MAAM;CAGzB,OAAO;;AAGT,SAAgB,iBAAiB,OAA4C;CAC3E,MAAM,sBAAM,IAAI,KAAyB;CAEzC,IAAI,MAAM,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI,MAAM;CAE9C,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACH,KAAK,MAAM,CAAC,IAAI,cAAc,iBAAiB,MAAM,KAAK,EACxD,IAAI,IAAI,IAAI,UAAU;GAGxB,OAAO;EAGT,KAAK;GACH,KAAK,MAAM,YAAY,OAAO,OAAO,MAAM,WAAW,EACpD,KAAK,MAAM,CAAC,IAAI,gBAAgB,iBAAiB,SAAS,EACxD,IAAI,IAAI,IAAI,YAAY;GAG5B,OAAO;EAGT,KAAK;GACH,KAAK,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS,EACjD,KAAK,MAAM,CAAC,IAAI,gBAAgB,iBAAiB,QAAQ,EACvD,IAAI,IAAI,IAAI,YAAY;GAG5B,OAAO;EAGT,KAAK;GACH,IAAI,MAAM,SACR,KAAK,MAAM,UAAU,OAAO,OAAO,MAAM,QAAQ,EAC/C,KAAK,MAAM,CAAC,IAAI,gBAAgB,iBAAiB,OAAO,EAAE,IAAI,IAAI,IAAI,YAAY;GAGtF,OAAO;EAGT,SACE,OAAO;;;AAIb,SAAS,uBAAuB,OAAgD;CAC9E,MAAM,yBAAS,IAAI,KAAyB;CAE5C,KAAK,MAAM,SAAS;EAAC,MAAM;EAAW,MAAM;EAAS,MAAM;EAAS,MAAM;EAAQ,CAC/E,QAAQ,MAAM,CAAC,CAAC,EAAE,CAClB,QAAQ,OAAO,OAAO,EACvB,KAAK,MAAM,CAAC,IAAI,aAAa,iBAAiB,MAAM,EAClD,OAAO,IAAI,IAAI,SAAS;CAI5B,IAAI,MAAM,SACR,KAAK,MAAM,CAAC,IAAI,aAAa,yBAAyB,MAAM,QAAQ,EAClE,OAAO,IAAI,IAAI,SAAS;CAG5B,IAAI,MAAM,WACR,KAAK,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,EACnD,KAAK,MAAM,CAAC,IAAI,aAAa,0BAA0B,SAAS,EAC9D,OAAO,IAAI,IAAI,SAAS;CAI9B,OAAO;;AAGT,SAAS,yBAAyB,SAAoD;CACpF,MAAM,yBAAS,IAAI,KAAyB;CAE5C,IAAI,QAAQ,SAAS;MACf,QAAQ,OACV,KAAK,MAAM,CAAC,IAAI,aAAa,iBAAiB,QAAQ,MAAM,EAC1D,OAAO,IAAI,IAAI,SAAS;;CAI9B,OAAO;;AAGT,SAAS,0BAA0B,UAAsD;CACvF,MAAM,yBAAS,IAAI,KAAyB;CAE5C,KAAK,MAAM,SAAS,CAAC,SAAS,SAAS,SAAS,QAAQ,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,EAChG,KAAK,MAAM,CAAC,IAAI,aAAa,iBAAiB,MAAM,EAClD,OAAO,IAAI,IAAI,SAAS;CAI5B,IAAI,SAAS,SACX,KAAK,MAAM,CAAC,IAAI,aAAa,yBAAyB,SAAS,QAAQ,EACrE,OAAO,IAAI,IAAI,SAAS;CAG5B,OAAO;;AAGT,SAAS,mCAAmC,QAA0D;CACpG,MAAM,sBAAM,IAAI,KAAyB;CAEzC,KAAK,MAAM,CAAC,IAAI,UAAU,QAAQ;EAChC,MAAM,SAAS,mBAAmB;GAAE;GAAO,WAAW;GAAW,CAAC;EAClE,IAAI,IAAI,IAAI,OAAO;;CAGrB,OAAO;;AAGT,SAAS,oBAAoB,QAAuC;CAClE,MAAM,4BAAY,IAAI,KAA6B;CAEnD,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE;EAE5C,UAAU,IAAI,MAAM,MAAM;GAAE,GAAG;GAAM,GAAG,uBAAuB,MAAM;GAAE,CAAC;;CAG1E,OAAO,OAAO,YAAY,UAAU;;AAGtC,SAAS,uBAAuB,OAAuC;CACrE,OAAO,GAAG,MAAM,SAAkB,wBAAwB,MAAM,EAAE;;AAGpE,SAAS,mBAAmB,OAAmB;CAC7C,OAAO,MAAM,MAAM,OACf,EAAE,MAAM,0BAA0B,MAAM,IAAI,GAC5C,mBAAmB;EAAE;EAAO,WAAW;EAAW,CAAC;;AAGzD,SAAS,wBAAwB,OAAwC;CACvE,MAAM,EAAE,IAAI,SAAS,aAAa,WAAW,SAAS,SAAS,SAAS,SAAS,cAAc;CAE/F,MAAM,mBAA8C,EAAE;CAEtD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,UAAU,EACnD,iBAAiB,KAAK;EAAE,IAAI;EAAQ;EAAM,UAAU;EAAM,QAAQ,mBAAmB,MAAM;EAAE,CAAC;CAGhG,IAAI,SACF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,EACjD,iBAAiB,KAAK;EACpB,IAAI;EACJ;EACA,UAAU,MAAM,SAAS;EACzB,QAAQ,mBAAmB,MAAM;EAClC,CAAC;CAGN,IAAI,SACF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,EACjD,iBAAiB,KAAK;EACpB,IAAI;EACJ;EACA,UAAU,MAAM,SAAS;EACzB,QAAQ,mBAAmB,MAAM;EAClC,CAAC;CAGN,IAAI,SACF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,EACjD,iBAAiB,KAAK;EACpB,IAAI;EACJ;EACA,UAAU,MAAM,SAAS;EACzB,QAAQ,mBAAmB,MAAM;EAClC,CAAC;CAGN,MAAM,kCAAkB,IAAI,KAA6B;CAEzD,IAAI,WACF,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,EACtD,gBAAgB,IAAI,SAAS,OAAO,UAAU,EAAE,mCAAmC,MAAM,SAAS,CAAC;CAGvG,OAAO;EACL,aAAa;EACb,SAAS,WAAW,MAAM;EAC1B;EACA,YAAY;EACZ,WAAW,OAAO,YAAY,gBAAgB;EAC9C,aAAa,WAAW,OAAO,KAAA,IAAY,0BAA0B,QAAQ;EAC9E;;AAGH,SAAS,0BAA0B,SAA8C;CAC/E,QAAQ,QAAQ,MAAhB;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,6BACH,OAAO,EACL,SAAS,GAAG,QAAQ,OAAO,wBAAwB,QAAQ,EAAE,EAC9D;EAEH,SACE,OAAO;GACL,aAAa,QAAQ;GACrB,SAAS,GAAG,QAAQ,OAAO,wBAAwB,QAAQ,EAAE;GAC9D;;;AAIP,SAAS,wBAAwB,SAA4C;CAC3E,QAAQ,QAAQ,MAAhB;EACE,KAAK,sBACH,OAAO,EACL,QAAQ,QAAQ,QAAQ,mBAAmB,QAAQ,MAAM,GAAG,EAAE,MAAM,UAAU,EAC/E;EAEH,KAAK,gBACH,OAAO,EACL,QAAQ,mBAAmB,QAAQ,MAAM,EAC1C;EAEH,KAAK,uBACH,OAAO;GACL,QAAQ;IAAE,MAAM;IAAU,QAAQ;IAAU;GAC5C,YAAY,mBAAmB,QAAQ,MAAM;GAC9C;EAEH,KAAK,yBACH,OAAO;GACL,QAAQ;IAAE,MAAM;IAAU,QAAQ;IAAU;GAC5C,YAAY;IAAE,MAAM;IAAU,QAAQ;IAAU;GACjD;EAEH,KAAK,6BACH,OAAO;GACL,QAAQ;IAAE,MAAM;IAAU,QAAQ;IAAU;GAC5C,YAAY,QAAQ,QAAQ,mBAAmB,QAAQ,MAAM,GAAG,EAAE,MAAM,UAAU;GACnF;EAEH,KAAK,gBACH,OAAO,EACL,QAAQ,mBAAmB,QAAQ,MAAM,EAC1C;;;AAIP,SAAS,mCAAmC,MAAc,UAA6C;CACrG,MAAM,gCAAgB,IAAI,KAA2B;CAErD,IAAI,SAAS,SACX,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,QAAQ,EAC1D,cAAc,IAAI,MAAM;EAAE,QAAQ,mBAAmB,MAAM;EAAE,UAAU,MAAM,SAAS;EAAY,CAAC;CAGvG,OAAO;EACL,aAAa,SAAS,eAAe;EACrC,SAAS,cAAc,OAAO,IAAI,OAAO,YAAY,cAAc,GAAG,KAAA;EACtE,SACE,SAAS,WAAW,OAAO,KAAA,IAAY,GAAG,SAAS,QAAQ,OAAO,wBAAwB,SAAS,QAAQ,EAAE;EAChH;;AA8BH,SAAgB,MAAiC,SAA4D;CAC3G,OAAO;EAAE,MAAM;EAAc,GAAG;EAAS;;AAW3C,SAAgB,UAAU,SAAyD;CACjF,OAAO;EAAE,MAAM;EAAsB,GAAG;EAAS;;AAWnD,SAAgB,KAAK,SAA+C;CAClE,OAAO;EAAE,MAAM;EAAgB,GAAG;EAAS;;AAY7C,SAAgB,WAAW,SAA2D;CACpF,OAAO;EAAE,MAAM;EAAuB,GAAG;EAAS;;AAWpD,SAAgB,OAAO,SAA+D;CACpF,OAAO;EAAE,MAAM;EAAyB,GAAG;EAAS;;AActD,SAAgB,KACd,SACqB;CACrB,OAAO;EAAE,MAAM;EAAgB,GAAG;EAAS;;AAkE7C,SAAgB,IAAI,SAAsE;CACxF,MAAM,EAAE,OAAO,6BAA6B,OAAO,qBAAqB,UAAU,WAAW,EAAE;CAC/F,OAAO;EAAE;EAAM;EAAM;EAAO;;;;AC7e9B,SAAgB,kBAAkB,SAA2C;CAC3E,MAAM,EAAE,OAAO,SAAS,gBAAgB;CAExC,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO;sBACS,YAAY;;;;;4BAKN,MAAM,GAAG;kBACnB,OAAO,QAAQ,MAAM,WAAW,CAC/B,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,qBAAqB,aAAa,GAAG,EAAE,CAAC,CAAC;;kBAE1D,OAAO,QAAQ,MAAM,WAAW,CAC/B,QAAQ,CAAC,WAAW,OAAO,EAAE,SAAS,UAAU,CAChD,KAAK,CAAC,GAAG,OACR,2BAA2B,aAAa,GAAG,EAA6C,CACzF,CACA,KAAK,IAAI,CAAC;;;EAIzB,KAAK,SACH,OAAO;sBACS,YAAY;;;;;sCAKI,MAAM,GAAG;kBAC7B,OAAO,QAAQ,MAAM,SAAS,CAC7B,KAAK,CAAC,GAAG,OAAO,yBAAyB,aAAa,MAAM,IAAI,GAAG,EAAE,CAAC,CACtE,KAAK,KAAK,CAAC;;;EAI1B,KAAK,SACH,OAAO;sBACS,YAAY;;;;;4BAKN,MAAM,GAAG;kBACnB,2BAA2B,aAAa,QAAQ,QAAQ,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC;;yBAEzE,MAAM,GAAG;sBACZ,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CAClC,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,qBAAqB,aAAa,GAAG,EAAE,CAAC,CAAC;;uCAEzC,iBAAiB,MAAM,QAAQ,CAAC;;;;sBAIjD,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CAClC,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,qBAAqB,aAAa,GAAG,EAAE,CAAC,CAAC;;sBAE1D,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CAClC,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OACR,2BAA2B,aAAa,GAAG,EAA6C,CACzF,CACA,KAAK,IAAI,CAAC;;;;EAK7B,KAAK,SACH,OAAO;;sBAES,YAAY;;;;0BAIR,MAAM,GAAG;;kBAEjB,OAAO,QAAQ,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;;;;yBAIxD,MAAM,GAAG;;;;;;;;;;;;AAalC,SAAS,iBAAiB,YAAoD;CAC5E,IAAI,cAAc,MAAM,OAAO;CAC/B,OAAO,OAAO,KAAK,WAAW,CAAC,KAAK,IAAI;;AAG1C,SAAS,yBACP,aACA,SACA,aACA,SACQ;CACR,QAAQ,QAAQ,MAAhB;EACE,KAAK,WACH,OAAO;qBACQ,YAAY,gBAAgB,QAAQ;;kBAEvC,2BAA2B,aAAa,SAAS,QAAQ,CAAC;;;EAIxE,SACE,OAAO;qBACQ,YAAY;;;kBAGfA,yBAAuB,aAAa,QAAQ,CAAC;2BACpC,QAAQ;;;;AAKnC,SAAS,qBAAqB,aAAqB,MAAc,UAA8B;CAC7F,OAAO,GAAGA,yBAAuB,aAAa,SAAS,CAAC,GAAG;;AAG7D,SAAS,2BACP,aACA,MACA,UACQ;CACR,OAAO,UAAUA,yBAAuB,aAAa,SAAS,CAAC,GAAG,KAAK,KAAKC,sBAAoB,SAAS,MAAM;;AAGjH,SAASA,sBAAoB,OAA0C;CACrE,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,IAAI,MAAM;EACnB,KAAK,WACH,OAAO,OAAO,MAAM;EACtB,KAAK,UACH,OAAO,OAAO,UAAU,MAAM,GAAG,OAAO,MAAM,GAAG,QAAQ;EAC3D,SACE,MAAM,MAAM,4BAA4B;;;AAI9C,SAASD,yBAAuB,aAAqB,OAA2B;CAC9E,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO,SAASA,yBAAuB,aAAa,MAAM,KAAK,CAAC;EAClE,KAAK,OACH,OAAO,OAAOA,yBAAuB,aAAa,MAAM,KAAK,CAAC;EAChE,KAAK,OACH,OAAO,eAAeA,yBAAuB,aAAa,MAAM,KAAK,CAAC;EACxE,KAAK,YACH,QAAQ,MAAM,KAAK,MAAnB;GACE,KAAK,SACH,OAAO;GACT,KAAK,SACH,OAAO;GACT,KAAK,WACH,OAAO;GACT,KAAK,WACH,OAAO;GACT,KAAK,WACH,OAAO;GACT,KAAK,YACH,OAAOA,yBAAuB,aAAa,MAAM,KAAK;GACxD,SACE,OAAO,aAAaA,yBAAuB,aAAa,MAAM,KAAK;;EAEzE,KAAK,WACH,QAAQ,OAAO,MAAM,OAArB;GACE,KAAK,UACH,OAAO;GACT,KAAK,WACH,OAAO;GACT,KAAK,UACH,OAAO,OAAO,UAAU,MAAM,MAAM,GAAG,QAAQ;GACjD,SACE,MAAM,MAAM,4BAA4B;;EAE9C,SACE,OAAO,cAAc,MAAM,MAAM;;;AAIvC,eAAsB,WAAW,MAA+B;CAC9D,IAAI;EACF,OAAO,MAAM,OAAO,MAAM;GACxB,QAAQ;GACR,SAAS,CAAC,mBAAmB;GAC9B,CAAC;UACK,OAAO;EACd,QAAQ,MAAM,MAAM;EACpB,OAAO;;;AAWX,eAAsB,kBAAkB,SAAyE;CAC/G,MAAM,EAAE,SAAS,aAAa,QAAQ,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK;CAEnE,MAAM,wBAAQ,IAAI,KAAqB;CAEvC,MAAM,cAAc,uBAAuB,OAAO;CAElD,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,CAAC,IAAI,aAAa,iBAAiB,MAAM,EAClD,YAAY,IAAI,IAAI,SAAS;CAGjC,KAAK,MAAM,CAAC,IAAI,UAAU,aAAa;EACrC,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS;EAI3G,MAAM,OAAO,QAAQ,QAAQ,IAFZ,cAAc,MAAM,IAEI,MAAM,IAAI,EAAE,QAAQ;EAE7D,MAAM,OAAO,MAAM,WAAW,kBAAkB;GAAE,SAAS;GAAa;GAAO,CAAC,CAAC;EAEjF,MAAM,IAAI,MAAM,KAAK;;CAGvB,OAAO,MACJ,SAAS,CACT,KAAK,CAAC,MAAM,WAAW;EAAE;EAAM;EAAM,EAAE,CACvC,SAAS;;;;ACvPd,SAAgB,iBAAiB,SAA0C;CACzE,MAAM,EAAE,UAAU;CAElB,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO,mBAAmB,MAAM;EAClC,KAAK,SACH,OAAO,kBAAkB,MAAM;EACjC,KAAK,SACH,OAAO,kBAAkB,MAAM;EACjC,KAAK,SACH,OAAO,iBAAiB,MAAM;;;AAIpC,SAAS,mBAAmB,OAA2D;CACrF,MAAM,aAAa,aAAa,MAAM,MAAM,UAAU;CACtD,MAAM,eAAe,OAAO,QAAQ,MAAM,WAAW,CAClD,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,oBAAoB,GAAG,EAAE,CAAC;CAE7C,MAAM,cAAc,OAAO,QAAQ,MAAM,WAAW,CACjD,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,mBAAmB,GAAG,EAA6C,CAAC;CAEvF,MAAM,eAAe,YAAY,SAAS;CAC1C,MAAM,YAAY,aAAa,SAAS;CAExC,IAAI,OAAO;CAEX,IAAI,gBAAgB,WAAW;EAC7B,QAAQ,oCAAoC,WAAW;EACvD,aAAa,SAAS,MAAM;GAC1B,QAAQ,OAAO,EAAE;IACjB;EACF,QAAQ;EACR,QAAQ,QAAQ,WAAW;EAC3B,QAAQ,uCAAuC,MAAM,GAAG;EACxD,YAAY,SAAS,MAAM;GACzB,QAAQ,WAAW,EAAE;IACrB;EACF,QAAQ;QACH,IAAI,WAAW;EACpB,QAAQ,oCAAoC,WAAW;EACvD,aAAa,SAAS,MAAM;GAC1B,QAAQ,OAAO,EAAE;IACjB;EACF,QAAQ;QACH,IAAI,cAAc;EACvB,QAAQ,oCAAoC,WAAW;EACvD,QAAQ,QAAQ,WAAW;EAC3B,QAAQ,uCAAuC,MAAM,GAAG;EACxD,YAAY,SAAS,MAAM;GACzB,QAAQ,WAAW,EAAE;IACrB;EACF,QAAQ;;CAGV,OAAO;;AAGT,SAAS,kBAAkB,OAA0D;CACnF,MAAM,WAAW,aAAa,MAAM,MAAM,UAAU;CAEpD,IAAI,OAAO;CACX,QAAQ,6EAA6E,SAAS;CAE9F,OAAO,QAAQ,MAAM,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO;EACjD,MAAM,cAAc,aAAa,EAAE;EACnC,IAAI,EAAE,SAAS,WACb,QAAQ,OAAO,YAAY;OACtB;GACL,MAAM,cAAc,uBAAuB,EAAE;GAC7C,QAAQ,OAAO,YAAY,GAAG,YAAY;;GAE5C;CAEF,QAAQ;CACR,OAAO;;AAGT,SAAS,kBAAkB,OAAkE;CAC3F,MAAM,aAAa,aAAa,MAAM,MAAM,UAAU;CACtD,MAAM,gBAAgB,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CACtD,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,oBAAoB,GAAG,EAAE,CAAC;CAE7C,MAAM,cAAc,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CACpD,QAAQ,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,CACxC,KAAK,CAAC,GAAG,OAAO,mBAAmB,GAAG,EAA6C,CAAC;CAEvF,IAAI,OAAO;CAEX,IAAI,cAAc,SAAS,KAAK,YAAY,SAAS,GAAG;EACtD,QAAQ,oCAAoC,WAAW;EACvD,QAAQ;EACR,IAAI,cAAc,SAAS,GACzB,QAAQ,oBAAoB,WAAW;EAEzC,QAAQ;EAER,IAAI,cAAc,SAAS,GAAG;GAC5B,QAAQ,oCAAoC,WAAW;GACvD,cAAc,SAAS,MAAM;IAC3B,QAAQ,OAAO,EAAE;KACjB;GACF,QAAQ;;EAGV,QAAQ,QAAQ,WAAW;EAC3B,QAAQ,uCAAuC,MAAM,KAAK;EAC1D,YAAY,SAAS,MAAM;GACzB,QAAQ,WAAW,EAAE;IACrB;EACF,QAAQ;QACH;EACL,QAAQ,oCAAoC,WAAW;EACvD,QAAQ;EACR,QAAQ;EACR,QAAQ,QAAQ,WAAW;EAC3B,QAAQ,uCAAuC,MAAM,KAAK;EAC1D,QAAQ;;CAGV,OAAO;;AAGT,SAAS,iBAAiB,OAAsD;CAC9E,MAAM,WAAW,aAAa,MAAM,MAAM,UAAU;CAEpD,IAAI,OAAO;CACX,QAAQ,qEAAqE,SAAS;CAEtF,OAAO,QAAQ,MAAM,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO;EACjD,MAAM,cAAc,iBAAiB,EAAE;EACvC,QAAQ,yBAAyB,EAAE;EACnC,QAAQ,OAAO,YAAY;GAC3B;CAEF,QAAQ;CACR,OAAO;;AAGT,SAAS,oBAAoB,MAAc,UAA8B;CAGvE,OAAO,OAFW,YAAY,KAEP,CAAC,IADN,uBAAuB,SACJ;;AAGvC,SAAS,mBAAmB,MAAc,UAA2D;CAInG,OAAO,SAHW,iBAAiB,KAGV,CAAC,IAFR,uBAAuB,SAEF,CAAC,KADrB,oBAAoB,SAAS,MACO;;AAGzD,SAAS,oBAAoB,OAA0C;CACrE,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,IAAI,MAAM;EACnB,KAAK,WACH,OAAO,OAAO,MAAM;EACtB,KAAK,UACH,OAAO,OAAO,UAAU,MAAM,GAAG,OAAO,MAAM,GAAG,GAAG,MAAM;EAC5D,SACE,MAAM,MAAM,4BAA4B;;;AAI9C,SAAS,uBAAuB,OAA2B;CACzD,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO,OAAO,uBAAuB,MAAM,KAAK,CAAC;EACnD,KAAK,OACH,OAAO,OAAO,uBAAuB,MAAM,KAAK,CAAC;EACnD,KAAK,OACH,OAAO,qCAAqC,uBAAuB,MAAM,KAAK,CAAC;EACjF,KAAK,YACH,OAAO,UAAU,uBAAuB,MAAM,KAAK,CAAC;EACtD,KAAK,WACH,QAAQ,OAAO,MAAM,OAArB;GACE,KAAK,UACH,OAAO;GACT,KAAK,WACH,OAAO;GACT,KAAK,UACH,OAAO,OAAO,UAAU,MAAM,MAAM,GAAG,QAAQ;GACjD,SACE,MAAM,MAAM,4BAA4B;;EAE9C,SACE,OAAO,MAAM,KAAK,aAAa,MAAM,GAAG,GAAG;;;AAIjD,SAAS,aAAa,KAAqB;CACzC,OAAO,IACJ,QAAQ,iBAAiB,GAAG,MAAO,IAAI,EAAE,aAAa,GAAG,GAAI,CAC7D,QAAQ,SAAS,GAAG,MAAO,IAAI,EAAE,aAAa,GAAG,GAAI;;AAG1D,SAAS,YAAY,KAAqB;CACxC,OAAO,IACJ,QAAQ,YAAY,MAAM,CAC1B,QAAQ,WAAW,IAAI,CACvB,QAAQ,MAAM,GAAG,CACjB,aAAa;;AAGlB,SAAS,iBAAiB,KAAqB;CAC7C,OAAO,YAAY,IAAI,CAAC,aAAa;;AAGvC,eAAsB,WAAW,MAA+B;CAC9D,IAAI;EACF,OAAO,MAAM,OAAO,MAAM;GACxB,QAAQ;GACR,SAAS,CAAC,mBAAmB;GAC9B,CAAC;UACK,OAAO;EACd,QAAQ,MAAM,MAAM;EACpB,OAAO;;;AAWX,eAAsB,kBAAkB,SAAyE;CAC/G,MAAM,EAAE,aAAa,QAAQ,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK;CAE1D,MAAM,wBAAQ,IAAI,KAAqB;CAEvC,MAAM,cAAc,uBAAuB,OAAO;CAElD,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,CAAC,IAAI,aAAa,iBAAiB,MAAM,EAClD,YAAY,IAAI,IAAI,SAAS;CAGjC,KAAK,MAAM,CAAC,IAAI,UAAU,aAAa;EACrC,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS;EAE3G,MAAM,WAAW,cAAc,OAAO,YAAY,GAAG;EAErD,MAAM,OAAO,QAAQ,QAAQ,GAAG,SAAS,MAAM,KAAK,EAAE,MAAM;EAE5D,MAAM,OAAO,MAAM,WAAW,iBAAiB;GAAE,aAAa;GAAU;GAAO,CAAC,CAAC;EAEjF,MAAM,IAAI,MAAM,KAAK;;CAGvB,OAAO,MACJ,SAAS,CACT,KAAK,CAAC,MAAM,WAAW;EAAE;EAAM;EAAM,EAAE,CACvC,SAAS;;;;ACrOd,SAAgB,YAAkC,OAAU,MAAuD;CACjH,OAAO,iBAAiB,OAAO,KAAK,MAAM,KAAK,CAAC;;AAGlD,SAAgB,iBAAuC,OAAU,OAAqD;CAGpH,MAAM,WAAW,WAAqB;EAAE,WAAW;EAAM;EAAO;CAEhE,IAAI,MAAM,SAAS,UAAU;EAC3B,IAAI,OAAO,UAAU,UAAU,OAAO,QAAQ,MAAM;EAEpD,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,WAAW;EAC5B,IAAI,OAAO,UAAU,WAAW,OAAO,QAAQ,MAAM;EAErD,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW;EAClF,IAAI,OAAO,UAAU,UAAU,OAAO,QAAQ,MAAM;EAEpD,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,SAAS;EAC1B,IAAI,OAAO,UAAU,UACnB,IAAI;GACF,OAAO,QAAQ,OAAO,MAAM,CAAC;UACvB;GACN,OAAO,kBAAkB,OAAO,MAAM;;EAI1C,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,YAAY;EACtD,IAAI,OAAO,UAAU,UACnB,IAAI;GACF,OAAO,QAAQ,SAAS,QAAQ,KAAK,MAAM,CAAC;UACtC;GACN,OAAO,kBAAkB,OAAO,MAAM;;EAI1C,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,YAAY;EAC7B,IAAI,OAAO,UAAU,UACnB,IAAI;GACF,OAAO,QAAQ,SAAS,SAAS,KAAK,MAAM,CAAC;UACvC;GACN,OAAO,kBAAkB,OAAO,MAAM;;EAI1C,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,YACjB,OAAO,SAAS,OAAO,QAAQ,KAAA,EAAU,GAAG,iBAAiB,MAAM,MAAM,MAAM;CAGjF,IAAI,MAAM,SAAS,WAAW;EAC5B,IAAI,MAAM,UAAU,OAAO,OAAO,QAAQ,MAAM;EAEhD,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,SAAS;EAC1B,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,EACnD,OAAO,QAAQ,MAAM,KAAK,MAAM,iBAAiB,MAAM,MAAM,EAAE,CAAC,CAAC;EAGnE,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,OAAO;EACxB,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,EACnD,OAAO,QAAQ,IAAI,IAAI,MAAM,KAAK,MAAM,iBAAiB,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;EAG5E,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,OAAO;EACxB,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,EAAE;GACtD,MAAM,6BAAa,IAAI,KAAkB;GAEzC,KAAK,MAAM,OAAO,OAAO;IACvB,MAAM,SAAS,iBAAiB,MAAM,MAAM,MAAM,KAAK;IAEvD,IAAI,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO,MAAM;SAClD,OAAO;;GAGd,OAAO,QAAQ,WAAW;;EAG5B,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,SAAS;EAC1B,IAAI,OAAO,UAAU,YAAY,OAAO,OAAO,MAAM,SAAS,CAAC,SAAS,MAAM,EAAE,OAAO,QAAQ,MAAM;EAErG,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,UAAU;EAC3B,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,EAAE;GACtD,MAAM,6BAAa,IAAI,KAAkB;GAEzC,KAAK,MAAM,OAAO,MAAM,YAAY;IAClC,MAAM,SAAS,iBAAiB,MAAM,WAAW,MAAM,MAAM,KAAK;IAElE,IAAI,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO,MAAM;SAClD,OAAO,kBAAkB,OAAO,MAAM;;GAG7C,OAAO,QAAQ,OAAO,YAAY,WAAW,CAAC;;EAGhD,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,SAAS;EAC1B,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,EAAE;GACtD,MAAM,cAAc,OAAO,KAAK,MAAM,SAAS;GAE/C,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,OAAO;IAChB,MAAM,SAAS,iBAAiB,MAAM,SAAS,MAAM,MAAM,KAAK;IAEhE,IAAI,OAAO,WAAW,OAAO,QAAQ,GAAG,MAAM,OAAO,OAAO,CAAC;;;EAInE,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IAAI,MAAM,SAAS,gBAAgB;EACjC,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,EAAE;GACtD,MAAM,MAAM,MAAM,MAAM;GAExB,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,MAAM,SAAS,EAAE;IAC3D,MAAM,WAAW,QAAQ,WAAW,MAAM;IAE1C,IAAI,SAAS,SAAS,aAAa,SAAS,UAAU,KAAK;KACzD,MAAM,SAAS,iBAAiB,SAAS,MAAM;KAE/C,IAAI,OAAO,WAAW,OAAO,QAAQ,GAAG,MAAM,OAAO,OAAO,CAAC;;;;EAKnE,OAAO,kBAAkB,OAAO,MAAM;;CAGxC,IACE,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,IACrB,UAAU,SACV,aAAa,SACb,MAAM,SAAS,MAAM,QACrB,OAAO,MAAM,YAAY,YACzB,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAC7B;EACA,MAAM,6BAAa,IAAI,KAAkB;EAEzC,KAAK,MAAM,OAAO,MAAM,SAAS;GAC/B,MAAM,SAAS,iBAAiB,MAAM,QAAQ,MAAM,MAAM,KAAK;GAE/D,IAAI,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO,MAAM;QAClD,OAAO;;EAGd,OAAO,QAAQ;GAAE,MAAM,MAAM;GAAM,SAAS,OAAO,YAAY,WAAW;GAAE,CAAC;;CAG/E,OAAO,kBAAkB,OAAO,MAAM;;AAiBxC,SAAS,kBAAkB,QAAoB,SAAiC;CAC9E,OAAO;EACL,WAAW;EACX,MAAM;EACN,SAAS;GAAE;GAAQ;GAAS;EAC7B;;AAKH,SAAgB,UAAgC,OAAU,OAAqC;CAC7F,IAAI,MAAM,SAAS,YAAY,MAAM,SAAS,SAE5C,OAAO,IAAIE,MAAI,UAAU,CAAC;CAG5B,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,aAAa,MAAM,SAAS,aAAa,MAAM,SAAS,WAEnG,OAAOA,MAAI,UAAU;CAGvB,IAAI,MAAM,SAAS,SAEjB,OAAOC,MAAI,KAAK,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI;CAG3D,IAAI,MAAM,SAAS,OAEjB,OAAOC,MACJ,QAAQ,CACR,KAAK,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC,CACpC,SAAS,CACT,KAAK,IAAI;CAGd,IAAI,MAAM,SAAS,OAEjB,OAAO,IAAIC,MAAI,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,UAAU,MAAM,MAAM,EAAE,GAAG,CAAC;CAGlF,IAAI,MAAM,SAAS,WAAW,OAAO,MAAM,MAAM,UAAU;CAE3D,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,cAAc,MAAM,SAAS,YAEvE,OAAOH,MAAI,QAAQ;CAGrB,IAAI,MAAM,SAAS,YACjB,OAAO,SAAS,OAAO,SAAS,UAAU,MAAM,MAAM,MAAM;CAG9D,IAAI,MAAM,SAAS,SAAS;EAC1B,MAAM,aAAuB,EAAE;EAE/B,KAAK,MAAM,OAAO,MAAM,SACtB,WAAW,KAAK,IAAI,IAAI,KAAK,UAAU,MAAM,QAAQ,MAAM,MAAM,KAAK,GAAG;EAG3E,OAAO,YAAY,MAAM,KAAK,aAAa,WAAW;;CAGxD,IAAI,MAAM,SAAS,UAAU;EAC3B,MAAM,aAAuB,EAAE;EAE/B,KAAK,MAAM,OAAO,MAAM,YACtB,WAAW,KAAK,IAAI,IAAI,KAAK,UAAU,MAAM,WAAW,MAAM,MAAM,KAAK,GAAG;EAG9E,OAAO,IAAI,WAAW;;CAGxB,IAAI,MAAM,SAAS,SAAS;EAC1B,MAAM,cAAc,OAAO,KAAK,MAAM,SAAS;EAE/C,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,OACT,OAAO,KAAK,IAAI,IAAI,UAAU,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC;;CAIrE,IAAI,MAAM,SAAS,gBACjB,OAAO,KAAK,UAAU,MAAM;CAI9B,OAAO,OAAO,MAAM"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["joinPath","collectNamedModels","generateModels","toZod","toTs","groupBy"],"sources":["../src/types.ts","../src/api.ts","../src/security.ts","../src/deployment.ts","../src/generate-jsonschema.ts","../src/generate-openapi.ts","../src/codegen/collect.ts","../src/codegen/json-schema.ts","../src/codegen/hono-server.ts","../src/codegen/ts-client.ts"],"sourcesContent":["import type { StandardTypedV1 } from \"@standard-schema/spec\"\nimport type { PartialOnUndefinedDeep } from \"type-fest\"\n\nexport interface BasicModel<T> {\n title?: string\n description?: string\n examples?: T[]\n schema?: StandardTypedV1<T, T>\n}\n\nexport interface Int32Model extends BasicModel<number> {\n kind: \"int32\"\n}\n\nexport interface Float32Model extends BasicModel<number> {\n kind: \"float32\"\n}\n\nexport interface Float64Model extends BasicModel<number> {\n kind: \"float64\"\n}\n\nexport interface BooleanModel extends BasicModel<boolean> {\n kind: \"boolean\"\n}\n\nexport interface StringModel extends BasicModel<string> {\n kind: \"string\"\n}\n\nexport interface ArrayModel<T extends Models> extends BasicModel<InferModel<T>[]> {\n kind: \"array\"\n base: T\n}\n\nexport interface SetModel<T extends Models> extends BasicModel<Set<InferModel<T>>> {\n kind: \"set\"\n base: T\n}\n\nexport interface MapModel<T extends Models> extends BasicModel<Map<string, InferModel<T>>> {\n kind: \"map\"\n base: T\n}\n\nexport interface RecordModel<T extends Record<string, Models>, R extends keyof T & string> extends BasicModel<\n PropertiesType<T, R>\n> {\n kind: \"record\"\n properties: T\n required: R[]\n id: string\n}\n\nexport type PropertiesType<T extends Record<string, Models>, R extends keyof T> = PartialOnUndefinedDeep<{\n [key in keyof T]: key extends R ? InferModel<T[key]> : InferModel<T[key]> | undefined\n}>\n\nexport interface UnionModel<T extends Record<string, Models>> extends BasicModel<InferUnion<T>> {\n kind: \"union\"\n variants: T\n id: string\n}\n\nexport type InferUnion<T extends Record<string, Models>> = {\n [key in keyof T]: { [k in key]: StandardTypedV1.InferOutput<NonNullable<T[key][\"schema\"]>> }\n}[keyof T]\n\nexport interface TaggedUnionModel<\n K extends string,\n D extends string,\n V extends Record<string, Models>,\n> extends BasicModel<InferTaggedUnion<K, D, V>> {\n kind: \"taggedUnion\"\n variants: V\n variantKey: K\n payloadKey: D\n id: string\n}\n\ninterface TaggedUnionModelOptions<K extends string, D extends string, V extends Record<string, Models>> extends Omit<\n TaggedUnionModel<K, D, V>,\n \"kind\"\n> {}\n\nexport type InferTaggedUnion<K extends string, D extends string, V extends Record<string, Models>> = {\n [key in keyof V]: {\n [k in K | D]: k extends K ? key : k extends D ? StandardTypedV1.InferOutput<NonNullable<V[key][\"schema\"]>> : never\n }\n}[keyof V]\n\nexport interface LiteralModel<T extends string | number | boolean> extends BasicModel<T> {\n kind: \"literal\"\n value: T\n}\n\nexport interface NullModel extends BasicModel<undefined | null> {\n kind: \"null\"\n}\n\nexport type OptionsOf<T extends Models> = Omit<T, \"kind\">\n\nexport interface EnumsModel<T extends { [key: string]: string }> extends BasicModel<T[keyof T]> {\n kind: \"enums\"\n id: string\n variants: T\n}\n\nexport interface DatetimeModel extends BasicModel<string> {\n kind: \"datetime\"\n}\n\nexport interface DateModel extends BasicModel<string> {\n kind: \"date\"\n}\n\nexport interface DurationModel extends BasicModel<string> {\n kind: \"duration\"\n}\n\nexport type Models =\n | Int32Model\n | Float32Model\n | Float64Model\n | BooleanModel\n | StringModel\n | ArrayModel<any>\n | SetModel<any>\n | MapModel<any>\n | RecordModel<Record<string, Models>, string>\n | UnionModel<Record<string, Models>>\n | TaggedUnionModel<string, string, Record<string, Models>>\n | LiteralModel<string | number | boolean>\n | NullModel\n | EnumsModel<{ [key: string]: string }>\n | DatetimeModel\n | DateModel\n | DurationModel\n\nexport type InferModel<T> = T extends { schema?: StandardTypedV1<unknown, unknown> }\n ? StandardTypedV1.InferOutput<NonNullable<T[\"schema\"]>>\n : never\n\nexport function int32(options?: OptionsOf<Int32Model>): Int32Model {\n return { kind: \"int32\", ...options }\n}\n\nexport function float32(options?: OptionsOf<Float32Model>): Float32Model {\n return { kind: \"float32\", ...options }\n}\n\nexport function float64(options?: OptionsOf<Float64Model>): Float64Model {\n return { kind: \"float64\", ...options }\n}\n\nexport function boolean(options?: OptionsOf<BooleanModel>): BooleanModel {\n return { kind: \"boolean\", ...options }\n}\n\nexport function string(options?: OptionsOf<StringModel>): StringModel {\n return { kind: \"string\", ...options }\n}\n\nexport function array<T extends Models>(options: OptionsOf<ArrayModel<T>>): ArrayModel<T> {\n return { kind: \"array\", ...options }\n}\n\nexport function set<T extends Models>(options: OptionsOf<SetModel<T>>): SetModel<T> {\n return { kind: \"set\", ...options }\n}\n\nexport function map<T extends Models>(options: OptionsOf<MapModel<T>>): MapModel<T> {\n return { kind: \"map\", ...options }\n}\n\nexport function record<T extends Record<string, Models>, R extends keyof T & string>(\n options: OptionsOf<RecordModel<T, R>>,\n): RecordModel<T, R> {\n return { kind: \"record\", ...options }\n}\n\nexport function union<T extends Record<string, Models>>(options: OptionsOf<UnionModel<T>>): UnionModel<T> {\n return { kind: \"union\", ...options }\n}\n\nexport function taggedUnion<K extends string, D extends string, V extends Record<string, Models>>(\n options: TaggedUnionModelOptions<K, D, V>,\n): TaggedUnionModel<K, D, V> {\n return { kind: \"taggedUnion\", ...options }\n}\n\nexport function literal<const T extends string | boolean | number>(value: T): LiteralModel<T> {\n return { kind: \"literal\", value }\n}\n\nexport function nullLike(): NullModel {\n return { kind: \"null\" }\n}\n\nexport interface EnumsModelOptions<T extends { [key: string]: string }> extends Omit<EnumsModel<T>, \"kind\"> {}\n\nexport function enums<const T extends { [key: string]: string }>(options: EnumsModelOptions<T>): EnumsModel<T> {\n return { kind: \"enums\", ...options }\n}\n\nexport interface DatetimeModelOptions extends Omit<DatetimeModel, \"kind\"> {}\n\nexport function datetime(options?: DatetimeModelOptions): DatetimeModel {\n return { kind: \"datetime\", ...options }\n}\n\nexport interface DateModelOptions extends Omit<DateModel, \"kind\"> {}\n\nexport function date(options?: DateModelOptions): DateModel {\n return { kind: \"date\", ...options }\n}\n\nexport interface DurationModelOptions extends Omit<DurationModel, \"kind\"> {}\n\nexport function duration(options?: DurationModelOptions): DurationModel {\n return { kind: \"duration\", ...options }\n}\n","import {\n type BooleanModel,\n type DatetimeModel,\n type DateModel,\n type DurationModel,\n type Float32Model,\n type Float64Model,\n type Int32Model,\n type Models,\n type RecordModel,\n type StringModel,\n} from \"./types\"\nimport type { ExtractPathParams } from \"./utils\"\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\" | \"TRACE\"\n\nexport type SimpleType =\n | Int32Model\n | Float32Model\n | Float64Model\n | StringModel\n | BooleanModel\n | DatetimeModel\n | DateModel\n | DurationModel\n\nexport interface RouterModel {\n basePath?: string\n name: string\n routes: Record<\n string,\n RouteModel<\n string,\n Record<string, SimpleType>,\n Models,\n RecordModel<Record<string, Models>, string>,\n RecordModel<Record<string, Models>, string>,\n Record<number, ResponseModel<Models, RecordModel<Record<string, Models>, string>>>\n >\n >\n}\n\nexport interface RouteModel<\n Path extends string,\n Variables extends Record<string, SimpleType>,\n Body extends Models,\n Queries extends RecordModel<Record<string, Models>, string>,\n Headers extends RecordModel<Record<string, Models>, string>,\n Responses extends Record<number, ResponseModel<Models, RecordModel<Record<string, Models>, string>>>,\n> {\n kind: \"route\"\n method: HttpMethod\n contentType?: string\n summary?: string\n description?: string\n path: Path\n variables?: Variables\n body?: Body\n headers?: Headers\n queries?: Queries\n responses: Responses\n tags?: string[]\n}\n\nexport type ResponseModel<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>> =\n | JsonResponseModel<Body, Headers>\n | StreamResponseModel<Body, Headers>\n | SSEResponseModel<Body, Headers>\n | BinaryResponseModel<Headers>\n\nexport interface JsonResponseModel<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>> {\n kind: \"json-response\"\n contentType?: PlainTextLikeContentType | JsonLikeContentType\n summary?: string\n body?: Body\n headers?: Headers\n}\n\nexport interface StreamResponseModel<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>> {\n kind: \"stream-response\"\n contentType?: JsonStreamLikeContentType\n summary?: string\n body?: Body\n headers?: Headers\n}\n\nexport interface SSEResponseModel<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>> {\n kind: \"sse-response\"\n contentType?: PlainTextStreamLikeContentType\n summary?: string\n body?: Body\n headers?: Headers\n}\n\nexport interface BinaryResponseModel<Headers extends RecordModel<Record<string, Models>, string>> {\n kind: \"binary\"\n contentType?: BinaryLikeContentType\n summary?: string\n headers?: Headers\n}\n\nexport interface RouteOptions<\n Path extends string,\n Variables extends Record<ExtractPathParams<Path>, SimpleType>,\n Body extends Models,\n Queries extends RecordModel<Record<string, Models>, string>,\n Headers extends RecordModel<Record<string, Models>, string>,\n Responses extends Record<string, ResponseModel<Models, RecordModel<Record<string, Models>, string>>>,\n> extends Omit<RouteModel<string, Variables, Body, Queries, Headers, Responses>, \"kind\"> {}\n\nexport function route<\n Path extends string,\n Variables extends Record<ExtractPathParams<Path>, SimpleType>,\n Body extends Models,\n Queries extends RecordModel<Record<string, Models>, string>,\n Headers extends RecordModel<Record<string, Models>, string>,\n Responses extends Record<string, ResponseModel<Models, RecordModel<Record<string, Models>, string>>>,\n>(\n options: RouteOptions<Path, Variables, Body, Queries, Headers, Responses>,\n): RouteModel<Path, Variables, Body, Queries, Headers, Responses> {\n return { kind: \"route\", ...options } as RouteModel<Path, Variables, Body, Queries, Headers, Responses>\n}\n\nexport interface ResponseOptions<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>> {\n contentType?: string\n summary?: string\n body?: Body\n headers?: Headers\n}\n\nexport function json<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>>(\n options: ResponseOptions<Body, Headers>,\n): JsonResponseModel<Body, Headers> {\n return { kind: \"json-response\", ...options }\n}\n\nexport function jsonStream<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>>(\n options: ResponseOptions<Body, Headers>,\n): StreamResponseModel<Body, Headers> {\n return { kind: \"stream-response\", ...options }\n}\n\nexport function sseStream<Body extends Models, Headers extends RecordModel<Record<string, Models>, string>>(\n options: ResponseOptions<Body, Headers>,\n): SSEResponseModel<Body, Headers> {\n return { kind: \"sse-response\", ...options }\n}\n\nexport interface BinaryResponseOptions<Headers extends RecordModel<Record<string, Models>, string>> {\n contentType?: BinaryLikeContentType\n summary?: string\n headers?: Headers\n}\n\nexport function binary<Headers extends RecordModel<Record<string, Models>, string>>(\n options: BinaryResponseOptions<Headers>,\n): BinaryResponseModel<Headers> {\n return { kind: \"binary\", ...options }\n}\n\nexport type PlainTextLikeContentType =\n | (string & {})\n | \"text/plain\"\n | \"text/html\"\n | \"text/css\"\n | \"text/xml\"\n | \"text/markdown\"\n | \"text/csv\"\n\nexport type JsonLikeContentType =\n | (string & {})\n | \"application/json\"\n | \"application/json; charset=utf-8\"\n | \"application/ld+json\"\n | \"application/hal+json\"\n | \"application/vnd.api+json\"\n | \"application/problem+json\"\n | \"application/schema+json\"\n\nexport type PlainTextStreamLikeContentType = (string & {}) | \"text/event-stream\"\n\nexport type JsonStreamLikeContentType =\n | (string & {})\n | \"application/ndjson\"\n | \"application/x-ndjson\"\n | \"application/jsonl\"\n | \"application/json-seq\"\n | \"application/stream+json\"\n\nexport type BinaryLikeContentType =\n | (string & {})\n | \"application/octet-stream\"\n | \"application/pdf\"\n | \"application/zip\"\n | \"application/gzip\"\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\"\n | \"image/svg+xml\"\n | \"audio/mpeg\"\n | \"audio/wav\"\n | \"video/mp4\"\n | \"video/webm\"\n\nexport type FormLikeContentType = (string & {}) | \"application/x-www-form-urlencoded\" | \"multipart/form-data\"\n","import type { HttpMethod } from \"./api\"\n\nexport interface SecurityPolicyModel {\n name: string\n\n /** key就是path的模式, 支持正则表达 */\n paths: Record<string, SecurityPolicyPathItem>\n}\n\nexport interface SecurityPolicyPathItem {\n /** 如果没有设置, 则默认对所有http method生效 */\n methods?: HttpMethod[]\n\n /** 如果没有设置, 则忽略该规则 */\n pipeline?: SecurityApply[]\n}\n\nexport type SecurityComponent = ApikeySecurityComponent | OpenIdSecurityComponent\n\nexport interface ApikeySecurityComponent {\n kind: \"apikey\"\n id: string\n name: string\n description?: string\n}\n\nexport interface OpenIdSecurityComponent {\n kind: \"openIdConnect\"\n id: string\n description?: string\n scopes: string[]\n}\n\nexport interface SecurityApply {\n component: SecurityComponent\n scopes: string[]\n}\n\nexport interface SecurityAppliable {\n apply: (...scopes: string[]) => SecurityApply\n}\n\nexport interface ApikeySecurityComponentOptions {\n id: string\n name: string\n description?: string\n}\n\nexport function apikey(options: ApikeySecurityComponentOptions): ApikeySecurityComponent & SecurityAppliable {\n const component: ApikeySecurityComponent = {\n kind: \"apikey\",\n ...options,\n }\n\n return {\n ...component,\n apply: () => ({ component, scopes: [] }),\n }\n}\n\nexport interface OpenIdComponentOptions {\n id: string\n description?: string\n scopes: string[]\n}\n\nexport function openIdConnect(options: OpenIdComponentOptions): OpenIdSecurityComponent & SecurityAppliable {\n const component: OpenIdSecurityComponent = {\n kind: \"openIdConnect\",\n ...options,\n }\n\n return {\n ...component,\n apply: (...scopes: string[]) => ({ component, scopes }),\n }\n}\n","import type { OpenIdSecurityComponent } from \"./security\"\n\nexport interface OpenIdDeployment {\n kind: \"openIdConnectDeployment\"\n component: OpenIdSecurityComponent\n issuer: string\n}\n\nexport interface OpenIdDeploymentOptions {\n component: OpenIdSecurityComponent\n issuer: string\n}\n\nexport function deployOpenIdConnect(options: OpenIdDeploymentOptions): OpenIdDeployment {\n return {\n kind: \"openIdConnectDeployment\",\n component: options.component,\n issuer: options.issuer,\n }\n}\n\nexport type SecurityDeployment = OpenIdDeployment\n","import type { StandardTypedV1 } from \"@standard-schema/spec\"\n\nimport type { JsonSchema, JsonSchemaObject } from \"./schemas/json-schema-draft-2020-12\"\nimport type { Models } from \"./types\"\n\nexport interface SchemaRegistry {\n getRef: (model: Models) => string | undefined\n add: (id: string, model: Models) => SchemaRegistry\n}\n\nexport interface GenerateJsonSchemaOptions {\n model: Models\n registry?: SchemaRegistry\n toJsonSchema?: (type?: StandardTypedV1) => JsonSchemaObject\n}\n\nexport interface GenerateJsonSchemaResult {\n jsonSchema: JsonSchema\n registry: SchemaRegistry\n}\n\nexport function generateJsonSchema(options: GenerateJsonSchemaOptions): GenerateJsonSchemaResult {\n const { model, toJsonSchema = () => ({}) } = options\n\n const registry = options.registry ?? createJsonSchemaRegistry()\n\n const schema = toJsonSchema(model.schema)\n\n switch (model.kind) {\n case \"int32\":\n return {\n jsonSchema: { ...schema, type: \"integer\", format: \"int32\" },\n registry,\n }\n\n case \"float32\":\n return {\n jsonSchema: { ...schema, type: \"number\", format: \"float\" },\n registry,\n }\n\n case \"float64\":\n return {\n jsonSchema: { ...schema, type: \"number\", format: \"float\" },\n registry,\n }\n\n case \"boolean\":\n return {\n jsonSchema: { ...schema, type: \"boolean\" },\n registry,\n }\n\n case \"null\":\n return {\n jsonSchema: { ...schema, type: \"null\" },\n registry,\n }\n\n case \"enums\":\n return {\n jsonSchema: { ...schema, type: \"string\", enum: Object.values(model.variants) },\n registry,\n }\n\n case \"datetime\":\n return {\n jsonSchema: { ...schema, type: \"string\", format: \"date-time\" },\n registry,\n }\n\n case \"date\":\n return {\n jsonSchema: { ...schema, type: \"string\", format: \"date\" },\n registry,\n }\n\n case \"duration\":\n return {\n jsonSchema: { ...schema, type: \"string\", format: \"duration\" },\n registry,\n }\n\n case \"literal\":\n return {\n jsonSchema: { ...schema, const: model.value },\n registry,\n }\n\n case \"string\":\n return {\n jsonSchema: { ...schema, type: \"string\" },\n registry,\n }\n\n case \"array\": {\n const { jsonSchema, registry: newRegistry } = generateJsonSchema({\n model: model.base,\n registry,\n toJsonSchema,\n })\n\n return {\n jsonSchema: { ...schema, type: \"array\", items: jsonSchema },\n registry: newRegistry,\n }\n }\n\n case \"map\": {\n const { jsonSchema, registry: newRegistry } = generateJsonSchema({\n model: model.base,\n registry,\n toJsonSchema,\n })\n\n return {\n jsonSchema: { ...schema, type: \"object\", additionalProperties: jsonSchema },\n registry: newRegistry,\n }\n }\n\n case \"set\": {\n const { jsonSchema, registry: newRegistry } = generateJsonSchema({\n model: model.base,\n registry,\n toJsonSchema,\n })\n\n return {\n jsonSchema: { ...schema, type: \"array\", items: jsonSchema, uniqueItems: true },\n registry: newRegistry,\n }\n }\n\n case \"record\": {\n const result = Object.entries(model.properties).reduce<{\n registry: SchemaRegistry\n properties: Record<string, JsonSchema>\n }>(\n (acc, [key, propModel]) => {\n const ref = acc.registry.getRef(propModel)\n\n if (ref) {\n return {\n registry: acc.registry,\n properties: { ...acc.properties, [key]: { $ref: ref } },\n }\n }\n\n const generated = generateJsonSchema({\n model: propModel,\n registry: acc.registry,\n toJsonSchema,\n })\n\n return {\n registry: generated.registry,\n properties: { ...acc.properties, [key]: generated.jsonSchema },\n }\n },\n { registry, properties: {} as Record<string, JsonSchema> },\n )\n\n return {\n jsonSchema: {\n ...schema,\n type: \"object\",\n required: model.required,\n additionalProperties: false,\n properties: result.properties,\n },\n registry: result.registry,\n }\n }\n\n case \"union\": {\n const result = Object.entries(model.variants).reduce<{\n registry: SchemaRegistry\n oneOf: JsonSchema[]\n }>(\n (acc, [key, variantModel]) => {\n const ref = acc.registry.getRef(variantModel)\n\n if (ref) {\n return {\n registry: acc.registry,\n oneOf: [\n ...acc.oneOf,\n {\n type: \"object\",\n required: [key],\n properties: { [key]: { $ref: ref } },\n } satisfies JsonSchemaObject,\n ],\n }\n }\n\n const generated = generateJsonSchema({\n model: variantModel,\n registry: acc.registry,\n toJsonSchema,\n })\n\n return {\n registry: generated.registry,\n oneOf: [\n ...acc.oneOf,\n {\n type: \"object\",\n required: [key],\n properties: { [key]: generated.jsonSchema },\n } satisfies JsonSchemaObject,\n ],\n }\n },\n { registry, oneOf: [] as JsonSchema[] },\n )\n\n return {\n jsonSchema: { ...schema, oneOf: result.oneOf },\n registry: result.registry,\n }\n }\n\n case \"taggedUnion\": {\n const result = Object.entries(model.variants).reduce<{\n registry: SchemaRegistry\n oneOf: JsonSchema[]\n }>(\n (acc, [key, variantModel]) => {\n const ref = acc.registry.getRef(variantModel)\n\n if (ref) {\n return {\n registry: acc.registry,\n oneOf: [\n ...acc.oneOf,\n {\n type: \"object\",\n required: [model.variantKey, model.payloadKey],\n properties: {\n [model.variantKey]: { const: key },\n [model.payloadKey]: { $ref: ref },\n },\n } satisfies JsonSchemaObject,\n ],\n }\n }\n\n const generated = generateJsonSchema({\n model: variantModel,\n registry: acc.registry,\n toJsonSchema,\n })\n\n return {\n registry: generated.registry,\n oneOf: [\n ...acc.oneOf,\n {\n type: \"object\",\n required: [model.variantKey, model.payloadKey],\n properties: {\n [model.variantKey]: { const: key },\n [model.payloadKey]: generated.jsonSchema,\n },\n } satisfies JsonSchemaObject,\n ],\n }\n },\n { registry, oneOf: [] as JsonSchema[] },\n )\n\n return {\n jsonSchema: { ...schema, oneOf: result.oneOf },\n registry: result.registry,\n }\n }\n }\n}\n\nexport function createJsonSchemaRegistry(models?: Map<Models, { id: string; schema: JsonSchema }>): SchemaRegistry {\n const map = new Map<Models, { id: string; schema: JsonSchema }>(models)\n\n const registry: SchemaRegistry = {\n getRef(model) {\n const entry = map.get(model)\n return entry ? \"#/$defs/\" + entry.id : undefined\n },\n add(id, model) {\n const { jsonSchema } = generateJsonSchema({ model, registry })\n return createJsonSchemaRegistry(map.set(model, { id, schema: jsonSchema }))\n },\n }\n\n return registry\n}\n\nexport function createOpenapiSchemaRegistry(models?: Map<Models, { id: string; schema: JsonSchema }>): SchemaRegistry {\n const map = new Map<Models, { id: string; schema: JsonSchema }>(models)\n\n const registry: SchemaRegistry = {\n getRef(model) {\n const entry = map.get(model)\n return entry ? \"#/components/schemas/\" + entry.id : undefined\n },\n add(id, model) {\n const { jsonSchema } = generateJsonSchema({ model, registry })\n return createOpenapiSchemaRegistry(map.set(model, { id, schema: jsonSchema }))\n },\n }\n\n return registry\n}\n","import type { ResponseModel, RouteModel, RouterModel, SimpleType } from \"./api\"\nimport { createOpenapiSchemaRegistry, generateJsonSchema, type SchemaRegistry } from \"./generate-jsonschema\"\nimport type { JsonSchema } from \"./schemas/json-schema-draft-2020-12\"\nimport type {\n ComponentsObject,\n InfoObject,\n MediaTypeObject,\n OpenAPIObject,\n OperationObject,\n ParameterObject,\n PathItemObject,\n PathsObject,\n RequestBodyObject,\n ResponseObject,\n SecurityRequirementObject,\n SecuritySchemeObject,\n ServerObject,\n} from \"./schemas/openapi-schema\"\nimport type {\n ApikeySecurityComponent,\n OpenIdSecurityComponent,\n SecurityComponent,\n SecurityPolicyModel,\n} from \"./security\"\nimport type { OpenIdDeployment, SecurityDeployment } from \"./deployment\"\nimport type { Models, RecordModel } from \"./types\"\n\ntype AnyRouteModel = RouteModel<\n string,\n Record<string, SimpleType>,\n Models,\n RecordModel<Record<string, Models>, string>,\n RecordModel<Record<string, Models>, string>,\n Record<number, ResponseModel<Models, RecordModel<Record<string, Models>, string>>>\n>\n\ntype AnyResponseModel = ResponseModel<Models, RecordModel<Record<string, Models>, string>>\n\nexport interface GenerateOpenapiOptions {\n info: InfoObject\n servers?: ServerObject[]\n routers: RouterModel[]\n security?: {\n policy?: SecurityPolicyModel\n deployments?: Record<string, SecurityDeployment>\n }\n}\n\ninterface FlatRoute {\n route: AnyRouteModel\n group: string\n fullPath: string\n}\n\nexport interface GenerateOpenapiResult {\n openapi: OpenAPIObject\n registry: SchemaRegistry\n}\n\nfunction joinPath(basePath: string, routePath: string): string {\n if (!basePath) return routePath\n const base = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath\n const route = routePath.startsWith(\"/\") ? routePath : `/${routePath}`\n return `${base}${route}`\n}\n\nexport function generateOpenapi(options: GenerateOpenapiOptions): GenerateOpenapiResult {\n const { info, servers, routers, security } = options\n\n const flatRoutes: FlatRoute[] = routers.flatMap((rm) =>\n Object.entries(rm.routes).map(([_key, route]) => ({\n route,\n group: rm.name,\n fullPath: joinPath(rm.basePath ?? \"\", route.path),\n })),\n )\n\n const namedModels = collectNamedModels(flatRoutes.map((fr) => fr.route))\n\n const registry = [...namedModels.entries()].reduce<SchemaRegistry>(\n (reg, [id, model]) => reg.add(id, model),\n createOpenapiSchemaRegistry(),\n )\n\n const schemas = [...namedModels.entries()].reduce<Record<string, JsonSchema>>(\n (acc, [id, model]) => ({\n ...acc,\n [id]: generateJsonSchema({ model, registry }).jsonSchema,\n }),\n {} as Record<string, JsonSchema>,\n )\n\n const hasSchemas = Object.keys(schemas).length > 0\n\n const paths = generatePaths(flatRoutes, registry)\n\n let components: ComponentsObject | undefined = hasSchemas ? { schemas } : undefined\n\n if (security?.policy) {\n const schemeResult = buildSecuritySchemes(security.policy, security.deployments)\n if (schemeResult.schemes && Object.keys(schemeResult.schemes).length > 0) {\n components = { ...components, securitySchemes: schemeResult.schemes } as ComponentsObject\n }\n\n const securedPaths = applySecurityToPaths(paths, security.policy)\n if (securedPaths) {\n return {\n openapi: {\n openapi: \"3.2.0\",\n info,\n servers,\n paths: securedPaths,\n components,\n },\n registry,\n }\n }\n }\n\n const openapi: OpenAPIObject = {\n openapi: \"3.2.0\",\n info,\n servers,\n paths,\n components,\n }\n\n return { openapi, registry }\n}\n\nfunction collectNamedModels(routes: AnyRouteModel[]): Map<string, Models> {\n return routes.reduce<Map<string, Models>>((models, route) => {\n const fromRoute = collectModelsFromRoute(route)\n return [...fromRoute.entries()].reduce((acc, [id, model]) => {\n if (!acc.has(id)) acc.set(id, model)\n return acc\n }, models)\n }, new Map<string, Models>())\n}\n\nfunction collectModelsFromRoute(route: AnyRouteModel): Map<string, Models> {\n const sources: Models[] = [route.body, ...Object.values(route.responses).flatMap(collectModelsFromResponse)].filter(\n (m): m is Models => m != null,\n )\n\n return sources.reduce<Map<string, Models>>((acc, model) => {\n return collectModelDeep(model).reduce((inner, [id, m]) => {\n if (!inner.has(id)) inner.set(id, m)\n return inner\n }, acc)\n }, new Map<string, Models>())\n}\n\nfunction collectModelsFromResponse(response: AnyResponseModel): Models[] {\n switch (response.kind) {\n case \"json-response\":\n case \"stream-response\":\n case \"sse-response\":\n return response.body ? [response.body] : []\n\n case \"binary\":\n return []\n }\n}\n\nfunction collectModelDeep(model: Models): [string, Models][] {\n const self: [string, Models][] = \"id\" in model && model.id != null ? [[model.id as string, model]] : []\n\n const nested = collectNestedModels(model)\n\n return [...self, ...nested]\n}\n\nfunction collectNestedModels(model: Models): [string, Models][] {\n switch (model.kind) {\n case \"array\":\n case \"set\":\n case \"map\":\n return collectModelDeep(model.base)\n\n case \"record\":\n return Object.values(model.properties).flatMap(collectModelDeep)\n\n case \"union\":\n return Object.values(model.variants).flatMap(collectModelDeep)\n\n case \"taggedUnion\":\n return Object.values(model.variants).flatMap(collectModelDeep)\n\n default:\n return []\n }\n}\n\nfunction generatePaths(flatRoutes: FlatRoute[], registry: SchemaRegistry): PathsObject {\n return flatRoutes.reduce<Record<string, PathItemObject>>((paths, { route, group, fullPath }) => {\n const existing = paths[fullPath] ?? {}\n const method = route.method.toLowerCase() as keyof PathItemObject\n\n return {\n ...paths,\n [fullPath]: {\n ...existing,\n [method]: generateOperation(route, group, registry),\n },\n }\n }, {} as Record<string, PathItemObject>)\n}\n\nfunction generateOperation(route: AnyRouteModel, group: string, registry: SchemaRegistry): OperationObject {\n const tags = route.tags?.includes(group)\n ? route.tags\n : [...(route.tags ?? []), group]\n\n return {\n summary: route.summary,\n description: route.description,\n tags,\n parameters: generateParameters(route, registry),\n requestBody: generateRequestBody(route, registry),\n responses: generateResponses(route.responses, registry),\n }\n}\n\nfunction generateParameters(\n route: AnyRouteModel,\n registry: SchemaRegistry,\n): ParameterObject[] | undefined {\n const pathParams = Object.entries(route.variables ?? {}).map(([name, model]) =>\n generateParameter(name, model, \"path\", true, registry),\n )\n\n const queries = route.queries\n const headers = route.headers\n\n const queryParams = queries\n ? Object.entries(queries.properties).map(([name, model]) =>\n generateParameter(name, model, \"query\", queries.required.includes(name as any), registry),\n )\n : []\n\n const headerParams = headers\n ? Object.entries(headers.properties).map(([name, model]) =>\n generateParameter(name, model, \"header\", headers.required.includes(name as any), registry),\n )\n : []\n\n const all = [...pathParams, ...queryParams, ...headerParams]\n\n return all.length > 0 ? all : undefined\n}\n\nfunction generateParameter(\n name: string,\n model: Models,\n location: \"path\" | \"query\" | \"header\" | \"cookie\",\n required: boolean,\n registry: SchemaRegistry,\n): ParameterObject {\n return {\n name,\n in: location,\n required,\n schema: getSchema(model, registry),\n }\n}\n\nfunction generateRequestBody(\n route: AnyRouteModel,\n registry: SchemaRegistry,\n): RequestBodyObject | undefined {\n if (route.body == null || route.body.kind === \"null\") return undefined\n\n const contentType = route.contentType ?? \"application/json\"\n\n return {\n content: {\n [contentType]: generateMediaType(route.body, registry),\n },\n }\n}\n\nfunction generateMediaType(model: Models, registry: SchemaRegistry): MediaTypeObject {\n return {\n schema: getSchema(model, registry),\n }\n}\n\nfunction generateResponses(\n responses: Record<number, AnyResponseModel>,\n registry: SchemaRegistry,\n): Record<string, ResponseObject> {\n return Object.entries(responses).reduce<Record<string, ResponseObject>>(\n (acc, [status, response]) => ({\n ...acc,\n [status]: generateResponseObject(response, registry),\n }),\n {} as Record<string, ResponseObject>,\n )\n}\n\nfunction generateResponseObject(response: AnyResponseModel, registry: SchemaRegistry): ResponseObject {\n const description = response.summary ?? \"\"\n\n const headers =\n response.kind !== \"binary\" && response.headers\n ? generateResponseHeaders(response.headers, registry)\n : undefined\n\n const content = generateResponseContent(response, registry)\n\n return {\n description,\n headers,\n content,\n }\n}\n\nfunction generateResponseHeaders(\n headers: RecordModel<Record<string, Models>, string>,\n registry: SchemaRegistry,\n): Record<string, { schema: JsonSchema }> {\n return Object.entries(headers.properties).reduce<Record<string, { schema: JsonSchema }>>(\n (acc, [name, model]) => ({\n ...acc,\n [name]: { schema: getSchema(model, registry) },\n }),\n {} as Record<string, { schema: JsonSchema }>,\n )\n}\n\nfunction generateResponseContent(\n response: AnyResponseModel,\n registry: SchemaRegistry,\n): Record<string, MediaTypeObject> | undefined {\n switch (response.kind) {\n case \"json-response\": {\n if (response.body == null) return undefined\n\n const contentType = response.contentType ?? \"application/json\"\n\n const mediaType: MediaTypeObject = { schema: getSchema(response.body, registry) }\n\n return { [contentType]: mediaType }\n }\n\n case \"stream-response\": {\n if (response.body == null) return undefined\n\n const contentType = response.contentType ?? \"application/x-ndjson\"\n\n const mediaType: MediaTypeObject = {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: getSchema(response.body, registry),\n }\n\n return { [contentType]: mediaType }\n }\n\n case \"sse-response\": {\n const contentType = response.contentType ?? \"text/event-stream\"\n\n const itemSchema: JsonSchema = response.body\n ? getSchema(response.body, registry)\n : { type: \"string\" }\n\n const mediaType: MediaTypeObject = {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema,\n }\n\n return { [contentType]: mediaType }\n }\n\n case \"binary\":\n return {\n [response.contentType ?? \"application/octet-stream\"]: {\n schema: { type: \"string\", format: \"binary\" },\n },\n }\n }\n}\n\nfunction getSchema(model: Models, registry: SchemaRegistry): JsonSchema {\n const ref = registry.getRef(model)\n return ref ? { $ref: ref } : generateJsonSchema({ model, registry }).jsonSchema\n}\n\n// ---- security helpers ----\n\nfunction buildSecuritySchemes(\n policy: SecurityPolicyModel,\n deployments?: Record<string, SecurityDeployment>,\n): { schemes: Record<string, SecuritySchemeObject> | undefined } {\n const components = collectSecurityComponents(policy)\n\n if (components.length === 0) return { schemes: undefined }\n\n const schemes: Record<string, SecuritySchemeObject> = {}\n\n for (const component of components) {\n switch (component.kind) {\n case \"apikey\":\n schemes[component.id] = toApiKeyScheme(component)\n break\n\n case \"openIdConnect\": {\n const deployment = findDeployment(component, deployments)\n if (!deployment || deployment.kind !== \"openIdConnectDeployment\") {\n console.warn(\n `[generateOpenapi] Security scheme \"${component.id}\" (openIdConnect) has no matching deployment, skipping`,\n )\n break\n }\n schemes[component.id] = toOpenIdConnectScheme(component, deployment)\n break\n }\n }\n }\n\n return { schemes: Object.keys(schemes).length > 0 ? schemes : undefined }\n}\n\nfunction findDeployment(\n component: SecurityComponent,\n deployments?: Record<string, SecurityDeployment>,\n): SecurityDeployment | undefined {\n if (!deployments) return undefined\n for (const dep of Object.values(deployments)) {\n if (dep.component.id === component.id) return dep\n }\n return undefined\n}\n\nfunction toApiKeyScheme(component: ApikeySecurityComponent): SecuritySchemeObject {\n return {\n type: \"apiKey\",\n name: component.name,\n in: \"header\",\n description: component.description,\n }\n}\n\nfunction toOpenIdConnectScheme(\n component: OpenIdSecurityComponent,\n deployment: OpenIdDeployment,\n): SecuritySchemeObject {\n const url = deployment.issuer.endsWith(\"/\")\n ? `${deployment.issuer}.well-known/openid-configuration`\n : `${deployment.issuer}/.well-known/openid-configuration`\n\n return {\n type: \"openIdConnect\",\n openIdConnectUrl: url,\n description: component.description,\n }\n}\n\nfunction collectSecurityComponents(policy: SecurityPolicyModel): SecurityComponent[] {\n const seen = new Set<string>()\n const result: SecurityComponent[] = []\n\n for (const pathItem of Object.values(policy.paths)) {\n if (!pathItem.pipeline) continue\n for (const apply of pathItem.pipeline) {\n if (!seen.has(apply.component.id)) {\n seen.add(apply.component.id)\n result.push(apply.component)\n }\n }\n }\n\n return result\n}\n\nfunction applySecurityToPaths(\n paths: PathsObject | undefined,\n policy: SecurityPolicyModel,\n): PathsObject | undefined {\n if (!paths) return undefined\n\n const operationMethods = [\"get\", \"put\", \"post\", \"delete\", \"options\", \"head\", \"patch\", \"trace\"] as const\n\n return Object.entries(paths).reduce<Record<string, PathItemObject>>((acc, [pathKey, pathItem]) => {\n const securedItem = operationMethods.reduce<PathItemObject>((methodAcc, method) => {\n const op = pathItem[method]\n if (!op) return methodAcc\n\n const requirements = resolveSecurityRequirements(policy, pathKey, method)\n if (requirements.length === 0) return methodAcc\n\n return { ...methodAcc, [method]: { ...op, security: requirements } }\n }, pathItem)\n\n return { ...acc, [pathKey]: securedItem }\n }, {} as Record<string, PathItemObject>)\n}\n\nfunction resolveSecurityRequirements(\n policy: SecurityPolicyModel,\n pathKey: string,\n method: string,\n): SecurityRequirementObject[] {\n const requirements: SecurityRequirementObject[] = []\n\n for (const [pattern, pathItem] of Object.entries(policy.paths)) {\n if (!matchesPath(pattern, pathKey)) continue\n\n const methods = pathItem.methods\n if (methods && methods.length > 0 && !methods.includes(method.toUpperCase() as never)) continue\n\n if (!pathItem.pipeline) continue\n\n for (const apply of pathItem.pipeline) {\n requirements.push({ [apply.component.id]: apply.scopes })\n }\n }\n\n return requirements\n}\n\nfunction matchesPath(pattern: string, path: string): boolean {\n try {\n return new RegExp(pattern).test(path)\n } catch {\n return false\n }\n}\n","import { pascalCase } from \"text-case\"\n\nimport type { RouterModel } from \"../api\"\nimport type {\n AnyNamedDescriptor,\n CollectOptions,\n EnumsDescriptor,\n FieldDescriptor,\n OperationDescriptor,\n RecordDescriptor,\n SchemaInfo,\n SchemaMap,\n TaggedUnionDescriptor,\n UnionDescriptor,\n} from \"./descriptors\"\nimport type { Models, RecordModel as RecordModelType } from \"../types\"\n\nexport function collectNamedModels(\n models: Models[],\n options?: CollectOptions,\n): AnyNamedDescriptor[] {\n const identifier = options?.identifier ?? pascalCase\n const namespace = options?.namespace\n\n return models.reduce<AnyNamedDescriptor[]>((acc, model) => {\n if (model.kind === \"record\") {\n return [...acc, toRecordDescriptor(model, identifier, namespace)]\n }\n if (model.kind === \"enums\") {\n return [...acc, toEnumsDescriptor(model, identifier, namespace)]\n }\n if (model.kind === \"union\") {\n return [...acc, {\n kind: \"union\",\n originalId: model.id,\n identifier: identifier(model.id),\n namespace,\n title: model.title,\n description: model.description,\n deprecated: (model as any).deprecated,\n examples: model.examples,\n variants: model.variants as Record<string, Models>,\n } as UnionDescriptor]\n }\n if (model.kind === \"taggedUnion\") {\n return [...acc, {\n kind: \"taggedUnion\",\n originalId: model.id,\n identifier: identifier(model.id),\n namespace,\n title: model.title,\n description: model.description,\n deprecated: (model as any).deprecated,\n examples: model.examples,\n variants: model.variants as Record<string, Models>,\n variantKey: model.variantKey as string,\n payloadKey: model.payloadKey as string,\n } as TaggedUnionDescriptor]\n }\n return acc\n }, [] as AnyNamedDescriptor[])\n}\n\nfunction toRecordDescriptor(\n model: RecordModelType<Record<string, Models>, string>,\n identifier: (id: string) => string,\n namespace: string | undefined,\n): RecordDescriptor {\n return {\n kind: \"record\",\n originalId: model.id,\n identifier: identifier(model.id),\n namespace,\n title: model.title,\n description: model.description,\n deprecated: \"deprecated\" in model ? (model as any).deprecated : undefined,\n examples: model.examples,\n fields: Object.entries(model.properties).map<FieldDescriptor>(([name, propModel]) => ({\n name,\n model: propModel as Models,\n required: model.required.includes(name as any),\n title: (propModel as any).title,\n description: (propModel as any).description,\n deprecated: (propModel as any).deprecated,\n })),\n }\n}\n\nfunction toEnumsDescriptor(\n model: { kind: \"enums\"; id: string; variants: Record<string, string>; title?: string; description?: string },\n identifier: (id: string) => string,\n namespace: string | undefined,\n): EnumsDescriptor {\n return {\n kind: \"enums\",\n originalId: model.id,\n identifier: identifier(model.id),\n namespace,\n title: model.title,\n description: model.description,\n values: model.variants,\n }\n}\n\nfunction joinPath(basePath: string, routePath: string): string {\n if (!basePath) return routePath\n const base = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath\n const route = routePath.startsWith(\"/\") ? routePath : `/${routePath}`\n return `${base}${route}`\n}\n\nexport function collectOperations(routers: RouterModel[]): OperationDescriptor[] {\n return routers.flatMap((routerModel) => {\n const basePath = routerModel.basePath ?? \"\"\n\n return Object.entries(routerModel.routes).map(([id, route]) => {\n const queries: Record<string, { model: Models; name: string; required: boolean }> = {}\n if (route.queries) {\n for (const [name, propModel] of Object.entries(route.queries.properties)) {\n queries[name] = {\n model: propModel as Models,\n name,\n required: route.queries.required.includes(name as any),\n }\n }\n }\n\n const headers: Record<string, { model: Models; name: string; required: boolean }> = {}\n if (route.headers) {\n for (const [name, propModel] of Object.entries(route.headers.properties)) {\n headers[name] = {\n model: propModel as Models,\n name,\n required: route.headers.required.includes(name as any),\n }\n }\n }\n\n const pathVariables: Record<string, { model: Models; name: string }> = {}\n if (route.variables) {\n for (const [name, model] of Object.entries(route.variables)) {\n pathVariables[name] = { model: model as Models, name }\n }\n }\n\n const responses: Record<number, Models | null> = {}\n const responseKinds: Record<number, string> = {}\n for (const [status, resp] of Object.entries(route.responses)) {\n responses[Number(status)] =\n \"body\" in resp && resp.body != null ? (resp.body as Models) : null\n responseKinds[Number(status)] = resp.kind\n }\n\n return {\n id,\n group: routerModel.name,\n method: route.method,\n path: joinPath(basePath, route.path),\n summary: route.summary,\n description: route.description,\n tags: route.tags,\n requestModel: route.body ?? null,\n responses,\n responseKinds,\n pathVariables,\n queries,\n headers,\n }\n })\n })\n}\n\nexport function collectSchemaMap(ops: OperationDescriptor[]): SchemaMap {\n const all = collectAll(ops)\n const map: SchemaMap = new Map()\n for (const m of all) {\n if (\"id\" in m && map.has(m.id)) continue\n if (m.kind === \"record\") {\n map.set(m.id, {\n kind: \"record\",\n fields: Object.entries(m.properties).map(([name, p]) => ({\n name,\n model: p as Models,\n required: m.required.includes(name as any),\n })),\n })\n } else if (m.kind === \"enums\") {\n map.set(m.id, { kind: \"enums\", variants: m.variants } as SchemaInfo)\n } else if (m.kind === \"union\") {\n map.set(m.id, { kind: \"union\", unionVariants: m.variants as Record<string, Models> } as SchemaInfo)\n } else if (m.kind === \"taggedUnion\") {\n map.set(m.id, {\n kind: \"taggedUnion\",\n unionVariants: m.variants as Record<string, Models>,\n variantKey: m.variantKey as string,\n payloadKey: m.payloadKey as string,\n } as SchemaInfo)\n }\n }\n return map\n}\n\nfunction collectAll(ops: OperationDescriptor[]): Models[] {\n const seen = new Set<Models>()\n const out: Models[] = []\n const add = (m: Models | null) => {\n if (m == null || seen.has(m)) return\n seen.add(m)\n out.push(m)\n if (m.kind === \"array\" || m.kind === \"set\" || m.kind === \"map\") add(m.base)\n if (m.kind === \"record\") Object.values(m.properties).forEach((v) => add(v as Models))\n if (m.kind === \"union\" || m.kind === \"taggedUnion\") Object.values(m.variants).forEach((v) => add(v as Models))\n }\n for (const op of ops) {\n add(op.requestModel)\n for (const v of Object.values(op.responses)) add(v)\n for (const v of Object.values(op.pathVariables)) add(v.model)\n for (const v of Object.values(op.queries)) add(v.model)\n for (const v of Object.values(op.headers)) add(v.model)\n }\n return out\n}\n\nexport function resolveNamedRoot(m: Models): { id: string } | null {\n switch (m.kind) {\n case \"record\":\n case \"enums\":\n case \"union\":\n case \"taggedUnion\":\n return m as unknown as { id: string }\n case \"array\":\n case \"set\":\n case \"map\":\n return resolveNamedRoot(m.base)\n default:\n return null\n }\n}\n","import { createJsonSchemaRegistry, generateJsonSchema } from \"../generate-jsonschema\"\nimport type { JsonSchemaObject } from \"../schemas/json-schema-draft-2020-12\"\nimport type { Models } from \"../types\"\n\nexport function mergeJsonSchemas(schemas: Record<string, Models>): JsonSchemaObject {\n const entries = Object.entries(schemas)\n\n const registry = entries.reduce(\n (reg, [id, model]) => reg.add(id, model),\n createJsonSchemaRegistry(),\n )\n\n const $defs = entries.reduce<Record<string, JsonSchemaObject>>(\n (acc, [id, model]) => {\n const { jsonSchema } = generateJsonSchema({ model, registry })\n return typeof jsonSchema === \"object\" && jsonSchema != null\n ? { ...acc, [id]: jsonSchema as JsonSchemaObject }\n : acc\n },\n {} as Record<string, JsonSchemaObject>,\n )\n\n return {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $defs,\n }\n}\n","import { camelCase, pascalCase } from \"text-case\"\n\nimport type { RouterModel } from \"../api\"\nimport type { Models } from \"../types\"\n\nimport { collectOperations, collectSchemaMap, resolveNamedRoot } from \"./collect\"\nimport type { OperationDescriptor, SchemaMap } from \"./descriptors\"\n\nexport interface HonoServerOptions {\n routers: RouterModel[]\n identifier?: (id: string) => string\n namespace?: string\n}\n\nexport function generateHonoServer(options: HonoServerOptions): Record<string, string> {\n const { routers, identifier = pascalCase, namespace } = options\n const operations = collectOperations(routers)\n const schemaMap = collectSchemaMap(operations)\n\n const files: Record<string, string> = {}\n\n files[\"models.ts\"] = generateModels(schemaMap, identifier, namespace)\n\n for (const operation of operations) {\n files[`${camelCase(operation.id)}.ts`] = generateOpFile(operation, schemaMap, identifier, namespace)\n }\n\n files[\"index.ts\"] = generateIndex(operations, identifier)\n\n return files\n}\n\n// ---- models.ts ----\n\nfunction generateModels(schemaMap: SchemaMap, identifier: (s: string) => string, namespace?: string): string {\n const lines: string[] = []\n lines.push(`import { z } from \"zod\"`)\n lines.push(\"\")\n\n for (const [id, schemaInfo] of schemaMap) {\n const schemaName = camelCase(id) + \"Schema\"\n const tsName = identifier(id)\n\n switch (schemaInfo.kind) {\n case \"record\": {\n lines.push(`export const ${schemaName} = z.object({`)\n for (const field of schemaInfo.fields!) {\n lines.push(` ${field.name}: ${toZod(field.model, schemaMap)}${field.required ? \"\" : \".optional()\"},`)\n }\n lines.push(`})`)\n lines.push(\"\")\n\n lines.push(`export interface ${tsName} {`)\n for (const field of schemaInfo.fields!) {\n lines.push(` ${field.name}${field.required ? \"\" : \"?\"}: ${toTs(field.model, schemaMap, identifier, namespace)};`)\n }\n lines.push(`}`)\n lines.push(\"\")\n break\n }\n case \"enums\": {\n lines.push(`export const ${schemaName} = z.enum(${JSON.stringify(Object.values(schemaInfo.variants!))})`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n case \"union\": {\n const variants = Object.entries(schemaInfo.unionVariants!)\n const unionItems = variants.map(([, v]) => toZod(v as Models, schemaMap)).join(\", \")\n lines.push(`export const ${schemaName} = z.union([${unionItems}])`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n case \"taggedUnion\": {\n const variantKey = schemaInfo.variantKey!\n const payloadKey = schemaInfo.payloadKey!\n const unionItems = Object.entries(schemaInfo.unionVariants!).map(([key, v]) =>\n `z.object({ ${JSON.stringify(variantKey)}: z.literal(${JSON.stringify(key)}), ${JSON.stringify(payloadKey)}: ${toZod(v as Models, schemaMap)} })`)\n lines.push(`export const ${schemaName} = z.discriminatedUnion(${JSON.stringify(variantKey)}, [${unionItems.join(\", \")}])`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\n// ---- per-operation file ----\n\nfunction generateOpFile(\n operation: OperationDescriptor,\n schemaMap: SchemaMap,\n identifier: (s: string) => string,\n namespace: string | undefined,\n): string {\n const lines: string[] = []\n const OperationName = pascalCase(operation.id)\n const operationName = camelCase(operation.id)\n\n const hasBody = operation.requestModel != null && operation.requestModel.kind !== \"null\"\n const hasParams = Object.keys(operation.pathVariables).length > 0\n const hasQuery = Object.keys(operation.queries).length > 0\n const hasHeaders = Object.keys(operation.headers).length > 0\n\n // ---- precise imports ----\n const needsZod = hasParams || hasQuery || hasHeaders\n if (needsZod) {\n lines.push(`import { z } from \"zod\"`)\n }\n\n const schemaImports: string[] = []\n if (hasBody && \"id\" in operation.requestModel!) {\n const root = resolveNamedRoot(operation.requestModel!)\n if (root && schemaMap.has(root.id)) {\n schemaImports.push(camelCase(root.id) + \"Schema\")\n }\n }\n\n const typeImports: string[] = []\n if (hasBody && \"id\" in operation.requestModel!) {\n const root = resolveNamedRoot(operation.requestModel!)\n if (root) {\n const typeName = identifier(root.id)\n if (schemaMap.has(root.id) && !typeImports.includes(typeName)) {\n typeImports.push(typeName)\n }\n }\n }\n for (const responseModel of Object.values(operation.responses)) {\n if (responseModel == null) continue\n const root = resolveNamedRoot(responseModel)\n if (root) {\n const typeName = identifier(root.id)\n if (schemaMap.has(root.id) && !typeImports.includes(typeName)) {\n typeImports.push(typeName)\n }\n }\n }\n\n const allImports = [...new Set([...schemaImports, ...typeImports])]\n lines.push(`import type { Context } from \"hono\"`)\n if (allImports.length > 0 || schemaImports.length > 0) {\n const parts: string[] = []\n if (typeImports.length > 0) parts.push(typeImports.join(\", \"))\n if (schemaImports.length > 0) parts.push(schemaImports.join(\", \"))\n lines.push(`import { ${parts.join(\", \")} } from \"./models\"`)\n }\n lines.push(\"\")\n\n // ---- request params/query/headers schemaMap (Zod) ----\n if (hasParams) {\n const fields = Object.entries(operation.pathVariables)\n .map(([key, value]) => ` ${key}: ${toZod(value.model, schemaMap)},`)\n lines.push(`const ${operationName}Params = z.object({`)\n lines.push(...fields)\n lines.push(`})`)\n lines.push(\"\")\n }\n if (hasQuery) {\n const fields = Object.entries(operation.queries)\n .map(([key, query]) => ` ${key}: ${toZod(query.model, schemaMap)}${query.required ? \"\" : \".optional()\"},`)\n lines.push(`const ${operationName}Query = z.object({`)\n lines.push(...fields)\n lines.push(`})`)\n lines.push(\"\")\n }\n if (hasHeaders) {\n const fields = Object.entries(operation.headers)\n .map(([key, header]) => ` \"${key}\": ${toZod(header.model, schemaMap)}${header.required ? \"\" : \".optional()\"},`)\n lines.push(`const ${operationName}Headers = z.object({`)\n lines.push(...fields)\n lines.push(`})`)\n lines.push(\"\")\n }\n\n // ---- Request interface ----\n const requestFields: string[] = []\n if (hasParams) {\n const field = Object.entries(operation.pathVariables)\n .map(([key, value]) => `${key}: ${toTs(value.model, schemaMap, identifier, namespace)}`).join(\"; \")\n requestFields.push(`params: { ${field} }`)\n }\n if (hasQuery) {\n const field = Object.entries(operation.queries)\n .map(([key, query]) => `${key}${query.required ? \"\" : \"?\"}: ${toTs(query.model, schemaMap, identifier, namespace)}`).join(\"; \")\n requestFields.push(`query: { ${field} }`)\n }\n if (hasHeaders) {\n const field = Object.entries(operation.headers)\n .map(([key, header]) => `\"${key}\"${header.required ? \"\" : \"?\"}: ${toTs(header.model, schemaMap, identifier, namespace)}`).join(\"; \")\n requestFields.push(`headers: { ${field} }`)\n }\n if (hasBody) {\n requestFields.push(`body: ${toTs(operation.requestModel!, schemaMap, identifier, namespace)}`)\n }\n lines.push(`export interface ${OperationName}Request {`)\n for (const field of requestFields) lines.push(` ${field}`)\n lines.push(`}`)\n lines.push(\"\")\n\n // ---- Response discriminated union ----\n const responseEntries = Object.entries(operation.responses)\n const responseKind = (status: string) => operation.responseKinds[Number(status)] ?? \"json-response\"\n const responseBodyField = (kind: string, model: Models | null) => {\n if (model == null) {\n if (kind === \"binary\") return \"body: Blob\"\n return null\n }\n if (kind === \"stream-response\" || kind === \"sse-response\") {\n return `stream: ReadableStream<${toTs(model, schemaMap, identifier, namespace)}>`\n }\n if (kind === \"binary\") return \"body: Blob\"\n return `body: ${toTs(model, schemaMap, identifier, namespace)}`\n }\n if (responseEntries.length === 1) {\n const [status, responseModel] = responseEntries[0]\n const kind = responseKind(status)\n const bodyField = responseBodyField(kind, responseModel)\n if (bodyField != null) {\n lines.push(`export type ${OperationName}Response = { status: ${status}; ${bodyField} }`)\n } else {\n lines.push(`export type ${OperationName}Response = { status: ${status} }`)\n }\n } else {\n lines.push(`export type ${OperationName}Response =`)\n const parts = responseEntries.map(([status, responseModel]) => {\n const kind = responseKind(status)\n const bodyField = responseBodyField(kind, responseModel)\n if (bodyField != null) return ` | { status: ${status}; ${bodyField} }`\n return ` | { status: ${status} }`\n })\n lines.push(parts.join(\"\\n\"))\n }\n lines.push(\"\")\n\n // ---- Handler type ----\n if (requestFields.length > 0) {\n lines.push(`export type ${OperationName}Handler = (req: ${OperationName}Request) => Promise<${OperationName}Response>`)\n } else {\n lines.push(`export type ${OperationName}Handler = () => Promise<${OperationName}Response>`)\n }\n lines.push(\"\")\n\n // ---- Wrapper function ----\n lines.push(`export function ${operationName}(handler: ${OperationName}Handler) {`)\n lines.push(` return {`)\n lines.push(` method: \"${operation.method.toUpperCase()}\",`)\n lines.push(` path: \"${toHonoPath(operation.path)}\",`)\n lines.push(` async handler(context: Context): Promise<Response> {`)\n\n const requestArgs: string[] = []\n\n if (hasParams) {\n lines.push(` const params = ${operationName}Params.parse(context.req.param())`)\n requestArgs.push(\"params\")\n }\n if (hasQuery) {\n lines.push(` const query = ${operationName}Query.parse(context.req.query())`)\n requestArgs.push(\"query\")\n }\n if (hasHeaders) {\n const headerParts = Object.keys(operation.headers)\n .map((key) => ` \"${key}\": context.req.header(\"${key}\"),`)\n lines.push(` const headers = ${operationName}Headers.parse({`)\n lines.push(...headerParts)\n lines.push(` })`)\n requestArgs.push(\"headers\")\n }\n if (hasBody) {\n const schemaName = camelCase((operation.requestModel as any).id) + \"Schema\"\n lines.push(` const body = ${schemaName}.parse(await context.req.json())`)\n requestArgs.push(\"body\")\n }\n\n if (requestArgs.length > 0) {\n lines.push(` const result = await handler({ ${requestArgs.join(\", \")} })`)\n } else {\n lines.push(` const result = await handler()`)\n }\n\n // response dispatch\n lines.push(` switch (result.status) {`)\n for (const [status, responseModel] of Object.entries(operation.responses)) {\n const kind = operation.responseKinds[Number(status)] ?? \"json-response\"\n if (responseModel != null) {\n if (kind === \"json-response\") {\n lines.push(` case ${status}: return new Response(JSON.stringify(result.body), { status: ${status}, headers: { \"Content-Type\": \"application/json\" } })`)\n } else if (kind === \"binary\") {\n lines.push(` case ${status}: return new Response(result.body, { status: ${status}, headers: { \"Content-Type\": \"${contentTypeForKind(kind)}\" } })`)\n } else {\n lines.push(` case ${status}: return new Response(result.stream, { status: ${status}, headers: { \"Content-Type\": \"${contentTypeForKind(kind)}\" } })`)\n }\n } else if (kind === \"binary\") {\n lines.push(` case ${status}: return new Response(result.body, { status: ${status}, headers: { \"Content-Type\": \"${contentTypeForKind(kind)}\" } })`)\n } else {\n lines.push(` case ${status}: return new Response(null, { status: ${status} })`)\n }\n }\n lines.push(` default: return new Response(JSON.stringify({ message: \\`Unexpected response status \\${(result as { status: number }).status}\\` }), { status: 500, headers: { \"Content-Type\": \"application/json\" } })`)\n lines.push(` }`)\n\n lines.push(` },`)\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join(\"\\n\")\n}\n\n// ---- index.ts ----\n\nfunction generateIndex(operations: OperationDescriptor[], _identifier: (s: string) => string): string {\n const lines: string[] = []\n lines.push(`import { Hono } from \"hono\"`)\n lines.push(\"\")\n\n for (const operation of operations) {\n const operationName = camelCase(operation.id)\n const OperationName = pascalCase(operation.id)\n lines.push(`import { ${operationName}, type ${OperationName}Handler, type ${OperationName}Request, type ${OperationName}Response } from \"./${operationName}\"`)\n lines.push(`export type { ${OperationName}Handler, ${OperationName}Request, ${OperationName}Response }`)\n }\n\n lines.push(\"\")\n\n const groups = groupBy(operations, (operation) => operation.group)\n\n lines.push(`export function mountRoutes(`)\n lines.push(` app: Hono,`)\n lines.push(` handlers: {`)\n\n for (const [group, groupOps] of Object.entries(groups)) {\n lines.push(` ${camelCase(group)}: {`)\n for (const operation of groupOps) {\n const operationName = camelCase(operation.id)\n lines.push(` ${operationName}: ${pascalCase(operation.id)}Handler,`)\n }\n lines.push(` },`)\n }\n\n lines.push(` },`)\n lines.push(`) {`)\n\n for (const [group, groupOps] of Object.entries(groups)) {\n lines.push(` // ── ${group} ──`)\n for (const operation of groupOps) {\n const operationName = camelCase(operation.id)\n lines.push(` const ${operationName}Def = ${operationName}(handlers.${camelCase(group)}.${operationName})`)\n lines.push(` app.on(${operationName}Def.method, ${operationName}Def.path, ${operationName}Def.handler)`)\n }\n lines.push(\"\")\n }\n\n lines.push(`}`)\n lines.push(\"\")\n\n return lines.join(\"\\n\")\n}\n\nfunction groupBy<T>(items: T[], keyFn: (item: T) => string): Record<string, T[]> {\n const map: Record<string, T[]> = {}\n for (const item of items) {\n const key = keyFn(item)\n if (!map[key]) map[key] = []\n map[key].push(item)\n }\n return map\n}\n\nfunction toHonoPath(path: string): string {\n return path.replace(/\\{(\\w+)\\}/g, \":$1\")\n}\n\nfunction contentTypeForKind(kind: string): string {\n switch (kind) {\n case \"binary\": return \"application/octet-stream\"\n case \"stream-response\": return \"application/x-ndjson\"\n case \"sse-response\": return \"text/event-stream\"\n default: return \"application/json\"\n }\n}\n\n// ---- helpers ----\n\nfunction toZod(model: Models, schemaMap: SchemaMap): string {\n switch (model.kind) {\n case \"int32\": return \"z.coerce.number().int()\"\n case \"float32\":\n case \"float64\": return \"z.coerce.number()\"\n case \"boolean\": return \"z.coerce.boolean()\"\n case \"string\": return \"z.string()\"\n case \"datetime\": return \"z.string().datetime()\"\n case \"date\": return \"z.string().date()\"\n case \"duration\": return \"z.string()\"\n case \"literal\": return `z.literal(${JSON.stringify(model.value)})`\n case \"null\": return \"z.null()\"\n case \"array\": return `${toZod(model.base, schemaMap)}.array()`\n case \"set\": return `${toZod(model.base, schemaMap)}.array()`\n case \"map\": return `z.record(z.string(), ${toZod(model.base, schemaMap)})`\n case \"enums\": return `z.enum(${JSON.stringify(Object.values(model.variants))})`\n case \"record\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo?.fields ? camelCase(model.id) + \"Schema\" : \"z.unknown()\"\n }\n case \"union\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return camelCase(model.id) + \"Schema\"\n const unionItems = Object.values(model.variants).map((v) => toZod(v as Models, schemaMap))\n return `z.union([${unionItems.join(\", \")}])`\n }\n case \"taggedUnion\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return camelCase(model.id) + \"Schema\"\n const unionItems = Object.entries(model.variants).map(([key, v]) =>\n `z.object({ ${JSON.stringify(model.variantKey)}: z.literal(${JSON.stringify(key)}), ${JSON.stringify(model.payloadKey)}: ${toZod(v as Models, schemaMap)} })`)\n return `z.discriminatedUnion(${JSON.stringify(model.variantKey)}, [${unionItems.join(\", \")}])`\n }\n default: return \"z.unknown()\"\n }\n}\n\nfunction toTs(model: Models, schemaMap: SchemaMap, identifier: (s: string) => string, namespace?: string): string {\n void namespace\n switch (model.kind) {\n case \"int32\": case \"float32\": case \"float64\": return \"number\"\n case \"boolean\": return \"boolean\"\n case \"string\": case \"datetime\": case \"date\": case \"duration\": return \"string\"\n case \"literal\": return JSON.stringify(model.value)\n case \"null\": return \"null\"\n case \"array\": case \"set\": return `${toTs(model.base, schemaMap, identifier, namespace)}[]`\n case \"map\": return `Record<string, ${toTs(model.base, schemaMap, identifier, namespace)}>`\n case \"enums\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.variants) return identifier(model.id)\n return Object.values(model.variants).map((v) => JSON.stringify(v)).join(\" | \")\n }\n case \"record\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo?.fields ? identifier(model.id) : \"unknown\"\n }\n case \"union\":\n case \"taggedUnion\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return identifier(model.id)\n return Object.values(model.variants).map((v) => toTs(v as Models, schemaMap, identifier, namespace)).join(\" | \")\n }\n default: return \"unknown\"\n }\n}\n\n","import { camelCase, pascalCase } from \"text-case\"\n\nimport type { RouterModel } from \"../api\"\nimport type { Models } from \"../types\"\n\nimport { collectOperations, collectSchemaMap, resolveNamedRoot } from \"./collect\"\nimport type { OperationDescriptor, SchemaMap } from \"./descriptors\"\n\nexport interface TsClientOptions {\n routers: RouterModel[]\n identifier?: (id: string) => string\n namespace?: string\n}\n\nexport function generateTsClient(options: TsClientOptions): Record<string, string> {\n const { routers, identifier = pascalCase, namespace } = options\n const operations = collectOperations(routers)\n const schemaMap = collectSchemaMap(operations)\n const files: Record<string, string> = {}\n\n files[\"models.ts\"] = generateModels(schemaMap, identifier, namespace)\n\n for (const operation of operations) {\n files[`${camelCase(operation.id)}.ts`] = generateClientFn(operation, schemaMap, identifier, namespace)\n }\n\n files[\"index.ts\"] = generateClientIndex(operations, identifier)\n\n return files\n}\n\n// ---- models.ts ----\n\nfunction generateModels(schemaMap: SchemaMap, identifier: (s: string) => string, namespace?: string): string {\n const lines: string[] = []\n lines.push(`import { z } from \"zod\"`)\n lines.push(\"\")\n\n for (const [id, schemaInfo] of schemaMap) {\n const schemaName = camelCase(id) + \"Schema\"\n const tsName = identifier(id)\n\n switch (schemaInfo.kind) {\n case \"record\": {\n lines.push(`export const ${schemaName} = z.object({`)\n for (const f of schemaInfo.fields!) {\n lines.push(` ${f.name}: ${toZod(f.model, schemaMap)}${f.required ? \"\" : \".optional()\"},`)\n }\n lines.push(`})`)\n lines.push(\"\")\n\n lines.push(`export interface ${tsName} {`)\n for (const f of schemaInfo.fields!) {\n lines.push(` ${f.name}${f.required ? \"\" : \"?\"}: ${toTs(f.model, schemaMap, identifier, namespace)};`)\n }\n lines.push(`}`)\n lines.push(\"\")\n break\n }\n case \"enums\": {\n lines.push(`export const ${schemaName} = z.enum(${JSON.stringify(Object.values(schemaInfo.variants!))})`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n case \"union\": {\n const variants = Object.entries(schemaInfo.unionVariants!)\n const items = variants.map(([, v]) => toZod(v as Models, schemaMap)).join(\", \")\n lines.push(`export const ${schemaName} = z.union([${items}])`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n case \"taggedUnion\": {\n const vk = schemaInfo.variantKey!\n const pk = schemaInfo.payloadKey!\n const items = Object.entries(schemaInfo.unionVariants!).map(([key, v]) =>\n `z.object({ ${JSON.stringify(vk)}: z.literal(${JSON.stringify(key)}), ${JSON.stringify(pk)}: ${toZod(v as Models, schemaMap)} })`)\n lines.push(`export const ${schemaName} = z.discriminatedUnion(${JSON.stringify(vk)}, [${items.join(\", \")}])`)\n lines.push(`export type ${tsName} = z.infer<typeof ${schemaName}>`)\n lines.push(\"\")\n break\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\n// ---- per-operation file ----\n\nfunction generateClientFn(\n operation: OperationDescriptor,\n schemaMap: SchemaMap,\n identifier: (s: string) => string,\n namespace: string | undefined,\n): string {\n const lines: string[] = []\n const functionName = camelCase(operation.id)\n const OperationName = pascalCase(operation.id)\n const hasBody = operation.requestModel != null && operation.requestModel.kind !== \"null\"\n const hasParams = Object.keys(operation.pathVariables).length > 0\n const hasQuery = Object.keys(operation.queries).length > 0\n const hasHeaders = Object.keys(operation.headers).length > 0\n\n const typeImports: string[] = []\n const addNamedRef = (model: Models) => {\n const root = resolveNamedRoot(model)\n if (root) {\n const typeName = identifier(root.id)\n if (schemaMap.has(root.id) && !typeImports.includes(typeName)) {\n typeImports.push(typeName)\n }\n }\n }\n if (hasBody) addNamedRef(operation.requestModel!)\n for (const responseModel of Object.values(operation.responses)) {\n if (responseModel != null) addNamedRef(responseModel)\n }\n\n const okStatus = Object.keys(operation.responses).find((s) => Number(s) >= 200 && Number(s) < 300)\n const okModel: Models | null = okStatus ? operation.responses[Number(okStatus)] : null\n const okKind = okStatus ? operation.responseKinds[Number(okStatus)] ?? \"json-response\" : \"json-response\"\n const isStreamLike = okKind === \"stream-response\" || okKind === \"sse-response\" || okKind === \"binary\"\n const okSchema = okModel ? resolveZodSchema(okModel, schemaMap) : null\n\n const allModelImports = [...typeImports]\n if (okSchema && !isStreamLike) {\n const schemaRefs = collectSchemaRefs(okModel!, schemaMap)\n for (const ref of schemaRefs) {\n if (!allModelImports.includes(ref)) allModelImports.push(ref)\n }\n }\n if (allModelImports.length > 0) {\n lines.push(`import { ${allModelImports.join(\", \")} } from \"./models\"`)\n lines.push(\"\")\n }\n\n // Request type\n const requestFields: string[] = []\n for (const [n, v] of Object.entries(operation.pathVariables)) {\n requestFields.push(`${n}: ${toTs(v.model, schemaMap, identifier, namespace)}`)\n }\n for (const [n, q] of Object.entries(operation.queries)) {\n const required = q.required ? \"\" : \"?\"\n requestFields.push(`${n}${required}: ${toTs(q.model, schemaMap, identifier, namespace)}`)\n }\n if (hasBody) {\n requestFields.push(`body: ${toTs(operation.requestModel!, schemaMap, identifier, namespace)}`)\n }\n if (hasHeaders) {\n const field = Object.entries(operation.headers)\n .map(([key, header]) => `\"${key}\"${header.required ? \"\" : \"?\"}: ${toTs(header.model, schemaMap, identifier, namespace)}`).join(\"; \")\n requestFields.push(`headers?: { ${field} } & Record<string, string>`)\n } else {\n requestFields.push(\"headers?: Record<string, string>\")\n }\n requestFields.push(\"baseUrl?: string\")\n\n lines.push(`export interface ${OperationName}Request {`)\n for (const field of requestFields) lines.push(` ${field}`)\n lines.push(`}`)\n lines.push(\"\")\n\n // Response type\n const responseEntries = Object.entries(operation.responses)\n const responseKind = (status: string) => operation.responseKinds[Number(status)] ?? \"json-response\"\n const responseBodyField = (kind: string, responseModel: Models | null) => {\n if (responseModel == null) {\n if (kind === \"binary\") return \"body: Blob\"\n return null\n }\n if (kind === \"stream-response\" || kind === \"sse-response\") {\n return `stream: ReadableStream<${toTs(responseModel, schemaMap, identifier, namespace)}>`\n }\n if (kind === \"binary\") return \"body: Blob\"\n return `body: ${toTs(responseModel, schemaMap, identifier, namespace)}`\n }\n if (responseEntries.length === 1) {\n const [status, responseModel] = responseEntries[0]\n const kind = responseKind(status)\n const bodyField = responseBodyField(kind, responseModel)\n if (bodyField != null) {\n lines.push(`export type ${OperationName}Response = { status: ${status}; ${bodyField} }`)\n } else {\n lines.push(`export type ${OperationName}Response = { status: ${status} }`)\n }\n } else {\n lines.push(`export type ${OperationName}Response =`)\n for (const [status, responseModel] of responseEntries) {\n const kind = responseKind(status)\n const bodyField = responseBodyField(kind, responseModel)\n if (bodyField != null) lines.push(` | { status: ${status}; ${bodyField} }`)\n else lines.push(` | { status: ${status} }`)\n }\n }\n lines.push(\"\")\n\n // Function params\n const hasRequired = hasParams || hasBody\n const reqParam = hasRequired ? `req: ${OperationName}Request` : `req?: ${OperationName}Request`\n\n // Return type\n const retType = okModel && !isStreamLike ? toTs(okModel, schemaMap, identifier, namespace) : \"Response\"\n\n const pathExpr = operation.path.replace(/\\{(\\w+)\\}/g, (_, name) => `\\${encodeURIComponent(req.${name})}`)\n\n lines.push(`export async function ${functionName}(${reqParam}): Promise<${retType}> {`)\n lines.push(` const baseUrl = req?.baseUrl ?? \"\"`)\n\n if (hasQuery) {\n lines.push(` const parts: string[] = []`)\n for (const [n, q] of Object.entries(operation.queries)) {\n if (q.required) {\n lines.push(` parts.push(\"${n}=\" + encodeURIComponent(req.${n}))`)\n } else {\n lines.push(` if (req?.${n} != null) parts.push(\"${n}=\" + encodeURIComponent(req.${n}))`)\n }\n }\n lines.push(` const qs = parts.length > 0 ? \"?\" + parts.join(\"&\") : \"\"`)\n lines.push(` const url = \\`\\${baseUrl}${pathExpr}\\${qs}\\``)\n } else {\n lines.push(` const url = \\`\\${baseUrl}${pathExpr}\\``)\n }\n\n lines.push(\"\")\n lines.push(` const res = await fetch(url, {`)\n lines.push(` method: \"${operation.method}\",`)\n if (hasBody) {\n lines.push(` headers: { \"Content-Type\": \"application/json\", ...req.headers },`)\n lines.push(` body: JSON.stringify(req.body),`)\n } else {\n lines.push(` headers: req?.headers,`)\n }\n lines.push(` })`)\n lines.push(` if (!res.ok) throw new Error(\\`${operation.method} ${operation.path} failed: \\${res.status}\\`)`)\n\n if (okModel && !isStreamLike) {\n if (okSchema) {\n lines.push(` return ${okSchema}.parse(await res.json())`)\n } else {\n lines.push(` return res.json()`)\n }\n } else {\n lines.push(` return res`)\n }\n lines.push(`}`)\n\n return lines.join(\"\\n\")\n}\n\n// ---- index.ts ----\n\nfunction generateClientIndex(operations: OperationDescriptor[], _identifier: (s: string) => string): string {\n const lines: string[] = []\n\n const groups = groupBy(operations, (operation) => operation.group)\n for (const [group, groupOps] of Object.entries(groups)) {\n lines.push(`// ── ${group} ──`)\n for (const operation of groupOps) {\n const n = camelCase(operation.id)\n const OperationName = pascalCase(operation.id)\n lines.push(`export { ${n}, type ${OperationName}Request, type ${OperationName}Response } from \"./${n}\"`)\n }\n lines.push(\"\")\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction groupBy<T>(items: T[], keyFn: (item: T) => string): Record<string, T[]> {\n const map: Record<string, T[]> = {}\n for (const item of items) {\n const key = keyFn(item)\n if (!map[key]) map[key] = []\n map[key].push(item)\n }\n return map\n}\n\n// ---- helpers ----\n\nfunction toTs(model: Models, schemaMap: SchemaMap, identifier: (s: string) => string, namespace?: string): string {\n void namespace\n switch (model.kind) {\n case \"int32\": case \"float32\": case \"float64\": return \"number\"\n case \"boolean\": return \"boolean\"\n case \"string\": case \"datetime\": case \"date\": case \"duration\": return \"string\"\n case \"literal\": return JSON.stringify(model.value)\n case \"null\": return \"null\"\n case \"array\": case \"set\": return `${toTs(model.base, schemaMap, identifier, namespace)}[]`\n case \"map\": return `Record<string, ${toTs(model.base, schemaMap, identifier, namespace)}>`\n case \"enums\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.variants) return identifier(model.id)\n return Object.values(model.variants).map((v) => JSON.stringify(v)).join(\" | \")\n }\n case \"record\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo?.fields ? identifier(model.id) : \"unknown\"\n }\n case \"union\":\n case \"taggedUnion\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return identifier(model.id)\n return Object.values(model.variants).map((v) => toTs(v as Models, schemaMap, identifier, namespace)).join(\" | \")\n }\n default: return \"unknown\"\n }\n}\n\nfunction toZod(model: Models, schemaMap: SchemaMap): string {\n switch (model.kind) {\n case \"int32\": return \"z.coerce.number().int()\"\n case \"float32\":\n case \"float64\": return \"z.coerce.number()\"\n case \"boolean\": return \"z.coerce.boolean()\"\n case \"string\": return \"z.string()\"\n case \"datetime\": return \"z.string().datetime()\"\n case \"date\": return \"z.string().date()\"\n case \"duration\": return \"z.string()\"\n case \"literal\": return `z.literal(${JSON.stringify(model.value)})`\n case \"null\": return \"z.null()\"\n case \"array\": return `${toZod(model.base, schemaMap)}.array()`\n case \"set\": return `${toZod(model.base, schemaMap)}.array()`\n case \"map\": return `z.record(z.string(), ${toZod(model.base, schemaMap)})`\n case \"enums\": return `z.enum(${JSON.stringify(Object.values(model.variants))})`\n case \"record\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo?.fields ? camelCase(model.id) + \"Schema\" : \"z.unknown()\"\n }\n case \"union\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return camelCase(model.id) + \"Schema\"\n const items = Object.values(model.variants).map((v) => toZod(v as Models, schemaMap))\n return `z.union([${items.join(\", \")}])`\n }\n case \"taggedUnion\": {\n const schemaInfo = schemaMap.get(model.id)\n if (schemaInfo?.unionVariants) return camelCase(model.id) + \"Schema\"\n const items = Object.entries(model.variants).map(([key, v]) =>\n `z.object({ ${JSON.stringify(model.variantKey)}: z.literal(${JSON.stringify(key)}), ${JSON.stringify(model.payloadKey)}: ${toZod(v as Models, schemaMap)} })`)\n return `z.discriminatedUnion(${JSON.stringify(model.variantKey)}, [${items.join(\", \")}])`\n }\n default: return \"z.unknown()\"\n }\n}\n\nfunction resolveZodSchema(model: Models, schemaMap: SchemaMap): string | null {\n switch (model.kind) {\n case \"record\":\n case \"union\":\n case \"taggedUnion\":\n case \"enums\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo ? camelCase(model.id) + \"Schema\" : null\n }\n case \"array\":\n case \"set\": {\n const inner = resolveZodSchema(model.base, schemaMap)\n return inner ? `${inner}.array()` : null\n }\n case \"map\": {\n const inner = resolveZodSchema(model.base, schemaMap)\n return inner ? `z.record(z.string(), ${inner})` : null\n }\n default:\n return null\n }\n}\n\nfunction collectSchemaRefs(model: Models, schemaMap: SchemaMap): string[] {\n switch (model.kind) {\n case \"record\":\n case \"union\":\n case \"taggedUnion\":\n case \"enums\": {\n const schemaInfo = schemaMap.get(model.id)\n return schemaInfo ? [camelCase(model.id) + \"Schema\"] : []\n }\n case \"array\":\n case \"set\":\n return collectSchemaRefs(model.base, schemaMap)\n case \"map\":\n return collectSchemaRefs(model.base, schemaMap)\n default:\n return []\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huanglangjian/specs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -16,26 +16,30 @@
|
|
|
16
16
|
"access": "public"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"es-toolkit": "^1.
|
|
19
|
+
"es-toolkit": "^1.47.0",
|
|
20
20
|
"pathe": "^2.0.3",
|
|
21
|
-
"prettier": "^3.8.
|
|
22
|
-
"prettier-plugin-java": "^2.
|
|
21
|
+
"prettier": "^3.8.4",
|
|
22
|
+
"prettier-plugin-java": "^2.9.7",
|
|
23
23
|
"prettier-plugin-rust": "^0.1.9",
|
|
24
|
-
"text-case": "^1.2.
|
|
24
|
+
"text-case": "^1.2.11",
|
|
25
|
+
"zod": "^4.4.3"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
28
|
+
"@standard-schema/spec": "^1.1.0",
|
|
29
|
+
"@types/node": "^25.9.3",
|
|
30
|
+
"@vitest/ui": "^4.1.8",
|
|
31
|
+
"json-schema-typed": "^8.0.2",
|
|
29
32
|
"temporal-polyfill": "^0.3.2",
|
|
30
|
-
"tsdown": "^0.22.
|
|
31
|
-
"type-fest": "^5.
|
|
33
|
+
"tsdown": "^0.22.2",
|
|
34
|
+
"type-fest": "^5.7.0",
|
|
32
35
|
"typescript": "^6.0.3",
|
|
33
|
-
"vitest": "^4.1.
|
|
36
|
+
"vitest": "^4.1.8"
|
|
34
37
|
},
|
|
35
38
|
"scripts": {
|
|
36
39
|
"build": "tsdown",
|
|
37
40
|
"dev": "tsdown --watch",
|
|
38
41
|
"test": "vitest",
|
|
39
|
-
"test:ui": "vitest --ui"
|
|
42
|
+
"test:ui": "vitest --ui",
|
|
43
|
+
"test:openapi": "tsx src/test.ts"
|
|
40
44
|
}
|
|
41
45
|
}
|