@huanglangjian/specs 0.5.0 → 0.6.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 CHANGED
@@ -2149,6 +2149,7 @@ interface HonoServerOptions {
2149
2149
  routers: RouterModel[];
2150
2150
  identifier?: (id: string) => string;
2151
2151
  namespace?: string;
2152
+ configuration?: RecordModel<Record<string, Models>, string>;
2152
2153
  }
2153
2154
  declare function generateHonoServer(options: HonoServerOptions): Record<string, string>;
2154
2155
  //#endregion
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { camelCase, pascalCase } from "text-case";
1
+ import { camelCase, pascalCase, snakeCase } from "text-case";
2
2
  //#region src/types.ts
3
3
  function int32(options) {
4
4
  return {
@@ -971,13 +971,14 @@ function mergeJsonSchemas(schemas) {
971
971
  //#endregion
972
972
  //#region src/codegen/hono-server.ts
973
973
  function generateHonoServer(options) {
974
- const { routers, identifier = pascalCase, namespace } = options;
974
+ const { routers, identifier = pascalCase, namespace, configuration } = options;
975
975
  const operations = collectOperations(routers);
976
976
  const schemaMap = collectSchemaMap(operations);
977
977
  const files = {};
978
978
  files["models.ts"] = generateModels$1(schemaMap, identifier, namespace);
979
979
  for (const operation of operations) files[`${camelCase(operation.id)}.ts`] = generateOpFile(operation, schemaMap, identifier, namespace);
980
980
  files["index.ts"] = generateIndex(operations, identifier);
981
+ if (configuration) files["config.ts"] = generateConfig(configuration);
981
982
  return files;
982
983
  }
983
984
  function generateModels$1(schemaMap, identifier, namespace) {
@@ -1212,6 +1213,272 @@ function generateIndex(operations, _identifier) {
1212
1213
  lines.push("");
1213
1214
  return lines.join("\n");
1214
1215
  }
1216
+ function generateConfig(config) {
1217
+ const root = collectLevel(config.properties, config.required, "");
1218
+ const out = [];
1219
+ out.push(`import { createEnv } from "@t3-oss/env-core"`);
1220
+ out.push(`import { z } from "zod"`);
1221
+ out.push("");
1222
+ out.push(`const _env = createEnv({`);
1223
+ out.push(` server: {`);
1224
+ for (const v of root.envVars) out.push(` ${v.envName}: ${v.zodExpr},`);
1225
+ out.push(` },`);
1226
+ out.push(` runtimeEnv: process.env,`);
1227
+ out.push(` emptyStringAsUndefined: true,`);
1228
+ out.push(`})`);
1229
+ out.push("");
1230
+ for (const sw of root.switches) emitSwitch(sw, out);
1231
+ out.push(`export function get${pascalCase(config.id)}() {`);
1232
+ out.push(` return {`);
1233
+ for (const f of root.fields) out.push(` ${f.name}: ${emitFieldExpr(f, "_env")},`);
1234
+ out.push(` }`);
1235
+ out.push(`}`);
1236
+ out.push("");
1237
+ return out.join("\n");
1238
+ }
1239
+ function emitSwitch(sw, out) {
1240
+ for (const v of sw.variants) {
1241
+ for (const nestedSw of v.switches) emitSwitch(nestedSw, out);
1242
+ out.push(`function ${v.resolveFnName}() {`);
1243
+ out.push(` const env = createEnv({`);
1244
+ out.push(` server: {`);
1245
+ for (const ev of v.envVars) out.push(` ${ev.envName}: ${ev.zodExpr},`);
1246
+ out.push(` },`);
1247
+ out.push(` runtimeEnv: process.env,`);
1248
+ out.push(` emptyStringAsUndefined: true,`);
1249
+ out.push(` })`);
1250
+ out.push("");
1251
+ out.push(` return {`);
1252
+ for (const f of v.fields) out.push(` ${f.name}: ${emitFieldExpr(f, "env")},`);
1253
+ out.push(` }`);
1254
+ out.push(`}`);
1255
+ out.push("");
1256
+ }
1257
+ out.push(`function ${sw.resolveFnName}() {`);
1258
+ out.push(` switch (_env.${sw.dvEnvName}) {`);
1259
+ for (const v of sw.variants) if (sw.payloadKey != null) out.push(` case "${v.varName}": return { ${sw.variantKey}: "${v.varName}" as const, ${sw.payloadKey}: ${v.resolveFnName}() }`);
1260
+ else out.push(` case "${v.varName}": return { type: "${v.varName}" as const, ...${v.resolveFnName}() }`);
1261
+ out.push(` }`);
1262
+ out.push(`}`);
1263
+ out.push("");
1264
+ }
1265
+ function emitFieldExpr(field, envRef) {
1266
+ switch (field.kind) {
1267
+ case "env": return `${envRef}.${field.envName}`;
1268
+ case "record": return `{ ${field.childFields.map((f) => `${f.name}: ${emitFieldExpr(f, envRef)}`).join(", ")} }`;
1269
+ case "switch": return `${field.switchFnName}()`;
1270
+ }
1271
+ }
1272
+ function collectLevel(properties, required, prefix) {
1273
+ const envVars = [];
1274
+ const fields = [];
1275
+ const switches = [];
1276
+ for (const [propName, model] of Object.entries(properties)) {
1277
+ const envPrefix = prefix ? `${prefix}_${snakeCase(propName).toUpperCase()}` : snakeCase(propName).toUpperCase();
1278
+ switch (model.kind) {
1279
+ case "int32":
1280
+ case "float32":
1281
+ case "float64":
1282
+ case "boolean":
1283
+ case "string":
1284
+ case "datetime":
1285
+ case "date":
1286
+ case "duration":
1287
+ case "literal":
1288
+ case "null":
1289
+ envVars.push({
1290
+ envName: envPrefix,
1291
+ zodExpr: toZodEnv(model)
1292
+ });
1293
+ fields.push({
1294
+ name: propName,
1295
+ kind: "env",
1296
+ envName: envPrefix
1297
+ });
1298
+ break;
1299
+ case "enums":
1300
+ envVars.push({
1301
+ envName: envPrefix,
1302
+ zodExpr: toZodEnv(model)
1303
+ });
1304
+ fields.push({
1305
+ name: propName,
1306
+ kind: "env",
1307
+ envName: envPrefix
1308
+ });
1309
+ break;
1310
+ case "record": {
1311
+ const rec = model;
1312
+ const child = collectLevel(rec.properties, rec.required, envPrefix);
1313
+ envVars.push(...child.envVars);
1314
+ switches.push(...child.switches);
1315
+ fields.push({
1316
+ name: propName,
1317
+ kind: "record",
1318
+ childFields: child.fields
1319
+ });
1320
+ break;
1321
+ }
1322
+ case "taggedUnion": {
1323
+ const dvZod = `z.enum(${JSON.stringify(Object.keys(model.variants))})`;
1324
+ envVars.push({
1325
+ envName: envPrefix,
1326
+ zodExpr: dvZod
1327
+ });
1328
+ const variantKey = model.variantKey;
1329
+ const payloadKey = model.payloadKey;
1330
+ const resolveFnName = `_resolve${pascalCase(propName)}`;
1331
+ const variants = [];
1332
+ for (const [vKey, vModel] of Object.entries(model.variants)) {
1333
+ const vRec = vModel;
1334
+ const child = collectLevel(vRec.properties, vRec.required, envPrefix);
1335
+ variants.push({
1336
+ varName: vKey,
1337
+ resolveFnName: `${resolveFnName}${pascalCase(vKey)}`,
1338
+ envVars: child.envVars,
1339
+ fields: child.fields,
1340
+ switches: child.switches
1341
+ });
1342
+ }
1343
+ switches.push({
1344
+ resolveFnName,
1345
+ dvEnvName: envPrefix,
1346
+ dvZodExpr: dvZod,
1347
+ variantKey,
1348
+ payloadKey,
1349
+ variants
1350
+ });
1351
+ fields.push({
1352
+ name: propName,
1353
+ kind: "switch",
1354
+ switchFnName: resolveFnName
1355
+ });
1356
+ break;
1357
+ }
1358
+ case "union": {
1359
+ const dvEnvName = `${envPrefix}_TYPE`;
1360
+ const dvZod = `z.enum(${JSON.stringify(Object.keys(model.variants))})`;
1361
+ envVars.push({
1362
+ envName: dvEnvName,
1363
+ zodExpr: dvZod
1364
+ });
1365
+ const resolveFnName = `_resolve${pascalCase(propName)}`;
1366
+ const variants = [];
1367
+ for (const [vKey, vModel] of Object.entries(model.variants)) {
1368
+ const child = collectVariant(vModel, envPrefix);
1369
+ variants.push({
1370
+ varName: vKey,
1371
+ resolveFnName: `${resolveFnName}${pascalCase(vKey)}`,
1372
+ envVars: child.envVars,
1373
+ fields: child.fields,
1374
+ switches: child.switches
1375
+ });
1376
+ }
1377
+ switches.push({
1378
+ resolveFnName,
1379
+ dvEnvName,
1380
+ dvZodExpr: dvZod,
1381
+ variantKey: "type",
1382
+ payloadKey: null,
1383
+ variants
1384
+ });
1385
+ fields.push({
1386
+ name: propName,
1387
+ kind: "switch",
1388
+ switchFnName: resolveFnName
1389
+ });
1390
+ break;
1391
+ }
1392
+ case "array":
1393
+ case "set": {
1394
+ const base = model.base;
1395
+ if (!isSimpleType(base)) throw new Error(`unsupported configuration value of kind ${model.kind}<non-simple>, only simple element types are allowed`);
1396
+ envVars.push({
1397
+ envName: envPrefix,
1398
+ zodExpr: toZodEnv(model)
1399
+ });
1400
+ fields.push({
1401
+ name: propName,
1402
+ kind: "env",
1403
+ envName: envPrefix
1404
+ });
1405
+ break;
1406
+ }
1407
+ case "map": throw new Error("unsupported configuration value of kind map");
1408
+ default:
1409
+ envVars.push({
1410
+ envName: envPrefix,
1411
+ zodExpr: "z.string()"
1412
+ });
1413
+ fields.push({
1414
+ name: propName,
1415
+ kind: "env",
1416
+ envName: envPrefix
1417
+ });
1418
+ }
1419
+ }
1420
+ return {
1421
+ envVars,
1422
+ fields,
1423
+ switches
1424
+ };
1425
+ }
1426
+ function collectVariant(model, prefix) {
1427
+ if (model.kind === "record") {
1428
+ const rec = model;
1429
+ return collectLevel(rec.properties, rec.required, prefix);
1430
+ }
1431
+ const envName = prefix;
1432
+ return {
1433
+ envVars: [{
1434
+ envName,
1435
+ zodExpr: toZodEnv(model)
1436
+ }],
1437
+ fields: [{
1438
+ name: "value",
1439
+ kind: "env",
1440
+ envName
1441
+ }],
1442
+ switches: []
1443
+ };
1444
+ }
1445
+ function isSimpleType(model) {
1446
+ return [
1447
+ "int32",
1448
+ "float32",
1449
+ "float64",
1450
+ "boolean",
1451
+ "string",
1452
+ "datetime",
1453
+ "date",
1454
+ "duration",
1455
+ "literal",
1456
+ "enums"
1457
+ ].includes(model.kind);
1458
+ }
1459
+ function toZodEnv(model) {
1460
+ switch (model.kind) {
1461
+ case "int32": return "z.coerce.number().int()";
1462
+ case "float32":
1463
+ case "float64": return "z.coerce.number()";
1464
+ case "boolean": return "z.coerce.boolean()";
1465
+ case "string": return "z.string()";
1466
+ case "datetime": return "z.string().datetime()";
1467
+ case "date": return "z.string().date()";
1468
+ case "duration": return "z.string()";
1469
+ case "literal": return `z.literal(${JSON.stringify(model.value)})`;
1470
+ case "null": return "z.null()";
1471
+ case "enums": return `z.enum(${JSON.stringify(Object.values(model.variants))})`;
1472
+ case "array":
1473
+ if (!isSimpleType(model.base)) throw new Error("unsupported configuration value of kind array<non-simple>, only simple element types are allowed");
1474
+ return `z.coerce.string().transform(s => s.split(',').filter(Boolean)).pipe(z.array(${toZodEnv(model.base)}))`;
1475
+ case "set":
1476
+ if (!isSimpleType(model.base)) throw new Error("unsupported configuration value of kind set<non-simple>, only simple element types are allowed");
1477
+ return `z.coerce.string().transform(s => new Set(s.split(',').filter(Boolean))).pipe(z.set(${toZodEnv(model.base)}))`;
1478
+ case "map": throw new Error("unsupported configuration value of kind map");
1479
+ default: return "z.string()";
1480
+ }
1481
+ }
1215
1482
  function groupBy$1(items, keyFn) {
1216
1483
  const map = {};
1217
1484
  for (const item of items) {
@@ -1 +1 @@
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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"}
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, snakeCase } from \"text-case\"\n\nimport type { RouterModel } from \"../api\"\nimport type { Models, RecordModel } 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 configuration?: RecordModel<Record<string, Models>, string>\n}\n\nexport function generateHonoServer(options: HonoServerOptions): Record<string, string> {\n const { routers, identifier = pascalCase, namespace, configuration } = 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 if (configuration) {\n files[\"config.ts\"] = generateConfig(configuration)\n }\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\n// ---- config.ts ----\n\ninterface EnvVar {\n envName: string\n zodExpr: string\n}\n\ninterface FieldNode {\n name: string\n kind: \"env\" | \"record\" | \"switch\"\n envName?: string\n childFields?: FieldNode[]\n switchFnName?: string\n}\n\ninterface VariantNode {\n varName: string\n resolveFnName: string\n envVars: EnvVar[]\n fields: FieldNode[]\n switches: SwitchNode[]\n}\n\ninterface SwitchNode {\n resolveFnName: string\n dvEnvName: string\n dvZodExpr: string\n variantKey: string\n payloadKey: string | null\n variants: VariantNode[]\n}\n\ninterface CollectResult {\n envVars: EnvVar[]\n fields: FieldNode[]\n switches: SwitchNode[]\n}\n\nlet _switchIdCounter = 0\n\nfunction generateConfig(config: RecordModel<Record<string, Models>, string>): string {\n _switchIdCounter = 0\n const root = collectLevel(config.properties as Record<string, Models>, config.required as string[], \"\")\n\n const out: string[] = []\n\n out.push(`import { createEnv } from \"@t3-oss/env-core\"`)\n out.push(`import { z } from \"zod\"`)\n out.push(\"\")\n\n out.push(`const _env = createEnv({`)\n out.push(` server: {`)\n for (const v of root.envVars) {\n out.push(` ${v.envName}: ${v.zodExpr},`)\n }\n out.push(` },`)\n out.push(` runtimeEnv: process.env,`)\n out.push(` emptyStringAsUndefined: true,`)\n out.push(`})`)\n out.push(\"\")\n\n for (const sw of root.switches) {\n emitSwitch(sw, out)\n }\n\n out.push(`export function get${pascalCase(config.id)}() {`)\n out.push(` return {`)\n for (const f of root.fields) {\n out.push(` ${f.name}: ${emitFieldExpr(f, \"_env\")},`)\n }\n out.push(` }`)\n out.push(`}`)\n out.push(\"\")\n\n return out.join(\"\\n\")\n}\n\nfunction emitSwitch(sw: SwitchNode, out: string[]): void {\n for (const v of sw.variants) {\n for (const nestedSw of v.switches) {\n emitSwitch(nestedSw, out)\n }\n\n out.push(`function ${v.resolveFnName}() {`)\n out.push(` const env = createEnv({`)\n out.push(` server: {`)\n for (const ev of v.envVars) {\n out.push(` ${ev.envName}: ${ev.zodExpr},`)\n }\n out.push(` },`)\n out.push(` runtimeEnv: process.env,`)\n out.push(` emptyStringAsUndefined: true,`)\n out.push(` })`)\n out.push(\"\")\n out.push(` return {`)\n for (const f of v.fields) {\n out.push(` ${f.name}: ${emitFieldExpr(f, \"env\")},`)\n }\n out.push(` }`)\n out.push(`}`)\n out.push(\"\")\n }\n\n out.push(`function ${sw.resolveFnName}() {`)\n out.push(` switch (_env.${sw.dvEnvName}) {`)\n for (const v of sw.variants) {\n if (sw.payloadKey != null) {\n out.push(` case \"${v.varName}\": return { ${sw.variantKey}: \"${v.varName}\" as const, ${sw.payloadKey}: ${v.resolveFnName}() }`)\n } else {\n out.push(` case \"${v.varName}\": return { type: \"${v.varName}\" as const, ...${v.resolveFnName}() }`)\n }\n }\n out.push(` }`)\n out.push(`}`)\n out.push(\"\")\n}\n\nfunction emitFieldExpr(field: FieldNode, envRef: string): string {\n switch (field.kind) {\n case \"env\":\n return `${envRef}.${field.envName}`\n case \"record\":\n return `{ ${field.childFields!.map((f) => `${f.name}: ${emitFieldExpr(f, envRef)}`).join(\", \")} }`\n case \"switch\":\n return `${field.switchFnName}()`\n }\n}\n\nfunction collectLevel(\n properties: Record<string, Models>,\n required: string[],\n prefix: string,\n): CollectResult {\n const envVars: EnvVar[] = []\n const fields: FieldNode[] = []\n const switches: SwitchNode[] = []\n\n for (const [propName, model] of Object.entries(properties)) {\n const envPrefix = prefix\n ? `${prefix}_${snakeCase(propName).toUpperCase()}`\n : snakeCase(propName).toUpperCase()\n\n switch (model.kind) {\n case \"int32\":\n case \"float32\":\n case \"float64\":\n case \"boolean\":\n case \"string\":\n case \"datetime\":\n case \"date\":\n case \"duration\":\n case \"literal\":\n case \"null\":\n envVars.push({ envName: envPrefix, zodExpr: toZodEnv(model as Models) })\n fields.push({ name: propName, kind: \"env\", envName: envPrefix })\n break\n\n case \"enums\":\n envVars.push({ envName: envPrefix, zodExpr: toZodEnv(model as Models) })\n fields.push({ name: propName, kind: \"env\", envName: envPrefix })\n break\n\n case \"record\": {\n const rec = model as RecordModel<Record<string, Models>, string>\n const child = collectLevel(rec.properties as Record<string, Models>, rec.required as string[], envPrefix)\n envVars.push(...child.envVars)\n switches.push(...child.switches)\n fields.push({ name: propName, kind: \"record\", childFields: child.fields })\n break\n }\n\n case \"taggedUnion\": {\n const dvZod = `z.enum(${JSON.stringify(Object.keys(model.variants))})`\n envVars.push({ envName: envPrefix, zodExpr: dvZod })\n\n const variantKey = model.variantKey as string\n const payloadKey = model.payloadKey as string\n const resolveFnName = `_resolve${pascalCase(propName)}`\n\n const variants: VariantNode[] = []\n for (const [vKey, vModel] of Object.entries(model.variants)) {\n const vRec = vModel as RecordModel<Record<string, Models>, string>\n const child = collectLevel(vRec.properties as Record<string, Models>, vRec.required as string[], envPrefix)\n variants.push({\n varName: vKey,\n resolveFnName: `${resolveFnName}${pascalCase(vKey)}`,\n envVars: child.envVars,\n fields: child.fields,\n switches: child.switches,\n })\n }\n\n switches.push({ resolveFnName, dvEnvName: envPrefix, dvZodExpr: dvZod, variantKey, payloadKey, variants })\n fields.push({ name: propName, kind: \"switch\", switchFnName: resolveFnName })\n break\n }\n\n case \"union\": {\n const dvEnvName = `${envPrefix}_TYPE`\n const dvZod = `z.enum(${JSON.stringify(Object.keys(model.variants))})`\n envVars.push({ envName: dvEnvName, zodExpr: dvZod })\n\n const resolveFnName = `_resolve${pascalCase(propName)}`\n\n const variants: VariantNode[] = []\n for (const [vKey, vModel] of Object.entries(model.variants)) {\n const child = collectVariant(vModel as Models, envPrefix)\n variants.push({\n varName: vKey,\n resolveFnName: `${resolveFnName}${pascalCase(vKey)}`,\n envVars: child.envVars,\n fields: child.fields,\n switches: child.switches,\n })\n }\n\n switches.push({ resolveFnName, dvEnvName, dvZodExpr: dvZod, variantKey: \"type\", payloadKey: null, variants })\n fields.push({ name: propName, kind: \"switch\", switchFnName: resolveFnName })\n break\n }\n\n case \"array\":\n case \"set\": {\n const base = (model as { base: Models }).base\n if (!isSimpleType(base)) {\n throw new Error(`unsupported configuration value of kind ${model.kind}<non-simple>, only simple element types are allowed`)\n }\n envVars.push({ envName: envPrefix, zodExpr: toZodEnv(model) })\n fields.push({ name: propName, kind: \"env\", envName: envPrefix })\n break\n }\n\n case \"map\":\n throw new Error(\"unsupported configuration value of kind map\")\n\n default:\n envVars.push({ envName: envPrefix, zodExpr: \"z.string()\" })\n fields.push({ name: propName, kind: \"env\", envName: envPrefix })\n }\n }\n\n return { envVars, fields, switches }\n}\n\nfunction collectVariant(model: Models, prefix: string): CollectResult {\n if (model.kind === \"record\") {\n const rec = model as RecordModel<Record<string, Models>, string>\n return collectLevel(rec.properties as Record<string, Models>, rec.required as string[], prefix)\n }\n const envName = prefix\n return {\n envVars: [{ envName, zodExpr: toZodEnv(model) }],\n fields: [{ name: \"value\", kind: \"env\", envName }],\n switches: [],\n }\n}\n\nfunction isSimpleType(model: Models): boolean {\n return [\"int32\", \"float32\", \"float64\", \"boolean\", \"string\", \"datetime\", \"date\", \"duration\", \"literal\", \"enums\"].includes(model.kind)\n}\n\nfunction toZodEnv(model: Models): 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 \"enums\": return `z.enum(${JSON.stringify(Object.values(model.variants))})`\n case \"array\": {\n if (!isSimpleType(model.base)) throw new Error(\"unsupported configuration value of kind array<non-simple>, only simple element types are allowed\")\n return `z.coerce.string().transform(s => s.split(',').filter(Boolean)).pipe(z.array(${toZodEnv(model.base)}))`\n }\n case \"set\": {\n if (!isSimpleType(model.base)) throw new Error(\"unsupported configuration value of kind set<non-simple>, only simple element types are allowed\")\n return `z.coerce.string().transform(s => new Set(s.split(',').filter(Boolean))).pipe(z.set(${toZodEnv(model.base)}))`\n }\n case \"map\":\n throw new Error(\"unsupported configuration value of kind map\")\n default:\n return \"z.string()\"\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.5.0",
3
+ "version": "0.6.0",
4
4
  "private": false,
5
5
  "files": [
6
6
  "dist"