@huanglangjian/specs 0.3.0 → 0.4.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 +11 -12
- package/dist/index.mjs +18 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -11
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../../node_modules/.pnpm/type-fest@5.
|
|
1
|
+
//#region ../../node_modules/.pnpm/type-fest@5.6.0/node_modules/type-fest/source/simplify.d.ts
|
|
2
2
|
/**
|
|
3
3
|
Useful to flatten the type output to improve type hints shown in editors. And also to transform an interface into a type to aide with assignability.
|
|
4
4
|
|
|
@@ -787,14 +787,6 @@ interface JsonContentModel {
|
|
|
787
787
|
}
|
|
788
788
|
interface JsonContentOptions extends Omit<JsonContentModel, "kind"> {}
|
|
789
789
|
declare function json(options: JsonContentOptions): JsonContentModel;
|
|
790
|
-
interface PlainTextStreamContentModel {
|
|
791
|
-
kind: "plain-text-stream-content";
|
|
792
|
-
type: PlainTextLikeContentType;
|
|
793
|
-
model?: StringModel;
|
|
794
|
-
description?: string;
|
|
795
|
-
}
|
|
796
|
-
interface PlainTextStreamContentOptions extends Omit<PlainTextStreamContentModel, "kind"> {}
|
|
797
|
-
declare function plainTextStream(options: PlainTextStreamContentOptions): PlainTextStreamContentModel;
|
|
798
790
|
interface JsonStreamContentModel {
|
|
799
791
|
kind: "json-stream-content";
|
|
800
792
|
type: JsonStreamLikeContentType;
|
|
@@ -823,15 +815,22 @@ interface FormContentOptions<T extends {
|
|
|
823
815
|
declare function form<T extends {
|
|
824
816
|
[key: string]: AllowedHttpValue;
|
|
825
817
|
}>(options: FormContentOptions<T>): FormContentModel<T>;
|
|
826
|
-
type HttpContentModel = PlainTextContentModel | JsonContentModel |
|
|
818
|
+
type HttpContentModel = PlainTextContentModel | JsonContentModel | JsonStreamContentModel | BinaryStreamContentModel | FormContentModel<{
|
|
827
819
|
[key: string]: AllowedHttpValue;
|
|
828
|
-
}
|
|
820
|
+
}> | ServerSentEventContentModel;
|
|
829
821
|
type PlainTextLikeContentType = (string & {}) | "text/plain" | "text/html" | "text/css" | "text/xml" | "text/markdown" | "text/csv";
|
|
830
822
|
type JsonLikeContentType = (string & {}) | "application/json" | "application/json; charset=utf-8" | "application/ld+json" | "application/hal+json" | "application/vnd.api+json" | "application/problem+json" | "application/schema+json";
|
|
831
823
|
type PlainTextStreamLikeContentType = (string & {}) | "text/event-stream";
|
|
832
824
|
type JsonStreamLikeContentType = (string & {}) | "application/ndjson" | "application/x-ndjson" | "application/jsonl" | "application/json-seq" | "application/stream+json";
|
|
833
825
|
type BinaryLikeContentType = (string & {}) | "application/octet-stream" | "application/pdf" | "application/zip" | "application/gzip" | "image/jpeg" | "image/png" | "image/gif" | "image/webp" | "image/svg+xml" | "audio/mpeg" | "audio/wav" | "video/mp4" | "video/webm";
|
|
834
826
|
type FormLikeContentType = (string & {}) | "application/x-www-form-urlencoded" | "multipart/form-data";
|
|
827
|
+
interface ServerSentEventContentModel {
|
|
828
|
+
kind: "server-sent-event-content";
|
|
829
|
+
type: "text/event-stream";
|
|
830
|
+
model?: TypeModels;
|
|
831
|
+
}
|
|
832
|
+
type ServerSentEventContentOptions = Partial<ServerSentEventContentModel>;
|
|
833
|
+
declare function sse(options?: ServerSentEventContentOptions): ServerSentEventContentModel;
|
|
835
834
|
//#endregion
|
|
836
835
|
//#region src/generator/java.d.ts
|
|
837
836
|
interface GenerateJavaClassOptions {
|
|
@@ -915,5 +914,5 @@ interface DeserializeFailed {
|
|
|
915
914
|
type DeserializeResult<T> = DeserializeSuccess<T> | DeserializeFailed;
|
|
916
915
|
declare function serialize<T extends TypeModels>(model: T, value: InferDeserialized<T>): string;
|
|
917
916
|
//#endregion
|
|
918
|
-
export { AllowedHttpValue, ArrayModel, ArrayModelOptions, BasicModel, BinaryLikeContentType, BinaryStreamContentModel, BinaryStreamContentOptions, BooleanModel, BooleanModelOptions, DateModel, DateModelOptions, DatetimeModel, DatetimeModelOptions, DeserializeFailed, DeserializeResult, DeserializeSuccess, DurationModel, DurationModelOptions, EnumsModel, EnumsModelOptions, ErrorModel, ErrorModelOptions, Float32Model, Float32ModelOptions, Float64Model, Float64ModelOptions, FormContentModel, FormContentOptions, FormLikeContentType, GenerateJavaClassOptions, GenerateJavaOptions, GenerateOpenapiOptions, GenerateRustCodeOptions, GenerateRustOptions, HttpContentModel, HttpResponseModel, HttpRouteModel, HttpRouteModelOptions, InferDeserialized, InferDeserializedError, InferDeserializedRecord, InferDeserializedTaggedUnion, InferDeserializedUnion, InferErrorModel, InferModelJsonType, InferRecordJsonType, InferTaggedUnionJsonType, InferUnionJsonType, Int32Model, Int32ModelOptions, Int64Model, Int64ModelOptions, JsonContentModel, JsonContentOptions, JsonLikeContentType, JsonStreamContentModel, JsonStreamContentOptions, JsonStreamLikeContentType, KeyOfOptional, LiteralModel, LiteralModelOptions, MapModel, MapModelOptions, ModelToJsonSchemaOptions, NamedModel, OptionalModel, OptionalModelOptions, Optionalize, PartialOf, PlainTextContentModel, PlainTextContentOptions, PlainTextLikeContentType,
|
|
917
|
+
export { AllowedHttpValue, ArrayModel, ArrayModelOptions, BasicModel, BinaryLikeContentType, BinaryStreamContentModel, BinaryStreamContentOptions, BooleanModel, BooleanModelOptions, DateModel, DateModelOptions, DatetimeModel, DatetimeModelOptions, DeserializeFailed, DeserializeResult, DeserializeSuccess, DurationModel, DurationModelOptions, EnumsModel, EnumsModelOptions, ErrorModel, ErrorModelOptions, Float32Model, Float32ModelOptions, Float64Model, Float64ModelOptions, FormContentModel, FormContentOptions, FormLikeContentType, GenerateJavaClassOptions, GenerateJavaOptions, GenerateOpenapiOptions, GenerateRustCodeOptions, GenerateRustOptions, HttpContentModel, HttpResponseModel, HttpRouteModel, HttpRouteModelOptions, InferDeserialized, InferDeserializedError, InferDeserializedRecord, InferDeserializedTaggedUnion, InferDeserializedUnion, InferErrorModel, InferModelJsonType, InferRecordJsonType, InferTaggedUnionJsonType, InferUnionJsonType, Int32Model, Int32ModelOptions, Int64Model, Int64ModelOptions, JsonContentModel, JsonContentOptions, JsonLikeContentType, JsonStreamContentModel, JsonStreamContentOptions, JsonStreamLikeContentType, KeyOfOptional, LiteralModel, LiteralModelOptions, MapModel, MapModelOptions, ModelToJsonSchemaOptions, NamedModel, OptionalModel, OptionalModelOptions, Optionalize, PartialOf, PlainTextContentModel, PlainTextContentOptions, PlainTextLikeContentType, PlainTextStreamLikeContentType, RecordModel, RecordModelOptions, ServerSentEventContentModel, ServerSentEventContentOptions, SetModel, SetModelOptions, StringModel, StringModelOptions, TaggedUnionModel, TaggedUnionModelOptions, TypeModels, UnionModel, UnionModelOptions, array, binary, boolean, collectModelDeep, collectModelFromRoutes, date, datetime, deserialize, deserializeInner, duration, enums, error, float32, float64, form, formatJava, formatRust, generateJavaClass, generateJavaCodes, generateJsonSchema, generateOpenapi, generateRustCode, generateRustCodes, int32, int64, json, jsonStream, literal, map, optional, plainText, record, route, serialize, set, sse, string, taggedUnion, union };
|
|
919
918
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -397,7 +397,8 @@ function generateRequestBodyObject(content) {
|
|
|
397
397
|
switch (content.kind) {
|
|
398
398
|
case "plain-text-content":
|
|
399
399
|
case "json-content":
|
|
400
|
-
case "form-content":
|
|
400
|
+
case "form-content":
|
|
401
|
+
case "server-sent-event-content": return { content: { [content.type]: generateMeidaTypeObject(content) } };
|
|
401
402
|
default: return {
|
|
402
403
|
description: content.description,
|
|
403
404
|
content: { [content.type]: generateMeidaTypeObject(content) }
|
|
@@ -407,13 +408,6 @@ function generateRequestBodyObject(content) {
|
|
|
407
408
|
function generateMeidaTypeObject(content) {
|
|
408
409
|
switch (content.kind) {
|
|
409
410
|
case "plain-text-content": return { schema: content.model ? getSchemaReference(content.model) : { type: "string" } };
|
|
410
|
-
case "plain-text-stream-content": return {
|
|
411
|
-
schema: {
|
|
412
|
-
type: "string",
|
|
413
|
-
format: "binary"
|
|
414
|
-
},
|
|
415
|
-
itemSchema: content.model ? getSchemaReference(content.model) : { type: "string" }
|
|
416
|
-
};
|
|
417
411
|
case "json-content": return { schema: getSchemaReference(content.model) };
|
|
418
412
|
case "json-stream-content": return {
|
|
419
413
|
schema: {
|
|
@@ -432,6 +426,13 @@ function generateMeidaTypeObject(content) {
|
|
|
432
426
|
format: "binary"
|
|
433
427
|
}
|
|
434
428
|
};
|
|
429
|
+
case "server-sent-event-content": return {
|
|
430
|
+
schema: {
|
|
431
|
+
type: "string",
|
|
432
|
+
format: "binary"
|
|
433
|
+
},
|
|
434
|
+
itemSchema: content.model ? getSchemaReference(content.model) : { type: "string" }
|
|
435
|
+
};
|
|
435
436
|
case "form-content": return { schema: getSchemaReference(content.model) };
|
|
436
437
|
}
|
|
437
438
|
}
|
|
@@ -465,12 +466,6 @@ function json(options) {
|
|
|
465
466
|
...options
|
|
466
467
|
};
|
|
467
468
|
}
|
|
468
|
-
function plainTextStream(options) {
|
|
469
|
-
return {
|
|
470
|
-
kind: "plain-text-stream-content",
|
|
471
|
-
...options
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
469
|
function jsonStream(options) {
|
|
475
470
|
return {
|
|
476
471
|
kind: "json-stream-content",
|
|
@@ -489,6 +484,14 @@ function form(options) {
|
|
|
489
484
|
...options
|
|
490
485
|
};
|
|
491
486
|
}
|
|
487
|
+
function sse(options) {
|
|
488
|
+
const { kind = "server-sent-event-content", type = "text/event-stream", model } = options ?? {};
|
|
489
|
+
return {
|
|
490
|
+
kind,
|
|
491
|
+
type,
|
|
492
|
+
model
|
|
493
|
+
};
|
|
494
|
+
}
|
|
492
495
|
//#endregion
|
|
493
496
|
//#region src/generator/java.ts
|
|
494
497
|
function generateJavaClass(options) {
|
|
@@ -1005,6 +1008,6 @@ function serialize(model, value) {
|
|
|
1005
1008
|
return String(value);
|
|
1006
1009
|
}
|
|
1007
1010
|
//#endregion
|
|
1008
|
-
export { array, binary, boolean, collectModelDeep, collectModelFromRoutes, date, datetime, deserialize, deserializeInner, duration, enums, error, float32, float64, form, formatJava, formatRust, generateJavaClass, generateJavaCodes, generateJsonSchema, generateOpenapi, generateRustCode, generateRustCodes, int32, int64, json, jsonStream, literal, map, optional, plainText,
|
|
1011
|
+
export { array, binary, boolean, collectModelDeep, collectModelFromRoutes, date, datetime, deserialize, deserializeInner, duration, enums, error, float32, float64, form, formatJava, formatRust, generateJavaClass, generateJavaCodes, generateJsonSchema, generateOpenapi, generateRustCode, generateRustCodes, int32, int64, json, jsonStream, literal, map, optional, plainText, record, route, serialize, set, sse, string, taggedUnion, union };
|
|
1009
1012
|
|
|
1010
1013
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["generateModelSignature","generateStaticValue"],"sources":["../src/type-system/basic.ts","../src/type-system/http.ts","../src/generator/java.ts","../src/generator/rust.ts","../src/type-system/serialize.ts"],"sourcesContent":["import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchemaObject } from \"@/schemas/json-schema-draft-2020-12\"\nimport type { ArraySchema, MapSchema, NumberSchema, SetSchema, StringSchema } from \"@/schemas/schema-variants\"\n\nexport interface BasicModel<T> {\n id?: string\n title?: string\n description?: string\n examples?: T[]\n default?: T\n deprecated?: boolean\n}\n\nexport interface Int32Model extends BasicModel<number> {\n kind: \"int32\"\n schema?: NumberSchema\n}\n\nexport interface Int32ModelOptions extends Omit<Int32Model, \"kind\"> {}\n\nexport function int32(options?: Int32ModelOptions): Int32Model {\n return { kind: \"int32\", ...options }\n}\n\nexport interface Int64Model extends BasicModel<string> {\n kind: \"int64\"\n schema?: StringSchema\n}\n\nexport interface Int64ModelOptions extends Omit<Int64Model, \"kind\"> {}\n\nexport function int64(options?: Int64ModelOptions): Int64Model {\n return { kind: \"int64\", ...options }\n}\n\nexport interface Float32Model extends BasicModel<number> {\n kind: \"float32\"\n schema?: NumberSchema\n}\n\nexport interface Float32ModelOptions extends Omit<Float32Model, \"kind\"> {}\n\nexport function float32(options?: Float32ModelOptions): Float32Model {\n return { kind: \"float32\", ...options }\n}\n\nexport interface Float64Model extends BasicModel<number> {\n kind: \"float64\"\n schema?: NumberSchema\n}\n\nexport interface Float64ModelOptions extends Omit<Float64Model, \"kind\"> {}\n\nexport function float64(options?: Float64ModelOptions): Float64Model {\n return { kind: \"float64\", ...options }\n}\n\nexport interface BooleanModel extends BasicModel<boolean> {\n kind: \"boolean\"\n}\n\nexport interface BooleanModelOptions extends Omit<BooleanModel, \"kind\"> {}\n\nexport function boolean(options?: BooleanModelOptions): BooleanModel {\n return { kind: \"boolean\", ...options }\n}\n\nexport interface StringModel extends BasicModel<string> {\n kind: \"string\"\n schema?: StringSchema\n}\n\nexport interface StringModelOptions extends Omit<StringModel, \"kind\"> {}\n\nexport function string(options?: StringModelOptions): StringModel {\n return { kind: \"string\", ...options }\n}\n\nexport interface LiteralModel<T extends string | number | boolean> extends BasicModel<T> {\n kind: \"literal\"\n value: T\n}\n\nexport interface LiteralModelOptions<T extends string | number | boolean> extends Omit<LiteralModel<T>, \"kind\"> {}\n\nexport function literal<const T extends string | number | boolean>(options: LiteralModelOptions<T>): LiteralModel<T> {\n return { kind: \"literal\", ...options }\n}\n\n/**\n * 表示一个可选类型,代表\"值可能存在也可能不存在\"的语义。\n *\n * 设计理念:\n * - 统一\"空白\"语义:将 `null`、`undefined` 和缺失值等多种\"空\"的概念合并为单一语义,\n * 避免类型系统中存在多个含义模糊的\"空\"状态。\n * - 序列化到 JSON 时,`Optional` 可以表示为 `null` 或完全省略(取决于上下文)。\n * `InferModelJsonType<T> | null | undefined` 表示该值可以是基础类型、`null` 或 `undefined`。\n * - 如果需要区分\"显式设置为空\"和\"从未设置\"等细分语义,应当另行设计专用类型。\n *\n * @template T 基础模型类型\n */\nexport interface OptionalModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T> | null | undefined> {\n kind: \"optional\"\n base: T\n}\n\n/**\n * 将类型模型转换为可选类型。\n *\n * @template T 基础模型类型\n */\nexport type Optionalize<T extends TypeModels> = T extends TypeModels ? OptionalModel<T> : never\n\nexport interface OptionalModelOptions<T extends TypeModels> extends Omit<OptionalModel<T>, \"kind\" | \"base\"> {}\n\n/**\n * 创建一个可选类型模型。\n *\n * @param base 基础模型类型\n * @param options 可选配置选项\n * @returns 可选类型模型\n */\nexport function optional<T extends TypeModels>(base: T, options?: OptionalModelOptions<T>): OptionalModel<T> {\n return { kind: \"optional\", base, ...options }\n}\n\nexport interface ArrayModel<T> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"array\"\n base: T\n schema?: ArraySchema\n}\n\nexport interface ArrayModelOptions<T extends TypeModels> extends Omit<ArrayModel<T>, \"kind\" | \"base\"> {}\n\nexport function array<T extends TypeModels>(base: T, options?: ArrayModelOptions<T>): ArrayModel<T> {\n return { kind: \"array\", base, ...options }\n}\n\nexport interface SetModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"set\"\n base: T\n schema?: SetSchema\n}\n\nexport interface SetModelOptions<T extends TypeModels> extends Omit<SetModel<T>, \"kind\" | \"base\"> {}\n\nexport function set<T extends TypeModels>(base: T, options?: SetModelOptions<T>): SetModel<T> {\n return { kind: \"set\", base, ...options }\n}\n\nexport interface MapModel<T> extends BasicModel<{ [key: string]: InferModelJsonType<T> }> {\n kind: \"map\"\n base: T\n schema?: MapSchema\n}\n\nexport interface MapModelOptions<T extends TypeModels> extends Omit<MapModel<T>, \"kind\" | \"base\"> {}\n\nexport function map<T extends TypeModels>(base: T, options?: MapModelOptions<T>): MapModel<T> {\n return { kind: \"map\", base, ...options }\n}\n\nexport interface RecordModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferRecordJsonType<T>> {\n kind: \"record\"\n id: string\n properties: T\n}\n\nexport type KeyOfOptional<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: T[key] extends OptionalModel<any> ? key : never\n}[keyof T]\n\n/* prettier-ignore */\nexport type InferRecordJsonType<T extends { [key: string]: TypeModels },O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferModelJsonType<T[key]> } \n & { [key in O]?: InferModelJsonType<T[key]> }\n>\n\nexport interface RecordModelOptions<T extends { [key: string]: TypeModels }> extends Omit<RecordModel<T>, \"kind\"> {}\n\nexport function record<const T extends { [key: string]: TypeModels }>(options: RecordModelOptions<T>): RecordModel<T> {\n return { kind: \"record\", ...options }\n}\n\nexport interface UnionModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferUnionJsonType<T>> {\n kind: \"union\"\n id: string\n variants: T\n}\n\nexport type InferUnionJsonType<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferModelJsonType<T[key]> }\n}[keyof T]\n\nexport interface UnionModelOptions<T extends { [key: string]: TypeModels }> extends Omit<UnionModel<T>, \"kind\"> {}\n\nexport function union<const T extends { [key: string]: TypeModels }>(options: UnionModelOptions<T>): UnionModel<T> {\n return { kind: \"union\", ...options }\n}\n\nexport interface DatetimeModel extends BasicModel<string> {\n kind: \"datetime\"\n schema?: StringSchema\n}\n\nexport interface DatetimeModelOptions extends Omit<DatetimeModel, \"kind\"> {}\n\nexport function datetime(options?: DatetimeModelOptions): DatetimeModel {\n return { kind: \"datetime\", ...options }\n}\n\nexport interface DateModel extends BasicModel<string> {\n kind: \"date\"\n schema?: StringSchema\n}\n\nexport interface DateModelOptions extends Omit<DateModel, \"kind\"> {}\n\nexport function date(options?: DateModelOptions): DateModel {\n return { kind: \"date\", ...options }\n}\n\nexport interface DurationModel extends BasicModel<string> {\n kind: \"duration\"\n schema?: StringSchema\n}\n\nexport interface DurationModelOptions extends Omit<DurationModel, \"kind\"> {}\n\nexport function duration(options?: DurationModelOptions): DurationModel {\n return { kind: \"duration\", ...options }\n}\n\nexport interface ErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> extends BasicModel<\n InferErrorModel<Code, Context>\n> {\n kind: \"error\"\n id: string\n code: Code\n context: Context\n}\n\n/* prettier-ignore */\nexport type InferErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> = { \n code: Code\n context: InferRecordJsonType<Context> \n}\n\nexport interface ErrorModelOptions<Code extends string, Context extends { [key: string]: TypeModels }> extends Omit<\n ErrorModel<Code, Context>,\n \"kind\"\n> {}\n\nexport function error<const Code extends string, Context extends { [key: string]: TypeModels }>(\n options: ErrorModelOptions<Code, Context>,\n): ErrorModel<Code, Context> {\n return { kind: \"error\", ...options }\n}\n\nexport interface EnumsModel<T extends { [key: string]: string }> extends BasicModel<T[keyof T]> {\n id: string\n kind: \"enums\"\n variants: T\n}\n\nexport interface EnumsModelOptions<T extends { [key: string]: string }> extends Omit<EnumsModel<T>, \"kind\"> {}\n\nexport function enums<const T extends { [key: string]: string }>(options: EnumsModelOptions<T>): EnumsModel<T> {\n return { kind: \"enums\", ...options }\n}\n\nexport interface TaggedUnionModel<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends BasicModel<InferTaggedUnionJsonType<Tag, Variants>> {\n id: string\n kind: \"tagged-union\"\n tag: Tag\n variants: Variants\n}\n\nexport type InferTaggedUnionJsonType<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> = {\n [key in keyof Variants]: Variants[key] extends RecordModel<infer R> ? InferRecordJsonType<R> : never\n}[keyof Variants]\n\nexport interface TaggedUnionModelOptions<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends Omit<TaggedUnionModel<Tag, Variants>, \"kind\"> {}\n\nexport function taggedUnion<\n const Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n>(options: TaggedUnionModelOptions<Tag, Variants>): TaggedUnionModel<Tag, Variants> {\n return { kind: \"tagged-union\", ...options }\n}\n\nexport type TypeModels =\n | Int32Model\n | Int64Model\n | Float32Model\n | Float64Model\n | BooleanModel\n | StringModel\n | LiteralModel<string | number | boolean>\n | OptionalModel<TypeModels>\n | ArrayModel<TypeModels>\n | SetModel<TypeModels>\n | MapModel<TypeModels>\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | TaggedUnionModel<string, { [key: string]: any }>\n | DatetimeModel\n | DateModel\n | DurationModel\n | ErrorModel<string, { [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n\n/* prettier-ignore */\nexport type InferModelJsonType<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model? number\n : T extends Int64Model? string\n : T extends Float32Model? number\n : T extends Float64Model? number\n : T extends BooleanModel? boolean\n : T extends StringModel? string\n : T extends LiteralModel<infer R>? R\n : T extends OptionalModel<infer R> ? InferModelJsonType<R> | undefined | null\n : T extends ArrayModel<infer R>? InferModelJsonType<R>[]\n : T extends SetModel<infer R>? InferModelJsonType<R>[]\n : T extends MapModel<infer R>? Record<string, InferModelJsonType<R>>\n : T extends RecordModel<infer R>? InferRecordJsonType<R>\n : T extends UnionModel<infer R>? InferUnionJsonType<R>\n : T extends TaggedUnionModel<infer Tag, infer Variants> ? InferTaggedUnionJsonType<Tag, Variants>\n : T extends DatetimeModel? string\n : T extends DateModel? string\n : T extends DurationModel? string\n : T extends ErrorModel<infer Code, infer Context>? InferErrorModel<Code, Context>\n : T extends EnumsModel<infer R>? R[keyof R]\n : never\n\nexport interface ModelToJsonSchemaOptions {\n model: TypeModels\n target?: \"draft-2020-12\"\n reference?: \"inline\" | \"json-schema\" | \"openapi\"\n depth?: number\n}\n\nexport function generateJsonSchema(options: ModelToJsonSchemaOptions): JsonSchemaObject {\n const { model, target = \"draft-2020-12\", reference = \"json-schema\", depth = 0 } = options ?? {}\n\n const $schema = getSchemaRef(target)\n\n const convert = (partial?: JsonSchemaObject): JsonSchemaObject => ({\n $schema: depth === 0 ? $schema : undefined,\n title: model.title,\n description: model.description,\n examples: model.examples,\n deprecated: model.deprecated,\n default: model.default,\n ...partial,\n ...(\"schema\" in model ? model.schema : {}),\n })\n\n const getReferenceSchema = (schema: TypeModels): JsonSchemaObject => {\n switch (reference) {\n case \"inline\":\n return generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"json-schema\":\n return schema.id != null\n ? { $ref: \"#/$defs/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"openapi\":\n return schema.id != null\n ? { $ref: \"#/components/schemas/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n }\n }\n\n switch (model.kind) {\n case \"int32\":\n return convert({\n type: \"integer\",\n format: \"int32\",\n })\n\n case \"float32\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"float64\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"int64\":\n return convert({\n type: \"string\",\n format: \"int64\",\n })\n\n case \"boolean\":\n return convert({\n type: \"boolean\",\n })\n\n case \"string\":\n return convert({\n type: \"string\",\n })\n\n case \"literal\":\n return convert({\n const: model.value,\n })\n\n case \"optional\": {\n const baseSchema = getReferenceSchema(model.base)\n\n if (\"$ref\" in baseSchema)\n return convert({\n oneOf: [baseSchema, { type: \"null\" }],\n })\n\n const { type = [], ...others } = baseSchema\n\n return convert({\n type: Array.isArray(type) ? ([...new Set([...type, \"null\"])] as JsonSchemaObject[\"type\"]) : [type, \"null\"],\n ...others,\n })\n }\n\n case \"array\":\n return convert({\n type: \"array\",\n items: getReferenceSchema(model.base),\n })\n\n case \"set\":\n return {\n $schema,\n type: \"array\",\n items: getReferenceSchema(model.base),\n uniqueItems: true,\n }\n\n case \"map\":\n return convert({\n type: \"object\",\n additionalProperties: getReferenceSchema(model.base),\n })\n\n case \"record\":\n return convert({\n type: \"object\",\n properties: Object.fromEntries(Object.entries(model.properties).map(([k, v]) => [k, getReferenceSchema(v)])),\n required: Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"optional\")\n .map(([k]) => k),\n additionalProperties: false,\n })\n\n case \"union\":\n return convert({\n oneOf: Object.entries(model.variants).map(([k, v]) => ({\n type: \"object\",\n title: v.title ?? k,\n properties: { [k]: getReferenceSchema(v as TypeModels) },\n required: [k],\n additionalProperties: false,\n })),\n })\n\n case \"tagged-union\":\n return convert({\n oneOf: Object.values(model.variants).map((o) => getReferenceSchema(o)),\n })\n\n case \"datetime\":\n return convert({\n type: \"string\",\n format: \"date-time\",\n })\n\n case \"date\":\n return convert({\n type: \"string\",\n format: \"date\",\n })\n\n case \"duration\":\n return convert({\n type: \"string\",\n format: \"duration\",\n })\n\n case \"error\":\n return convert({\n type: \"object\",\n properties: {\n code: { const: model.code },\n context:\n model.context == null\n ? undefined\n : {\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(model.context).map(([k, v]) => [k, getReferenceSchema(v as TypeModels)]),\n ),\n additionalProperties: false,\n },\n },\n additionalProperties: false,\n })\n\n case \"enums\":\n return convert({\n type: \"string\",\n enum: Object.values(model.variants),\n })\n }\n}\n\nfunction getSchemaRef(target: ModelToJsonSchemaOptions[\"target\"]) {\n switch (target) {\n case \"draft-2020-12\":\n return \"https://json-schema.org/draft/2020-12/schema\"\n }\n}\n\nexport type NamedModel =\n | RecordModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | UnionModel<{ [key: string]: TypeModels }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n","import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchema } from \"@/schemas/json-schema-draft-2020-12\"\nimport type {\n HeaderObject,\n MediaTypeObject,\n OpenAPIObject,\n OperationObject,\n ParameterObjectAsSchema,\n PathItemObject,\n PathsObject,\n RequestBodyObject,\n ResponseObject,\n} from \"@/schemas/openapi-schema\"\nimport { type ExtractPathParams } from \"@/utils\"\n\nimport {\n generateJsonSchema,\n type BooleanModel,\n type Int32Model,\n type Int64Model,\n type LiteralModel,\n type Optionalize,\n type OptionalModel,\n type RecordModel,\n type StringModel,\n type TypeModels,\n} from \"./basic\"\n\nexport type AllowedHttpValue =\n | StringModel\n | Int32Model\n | Int64Model\n | BooleanModel\n | LiteralModel<string | number | boolean>\n | Optionalize<StringModel | Int32Model | Int64Model | BooleanModel | LiteralModel<string | number | boolean>>\n\nexport type PartialOf<T extends { [key: string]: any }, K extends keyof T> = Simplify<\n { [key in Exclude<keyof T, K>]: T[key] } & { [key in K]?: T[key] }\n>\n\nexport interface GenerateOpenapiOptions {\n info: OpenAPIObject[\"info\"]\n routes: HttpRouteModel[]\n securitySchemes?: NonNullable<OpenAPIObject[\"components\"]>[\"securitySchemes\"]\n tags?: OpenAPIObject[\"tags\"]\n servers?: OpenAPIObject[\"servers\"]\n}\n\nexport function generateOpenapi(options: GenerateOpenapiOptions): OpenAPIObject {\n const { info, routes, securitySchemes, tags, servers } = options\n\n const models = collectModelFromRoutes(routes)\n\n return {\n openapi: \"3.2.0\",\n info,\n paths: generatePathsObject(routes),\n components: {\n schemas: Object.fromEntries(generateComponentSchemasFromModels(models)),\n securitySchemes,\n },\n tags,\n servers,\n }\n}\n\nexport function collectModelFromRoutes(routes: HttpRouteModel[]): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const route of routes)\n for (const [id, model] of collectModelsFromRoute(route)) {\n models.set(id, model)\n }\n\n return models\n}\n\nexport function collectModelDeep(model: TypeModels): Map<string, TypeModels> {\n const ret = new Map<string, TypeModels>()\n\n if (model.id != null) ret.set(model.id, model)\n\n switch (model.kind) {\n case \"optional\":\n case \"array\":\n case \"set\":\n case \"map\": {\n for (const [id, nestModel] of collectModelDeep(model.base)) {\n ret.set(id, nestModel)\n }\n\n return ret\n }\n\n case \"record\": {\n for (const property of Object.values(model.properties))\n for (const [id, nestedModel] of collectModelDeep(property)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"union\": {\n for (const variant of Object.values(model.variants))\n for (const [id, nestedModel] of collectModelDeep(variant)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"error\": {\n if (model.context)\n for (const detail of Object.values(model.context)) {\n for (const [id, nestedModel] of collectModelDeep(detail)) ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n default:\n return ret\n }\n}\n\nfunction collectModelsFromRoute(route: HttpRouteModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [route.variables, route.queries, route.headers, route.cookies]\n .filter((o) => !!o)\n .flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (route.content)\n for (const [id, subModel] of collectModelsFromContent(route.content)) {\n models.set(id, subModel)\n }\n\n if (route.responses)\n for (const response of Object.values(route.responses)) {\n for (const [id, subModel] of collectModelsFromResponse(response)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromContent(content: HttpContentModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n if (content.kind !== \"binary-stream-content\") {\n if (content.model)\n for (const [id, subModel] of collectModelDeep(content.model)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromResponse(response: HttpResponseModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [response.cookies, response.headers].filter((o) => !!o).flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (response.content)\n for (const [id, subModel] of collectModelsFromContent(response.content)) {\n models.set(id, subModel)\n }\n\n return models\n}\n\nfunction generateComponentSchemasFromModels(models: Map<string, TypeModels>): Map<string, JsonSchema> {\n const ret = new Map<string, JsonSchema>()\n\n for (const [id, model] of models) {\n const schema = generateJsonSchema({ model, reference: \"openapi\" })\n ret.set(id, schema)\n }\n\n return ret\n}\n\nfunction generatePathsObject(routes: HttpRouteModel[]): PathsObject {\n const pathItems = new Map<string, PathItemObject>()\n\n for (const route of routes) {\n const item = pathItems.get(route.path) ?? {}\n\n pathItems.set(route.path, { ...item, ...generatePathItemObject(route) })\n }\n\n return Object.fromEntries(pathItems)\n}\n\nfunction generatePathItemObject(route: HttpRouteModel): PathItemObject {\n return { [route.method as \"get\"]: generateOperationObject(route) }\n}\n\nfunction getSchemaReference(model: TypeModels) {\n return model.id != null\n ? { $ref: \"#/components/schemas/\" + model.id }\n : generateJsonSchema({ model, reference: \"openapi\" })\n}\n\nfunction generateOperationObject(route: HttpRouteModel): OperationObject {\n const { id, summary, description, variables, queries, headers, cookies, content, responses } = route\n\n const parameterObjects: ParameterObjectAsSchema[] = []\n\n for (const [name, model] of Object.entries(variables)) {\n parameterObjects.push({ in: \"path\", name, required: true, schema: getSchemaReference(model) })\n }\n\n if (queries)\n for (const [name, model] of Object.entries(queries)) {\n parameterObjects.push({\n in: \"query\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (headers)\n for (const [name, model] of Object.entries(headers)) {\n parameterObjects.push({\n in: \"header\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (cookies)\n for (const [name, model] of Object.entries(cookies)) {\n parameterObjects.push({\n in: \"cookie\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n const responseObjects = new Map<string, ResponseObject>()\n\n if (responses)\n for (const [name, response] of Object.entries(responses)) {\n responseObjects.set(response.status.toString(), generateResponseObjectFromResponse(name, response))\n }\n\n return {\n operationId: id,\n summary: summary ?? route.id,\n description,\n parameters: parameterObjects,\n responses: Object.fromEntries(responseObjects),\n requestBody: content == null ? undefined : generateRequestBodyObject(content),\n }\n}\n\nfunction generateRequestBodyObject(content: HttpContentModel): RequestBodyObject {\n switch (content.kind) {\n case \"plain-text-content\":\n case \"json-content\":\n case \"form-content\":\n return {\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n\n default:\n return {\n description: content.description,\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n }\n}\n\nfunction generateMeidaTypeObject(content: HttpContentModel): MediaTypeObject {\n switch (content.kind) {\n case \"plain-text-content\":\n return {\n schema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"plain-text-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"json-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n\n case \"json-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: getSchemaReference(content.model),\n }\n\n case \"binary-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: { type: \"string\", format: \"binary\" },\n }\n\n case \"form-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n }\n}\n\nfunction generateResponseObjectFromResponse(name: string, response: HttpResponseModel): ResponseObject {\n const headerObjects = new Map<string, HeaderObject>()\n\n if (response.headers)\n for (const [name, model] of Object.entries(response.headers)) {\n headerObjects.set(name, { schema: getSchemaReference(model), required: model.kind !== \"optional\" })\n }\n\n return {\n description: response.description ?? name,\n headers: headerObjects.size > 0 ? Object.fromEntries(headerObjects) : undefined,\n content:\n response.content == null ? undefined : { [response.content.type]: generateMeidaTypeObject(response.content) },\n }\n}\n\nexport interface HttpResponseModel {\n status: number\n description?: string\n content?: HttpContentModel\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n}\n\nexport interface HttpRouteModel<Path extends string = string> {\n kind: \"http-route\"\n id: string\n path: Path\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\" | \"TRACE\"\n description?: string\n summary?: string\n variables: { [key in ExtractPathParams<Path>]: AllowedHttpValue }\n queries?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n content?: HttpContentModel\n responses?: { [key: string]: HttpResponseModel }\n tags?: string[]\n security?: { [key: string]: string[] }\n}\n\nexport interface HttpRouteModelOptions<Path extends string> extends Omit<HttpRouteModel<Path>, \"kind\"> {}\n\nexport function route<const Path extends string>(options: HttpRouteModelOptions<Path>): HttpRouteModel<Path> {\n return { kind: \"http-route\", ...options }\n}\n\nexport interface PlainTextContentModel {\n kind: \"plain-text-content\"\n type: PlainTextLikeContentType\n model?: StringModel\n}\n\nexport interface PlainTextContentOptions extends Omit<PlainTextContentModel, \"kind\"> {}\n\nexport function plainText(options: PlainTextContentOptions): PlainTextContentModel {\n return { kind: \"plain-text-content\", ...options }\n}\n\nexport interface JsonContentModel {\n kind: \"json-content\"\n type: JsonLikeContentType\n model: TypeModels\n}\n\nexport interface JsonContentOptions extends Omit<JsonContentModel, \"kind\"> {}\n\nexport function json(options: JsonContentOptions): JsonContentModel {\n return { kind: \"json-content\", ...options }\n}\n\nexport interface PlainTextStreamContentModel {\n kind: \"plain-text-stream-content\"\n type: PlainTextLikeContentType\n model?: StringModel\n description?: string\n}\n\nexport interface PlainTextStreamContentOptions extends Omit<PlainTextStreamContentModel, \"kind\"> {}\n\nexport function plainTextStream(options: PlainTextStreamContentOptions): PlainTextStreamContentModel {\n return { kind: \"plain-text-stream-content\", ...options }\n}\n\nexport interface JsonStreamContentModel {\n kind: \"json-stream-content\"\n type: JsonStreamLikeContentType\n model: TypeModels\n description?: string\n}\n\nexport interface JsonStreamContentOptions extends Omit<JsonStreamContentModel, \"kind\"> {}\n\nexport function jsonStream(options: JsonStreamContentOptions): JsonStreamContentModel {\n return { kind: \"json-stream-content\", ...options }\n}\n\nexport interface BinaryStreamContentModel {\n kind: \"binary-stream-content\"\n type: BinaryLikeContentType\n description?: string\n}\n\nexport interface BinaryStreamContentOptions extends Omit<BinaryStreamContentModel, \"kind\"> {}\n\nexport function binary(options: BinaryStreamContentOptions): BinaryStreamContentModel {\n return { kind: \"binary-stream-content\", ...options }\n}\n\nexport interface FormContentModel<T extends { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }> {\n kind: \"form-content\"\n type: FormLikeContentType\n model: RecordModel<T>\n}\n\nexport interface FormContentOptions<T extends { [key: string]: AllowedHttpValue }> extends Omit<\n FormContentModel<T>,\n \"kind\"\n> {}\n\nexport function form<T extends { [key: string]: AllowedHttpValue }>(\n options: FormContentOptions<T>,\n): FormContentModel<T> {\n return { kind: \"form-content\", ...options }\n}\n\nexport type HttpContentModel =\n | PlainTextContentModel\n | JsonContentModel\n | PlainTextStreamContentModel\n | JsonStreamContentModel\n | BinaryStreamContentModel\n | FormContentModel<{ [key: string]: AllowedHttpValue }>\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 { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierJavaPlugin from \"prettier-plugin-java\"\n\nimport { literal, type LiteralModel, type NamedModel, type TypeModels } from \"@/type-system/basic\"\nimport { collectModelDeep, collectModelFromRoutes, type HttpRouteModel } from \"@/type-system/http\"\n\nexport interface GenerateJavaClassOptions {\n package: string\n model: NamedModel\n}\n\nexport function generateJavaClass(options: GenerateJavaClassOptions): string {\n const { model, package: packageName } = options\n\n switch (model.kind) {\n case \"record\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(\n ${Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.properties)\n .filter(([__dirname, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n `\n\n case \"union\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n \n @NullMarked\n public sealed interface ${model.id}{\n ${Object.entries(model.variants)\n .map(([k, v]) => generateUnionVariantCode(packageName, model.id, k, v))\n .join(\"\\n\")}\n }\n `\n\n case \"error\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(Context context){\n ${generateStaticPropertyCode(packageName, \"code\", literal({ value: model.code }))}\n\n public ${model.id}(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n this(new Context(${getPropertyNames(model.context)}));\n }\n\n public record Context(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n }\n `\n\n case \"enums\":\n return `\n \n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n public enum ${model.id} {\n\n ${Object.entries(model.variants).map(([k, v]) => `${k}(\"${v}\")`)};\n \n private final String value;\n\n public ${model.id}(String value){\n this.value = value;\n }\n\n @com.fasterxml.jackson.annotation.JsonValue\n public String getValue() { \n return value;\n }\n }\n `\n }\n}\n\nfunction getPropertyNames(properties?: { [key: string]: TypeModels }): string {\n if (properties == null) return \"\"\n return Object.keys(properties).join(\",\")\n}\n\nfunction generateUnionVariantCode(\n packageName: string,\n unionId: string,\n variantName: string,\n variant: TypeModels,\n): string {\n switch (variant.kind) {\n case \"literal\":\n return `\n record ${variantName}() implements ${unionId} {\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateStaticPropertyCode(packageName, \"value\", variant)}\n }\n `\n\n default:\n return `\n record ${variantName}(\n @com.fasterxml.jackson.annotation.JsonCreator\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateModelSignature(packageName, variant)} value\n ) implements ${unionId} {}\n `\n }\n}\n\nfunction generatePropertyCode(packageName: string, name: string, property: TypeModels): string {\n return `${generateModelSignature(packageName, property)} ${name}`\n}\n\nfunction generateStaticPropertyCode(\n packageName: string,\n name: string,\n property: LiteralModel<string | number | boolean>,\n): string {\n return `public ${generateModelSignature(packageName, property)} ${name} = ${generateStaticValue(property.value)}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : value + \"d\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(packageName: string, model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"int\"\n case \"int64\":\n return \"long\"\n case \"float32\":\n return \"float\"\n case \"float64\":\n return \"double\"\n case \"boolean\":\n return \"boolean\"\n case \"date\":\n return \"java.time.LocalDate\"\n case \"datetime\":\n return \"java.time.LocalDateTime\"\n case \"duration\":\n return \"java.time.Duration\"\n case \"array\":\n return `Array<${generateModelSignature(packageName, model.base)}>`\n case \"set\":\n return `Set<${generateModelSignature(packageName, model.base)}>`\n case \"map\":\n return `Map<String, ${generateModelSignature(packageName, model.base)}>`\n case \"optional\":\n switch (model.base.kind) {\n case \"int32\":\n return \"@Nullable Integer\"\n case \"int64\":\n return \"@Nullable Long\"\n case \"float32\":\n return \"@Nullable Float\"\n case \"float64\":\n return \"@Nullable Double\"\n case \"boolean\":\n return \"@Nullable Boolean\"\n case \"optional\":\n return generateModelSignature(packageName, model.base)\n default:\n return `@Nullable ${generateModelSignature(packageName, model.base)}`\n }\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"String\"\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return Number.isInteger(model.value) ? \"int\" : \"double\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return packageName + \".\" + model.id\n }\n}\n\nexport async function formatJava(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"java\",\n plugins: [PrettierJavaPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateJavaOptions {\n package: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateJavaCodes(options: GenerateJavaOptions): Promise<{ path: string; code: string }[]> {\n const { package: packageName, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = packageName + \".\" + id\n\n const path = resolve(srcDir, ...fullname.split(\".\"), \".java\")\n\n const code = await formatJava(generateJavaClass({ package: packageName, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierRustPlugin from \"prettier-plugin-rust\"\n\nimport {\n type EnumsModel,\n type ErrorModel,\n type LiteralModel,\n type RecordModel,\n type TypeModels,\n type UnionModel,\n} from \"@/type-system/basic\"\nimport type { HttpRouteModel } from \"@/type-system/http\"\nimport { collectModelDeep, collectModelFromRoutes } from \"@/type-system/http\"\n\nexport interface GenerateRustCodeOptions {\n module_name: string\n model:\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n}\n\nexport function generateRustCode(options: GenerateRustCodeOptions): string {\n const { model } = options\n\n switch (model.kind) {\n case \"record\":\n return generateRecordCode(model)\n case \"union\":\n return generateUnionCode(model)\n case \"error\":\n return generateErrorCode(model)\n case \"enums\":\n return generateEnumCode(model)\n }\n}\n\nfunction generateRecordCode(model: RecordModel<{ [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const structFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n const hasConstants = constFields.length > 0\n const hasFields = structFields.length > 0\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (hasConstants && hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else if (hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f},\\n`\n })\n code += `}\\n`\n } else if (hasConstants) {\n code += `#[derive(Serialize)]\\npub struct ${structName};\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateUnionCode(model: UnionModel<{ [key: string]: TypeModels }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize)]\\n#[serde(tag = \"type\", content = \"value\")]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toPascalCase(k)\n if (v.kind === \"literal\") {\n code += ` ${variantName},\\n`\n } else {\n const variantType = generateModelSignature(v)\n code += ` ${variantName}(${variantType}),\\n`\n }\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateErrorCode(model: ErrorModel<string, { [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const contextFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (contextFields.length > 0 || constFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n if (contextFields.length > 0) {\n code += ` pub context: ${structName}Context,\\n`\n }\n code += `}\\n\\n`\n\n if (contextFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName}Context {\\n`\n contextFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n }\n\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateEnumCode(model: EnumsModel<{ [key: string]: string }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toUpperSnakeCase(k)\n code += ` #[serde(rename = \"${v}\")]\\n`\n code += ` ${variantName},\\n`\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateStructField(name: string, property: TypeModels): string {\n const fieldName = toSnakeCase(name)\n const fieldType = generateModelSignature(property)\n return `pub ${fieldName}: ${fieldType}`\n}\n\nfunction generateConstField(name: string, property: LiteralModel<string | number | boolean>): string {\n const constName = toUpperSnakeCase(name)\n const constType = generateModelSignature(property)\n const constValue = generateStaticValue(property.value)\n return `const ${constName}: ${constType} = ${constValue}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : `${value}.0`\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"i32\"\n case \"int64\":\n return \"i64\"\n case \"float32\":\n return \"f32\"\n case \"float64\":\n return \"f64\"\n case \"boolean\":\n return \"bool\"\n case \"date\":\n return \"chrono::NaiveDate\"\n case \"datetime\":\n return \"chrono::DateTime<chrono::Utc>\"\n case \"duration\":\n return \"serde_json::Value\"\n case \"array\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"set\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"map\":\n return `std::collections::HashMap<String, ${generateModelSignature(model.base)}>`\n case \"optional\":\n return `Option<${generateModelSignature(model.base)}>`\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"&str\"\n case \"boolean\":\n return \"bool\"\n case \"number\":\n return Number.isInteger(model.value) ? \"i64\" : \"f64\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return model.id ? toPascalCase(model.id) : \"()\"\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^(.)/, (_, c) => (c ? c.toUpperCase() : \"\"))\n}\n\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .replace(/[-\\s]+/g, \"_\")\n .replace(/^_/, \"\")\n .toLowerCase()\n}\n\nfunction toUpperSnakeCase(str: string): string {\n return toSnakeCase(str).toUpperCase()\n}\n\nexport async function formatRust(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"jinx-rust\",\n plugins: [PrettierRustPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateRustOptions {\n module_name: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateRustCodes(options: GenerateRustOptions): Promise<{ path: string; code: string }[]> {\n const { module_name, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = module_name + \"::\" + toSnakeCase(id)\n\n const path = resolve(srcDir, ...fullname.split(\"::\"), \".rs\")\n\n const code = await formatRust(generateRustCode({ module_name: fullname, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import type { Simplify } from \"type-fest\"\n\nimport {\n type ArrayModel,\n type BooleanModel,\n type DateModel,\n type DatetimeModel,\n type DurationModel,\n type EnumsModel,\n type ErrorModel,\n type Float32Model,\n type Float64Model,\n type Int32Model,\n type Int64Model,\n type KeyOfOptional,\n type LiteralModel,\n type MapModel,\n type OptionalModel,\n type RecordModel,\n type SetModel,\n type StringModel,\n type TaggedUnionModel,\n type TypeModels,\n type UnionModel,\n} from \"./basic\"\n\n/* prettier-ignore */\nexport type InferDeserialized<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model ? number\n : T extends Int64Model ? bigint\n : T extends Float32Model ? number\n : T extends Float64Model ? number\n : T extends BooleanModel ? boolean\n : T extends StringModel ? string\n : T extends LiteralModel<infer R> ? R\n : T extends OptionalModel<infer R> ? InferDeserialized<R> | undefined | null\n : T extends ArrayModel<infer R> ? InferDeserialized<R>[]\n : T extends SetModel<infer R> ? Set<InferDeserialized<R>>\n : T extends MapModel<infer R> ? Map<string, InferDeserialized<R>>\n : T extends RecordModel<infer R> ? InferDeserializedRecord<R>\n : T extends UnionModel<infer R> ? InferDeserializedUnion<R>\n : T extends TaggedUnionModel<infer _Tag, infer R> ? InferDeserializedTaggedUnion<R>\n : T extends DatetimeModel ? Temporal.Instant\n : T extends DateModel ? Temporal.Instant\n : T extends DurationModel ? Temporal.Duration\n : T extends ErrorModel<infer Code, infer Context> ? InferDeserializedError<Code, Context>\n : T extends EnumsModel<infer R> ? R[keyof R]\n : never\n\n// prettier-ignore\nexport type InferDeserializedRecord<T extends {[key: string]: TypeModels}, O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferDeserialized<T[key]> } \n & { [key in O]?: InferDeserialized<T[key]> }\n>\n\n// prettier-ignore\nexport type InferDeserializedUnion<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferDeserialized<T[key]> }\n}[keyof T]\n\n// prettier-ignore\nexport type InferDeserializedTaggedUnion<Variants extends {[key: string]: RecordModel<{[key: string]: TypeModels}>}> = {\n [key in keyof Variants]: InferDeserialized<Variants[key]>\n}[keyof Variants]\n\n// prettier-ignore\nexport type InferDeserializedError<Code extends string, Context extends { [key: string]: TypeModels }> = [Context] extends [never] \n ? { code: Code }\n : { code: Code; context: InferDeserializedRecord<Context> }\n\nexport function deserialize<T extends TypeModels>(model: T, json: string): DeserializeResult<InferDeserialized<T>> {\n return deserializeInner(model, JSON.parse(json))\n}\n\nexport function deserializeInner<T extends TypeModels>(model: T, value: any): DeserializeResult<InferDeserialized<T>> {\n type Ret = DeserializeResult<InferDeserialized<T>>\n\n const success = (value: any): Ret => ({ isSuccess: true, value })\n\n if (model.kind === \"string\") {\n if (typeof value === \"string\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"boolean\") {\n if (typeof value === \"boolean\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\") {\n if (typeof value === \"number\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int64\") {\n if (typeof value === \"string\") {\n try {\n return success(BigInt(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"date\" || model.kind === \"datetime\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Instant.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"duration\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Duration.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"optional\") {\n return value == null ? success(undefined) : deserializeInner(model.base, value)\n }\n\n if (model.kind === \"literal\") {\n if (model.value === value) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"array\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(value.map((o) => deserializeInner(model.base, o)))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"set\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(new Set(value.map((o) => deserializeInner(model.base, o))))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"map\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in value) {\n const result = deserializeInner(model.base, value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success(properties)\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"enums\") {\n if (typeof value === \"string\" && Object.values(model.variants).includes(value)) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"record\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in model.properties) {\n const result = deserializeInner(model.properties[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return deserializeFailed(model, value)\n }\n\n return success(Object.fromEntries(properties))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n const result = deserializeInner(model.variants[key], value[key])\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"tagged-union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const tag = value[model.tag]\n\n for (const [key, variant] of Object.entries(model.variants)) {\n const tagModel = variant.properties[model.tag] as TypeModels\n\n if (tagModel.kind === \"literal\" && tagModel.value === tag) {\n const result = deserializeInner(variant, value)\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"code\" in value &&\n \"context\" in value &&\n value.code === model.code &&\n typeof value.context === \"object\" &&\n !Array.isArray(value.context)\n ) {\n const properties = new Map<string, any>()\n\n for (const key in model.context) {\n const result = deserializeInner(model.context[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success({ code: model.code, context: Object.fromEntries(properties) })\n }\n\n return deserializeFailed(model, value)\n}\n\nexport interface DeserializeSuccess<T> {\n isSuccess: true\n value: T\n}\n\nexport interface DeserializeFailed {\n isSuccess: false\n code: \"deserial-failed\"\n context: {\n expect: TypeModels\n receive: any\n }\n}\n\nfunction deserializeFailed(expect: TypeModels, receive: any): DeserializeFailed {\n return {\n isSuccess: false,\n code: \"deserial-failed\",\n context: { expect, receive },\n }\n}\n\nexport type DeserializeResult<T> = DeserializeSuccess<T> | DeserializeFailed\n\nexport function serialize<T extends TypeModels>(model: T, value: InferDeserialized<T>): string {\n if (model.kind === \"string\" || model.kind === \"int64\") {\n const ret = value as string | bigint\n return `\"${ret.toString()}\"`\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\" || model.kind === \"boolean\") {\n const ret = value as string | number | boolean | bigint\n return ret.toString()\n }\n\n if (model.kind === \"array\") {\n const arr = value as unknown[]\n return arr.map((o) => serialize(model.base, o)).join(\",\")\n }\n\n if (model.kind === \"set\") {\n const set = value as Set<unknown>\n return set\n .values()\n .map((o) => serialize(model.base, o))\n .toArray()\n .join(\",\")\n }\n\n if (model.kind === \"map\") {\n const map = value as Map<string, unknown>\n return `{${map.entries().map(([k, v]) => `\"${k}\": ${serialize(model.base, v)}`)}}`\n }\n\n if (model.kind === \"literal\") return model.value.toString()\n\n if (model.kind === \"date\" || model.kind === \"datetime\" || model.kind === \"duration\") {\n const ret = value as Temporal.Instant | Temporal.Duration\n return ret.toJSON()\n }\n\n if (model.kind === \"optional\") {\n return value == null ? \"null\" : serialize(model.base, value)\n }\n\n if (model.kind === \"error\") {\n const properties: string[] = []\n\n for (const key in model.context) {\n properties.push(`\"${key}\": ${serialize(model.context[key], value[key])}`)\n }\n\n return `{\"code\":\"${model.code}\",context:{${properties}}}`\n }\n\n if (model.kind === \"record\") {\n const properties: string[] = []\n\n for (const key in model.properties) {\n properties.push(`\"${key}\": ${serialize(model.properties[key], value[key])}`)\n }\n\n return `{${properties}}`\n }\n\n if (model.kind === \"union\") {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n return `{\"${key}\":${serialize(model.variants[key], value[key])}}`\n }\n }\n\n if (model.kind === \"tagged-union\") {\n return JSON.stringify(value)\n }\n\n // Enums\n return String(value)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["generateModelSignature","generateStaticValue","ret","arr","set","map"],"sources":["../src/type-system/basic.ts","../src/type-system/http.ts","../src/generator/java.ts","../src/generator/rust.ts","../src/type-system/serialize.ts"],"sourcesContent":["import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchemaObject } from \"@/schemas/json-schema-draft-2020-12\"\nimport type { ArraySchema, MapSchema, NumberSchema, SetSchema, StringSchema } from \"@/schemas/schema-variants\"\n\nexport interface BasicModel<T> {\n id?: string\n title?: string\n description?: string\n examples?: T[]\n default?: T\n deprecated?: boolean\n}\n\nexport interface Int32Model extends BasicModel<number> {\n kind: \"int32\"\n schema?: NumberSchema\n}\n\nexport interface Int32ModelOptions extends Omit<Int32Model, \"kind\"> {}\n\nexport function int32(options?: Int32ModelOptions): Int32Model {\n return { kind: \"int32\", ...options }\n}\n\nexport interface Int64Model extends BasicModel<string> {\n kind: \"int64\"\n schema?: StringSchema\n}\n\nexport interface Int64ModelOptions extends Omit<Int64Model, \"kind\"> {}\n\nexport function int64(options?: Int64ModelOptions): Int64Model {\n return { kind: \"int64\", ...options }\n}\n\nexport interface Float32Model extends BasicModel<number> {\n kind: \"float32\"\n schema?: NumberSchema\n}\n\nexport interface Float32ModelOptions extends Omit<Float32Model, \"kind\"> {}\n\nexport function float32(options?: Float32ModelOptions): Float32Model {\n return { kind: \"float32\", ...options }\n}\n\nexport interface Float64Model extends BasicModel<number> {\n kind: \"float64\"\n schema?: NumberSchema\n}\n\nexport interface Float64ModelOptions extends Omit<Float64Model, \"kind\"> {}\n\nexport function float64(options?: Float64ModelOptions): Float64Model {\n return { kind: \"float64\", ...options }\n}\n\nexport interface BooleanModel extends BasicModel<boolean> {\n kind: \"boolean\"\n}\n\nexport interface BooleanModelOptions extends Omit<BooleanModel, \"kind\"> {}\n\nexport function boolean(options?: BooleanModelOptions): BooleanModel {\n return { kind: \"boolean\", ...options }\n}\n\nexport interface StringModel extends BasicModel<string> {\n kind: \"string\"\n schema?: StringSchema\n}\n\nexport interface StringModelOptions extends Omit<StringModel, \"kind\"> {}\n\nexport function string(options?: StringModelOptions): StringModel {\n return { kind: \"string\", ...options }\n}\n\nexport interface LiteralModel<T extends string | number | boolean> extends BasicModel<T> {\n kind: \"literal\"\n value: T\n}\n\nexport interface LiteralModelOptions<T extends string | number | boolean> extends Omit<LiteralModel<T>, \"kind\"> {}\n\nexport function literal<const T extends string | number | boolean>(options: LiteralModelOptions<T>): LiteralModel<T> {\n return { kind: \"literal\", ...options }\n}\n\n/**\n * 表示一个可选类型,代表\"值可能存在也可能不存在\"的语义。\n *\n * 设计理念:\n * - 统一\"空白\"语义:将 `null`、`undefined` 和缺失值等多种\"空\"的概念合并为单一语义,\n * 避免类型系统中存在多个含义模糊的\"空\"状态。\n * - 序列化到 JSON 时,`Optional` 可以表示为 `null` 或完全省略(取决于上下文)。\n * `InferModelJsonType<T> | null | undefined` 表示该值可以是基础类型、`null` 或 `undefined`。\n * - 如果需要区分\"显式设置为空\"和\"从未设置\"等细分语义,应当另行设计专用类型。\n *\n * @template T 基础模型类型\n */\nexport interface OptionalModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T> | null | undefined> {\n kind: \"optional\"\n base: T\n}\n\n/**\n * 将类型模型转换为可选类型。\n *\n * @template T 基础模型类型\n */\nexport type Optionalize<T extends TypeModels> = T extends TypeModels ? OptionalModel<T> : never\n\nexport interface OptionalModelOptions<T extends TypeModels> extends Omit<OptionalModel<T>, \"kind\" | \"base\"> {}\n\n/**\n * 创建一个可选类型模型。\n *\n * @param base 基础模型类型\n * @param options 可选配置选项\n * @returns 可选类型模型\n */\nexport function optional<T extends TypeModels>(base: T, options?: OptionalModelOptions<T>): OptionalModel<T> {\n return { kind: \"optional\", base, ...options }\n}\n\nexport interface ArrayModel<T> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"array\"\n base: T\n schema?: ArraySchema\n}\n\nexport interface ArrayModelOptions<T extends TypeModels> extends Omit<ArrayModel<T>, \"kind\" | \"base\"> {}\n\nexport function array<T extends TypeModels>(base: T, options?: ArrayModelOptions<T>): ArrayModel<T> {\n return { kind: \"array\", base, ...options }\n}\n\nexport interface SetModel<T extends TypeModels> extends BasicModel<InferModelJsonType<T>[]> {\n kind: \"set\"\n base: T\n schema?: SetSchema\n}\n\nexport interface SetModelOptions<T extends TypeModels> extends Omit<SetModel<T>, \"kind\" | \"base\"> {}\n\nexport function set<T extends TypeModels>(base: T, options?: SetModelOptions<T>): SetModel<T> {\n return { kind: \"set\", base, ...options }\n}\n\nexport interface MapModel<T> extends BasicModel<{ [key: string]: InferModelJsonType<T> }> {\n kind: \"map\"\n base: T\n schema?: MapSchema\n}\n\nexport interface MapModelOptions<T extends TypeModels> extends Omit<MapModel<T>, \"kind\" | \"base\"> {}\n\nexport function map<T extends TypeModels>(base: T, options?: MapModelOptions<T>): MapModel<T> {\n return { kind: \"map\", base, ...options }\n}\n\nexport interface RecordModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferRecordJsonType<T>> {\n kind: \"record\"\n id: string\n properties: T\n}\n\nexport type KeyOfOptional<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: T[key] extends OptionalModel<any> ? key : never\n}[keyof T]\n\n/* prettier-ignore */\nexport type InferRecordJsonType<T extends { [key: string]: TypeModels },O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferModelJsonType<T[key]> } \n & { [key in O]?: InferModelJsonType<T[key]> }\n>\n\nexport interface RecordModelOptions<T extends { [key: string]: TypeModels }> extends Omit<RecordModel<T>, \"kind\"> {}\n\nexport function record<const T extends { [key: string]: TypeModels }>(options: RecordModelOptions<T>): RecordModel<T> {\n return { kind: \"record\", ...options }\n}\n\nexport interface UnionModel<T extends { [key: string]: TypeModels }> extends BasicModel<InferUnionJsonType<T>> {\n kind: \"union\"\n id: string\n variants: T\n}\n\nexport type InferUnionJsonType<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferModelJsonType<T[key]> }\n}[keyof T]\n\nexport interface UnionModelOptions<T extends { [key: string]: TypeModels }> extends Omit<UnionModel<T>, \"kind\"> {}\n\nexport function union<const T extends { [key: string]: TypeModels }>(options: UnionModelOptions<T>): UnionModel<T> {\n return { kind: \"union\", ...options }\n}\n\nexport interface DatetimeModel extends BasicModel<string> {\n kind: \"datetime\"\n schema?: StringSchema\n}\n\nexport interface DatetimeModelOptions extends Omit<DatetimeModel, \"kind\"> {}\n\nexport function datetime(options?: DatetimeModelOptions): DatetimeModel {\n return { kind: \"datetime\", ...options }\n}\n\nexport interface DateModel extends BasicModel<string> {\n kind: \"date\"\n schema?: StringSchema\n}\n\nexport interface DateModelOptions extends Omit<DateModel, \"kind\"> {}\n\nexport function date(options?: DateModelOptions): DateModel {\n return { kind: \"date\", ...options }\n}\n\nexport interface DurationModel extends BasicModel<string> {\n kind: \"duration\"\n schema?: StringSchema\n}\n\nexport interface DurationModelOptions extends Omit<DurationModel, \"kind\"> {}\n\nexport function duration(options?: DurationModelOptions): DurationModel {\n return { kind: \"duration\", ...options }\n}\n\nexport interface ErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> extends BasicModel<\n InferErrorModel<Code, Context>\n> {\n kind: \"error\"\n id: string\n code: Code\n context: Context\n}\n\n/* prettier-ignore */\nexport type InferErrorModel<Code extends string, Context extends { [key: string]: TypeModels }> = { \n code: Code\n context: InferRecordJsonType<Context> \n}\n\nexport interface ErrorModelOptions<Code extends string, Context extends { [key: string]: TypeModels }> extends Omit<\n ErrorModel<Code, Context>,\n \"kind\"\n> {}\n\nexport function error<const Code extends string, Context extends { [key: string]: TypeModels }>(\n options: ErrorModelOptions<Code, Context>,\n): ErrorModel<Code, Context> {\n return { kind: \"error\", ...options }\n}\n\nexport interface EnumsModel<T extends { [key: string]: string }> extends BasicModel<T[keyof T]> {\n id: string\n kind: \"enums\"\n variants: T\n}\n\nexport interface EnumsModelOptions<T extends { [key: string]: string }> extends Omit<EnumsModel<T>, \"kind\"> {}\n\nexport function enums<const T extends { [key: string]: string }>(options: EnumsModelOptions<T>): EnumsModel<T> {\n return { kind: \"enums\", ...options }\n}\n\nexport interface TaggedUnionModel<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends BasicModel<InferTaggedUnionJsonType<Tag, Variants>> {\n id: string\n kind: \"tagged-union\"\n tag: Tag\n variants: Variants\n}\n\nexport type InferTaggedUnionJsonType<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> = {\n [key in keyof Variants]: Variants[key] extends RecordModel<infer R> ? InferRecordJsonType<R> : never\n}[keyof Variants]\n\nexport interface TaggedUnionModelOptions<\n Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n> extends Omit<TaggedUnionModel<Tag, Variants>, \"kind\"> {}\n\nexport function taggedUnion<\n const Tag extends string,\n Variants extends { [key: string]: RecordModel<{ [key in Tag]: LiteralModel<string> }> },\n>(options: TaggedUnionModelOptions<Tag, Variants>): TaggedUnionModel<Tag, Variants> {\n return { kind: \"tagged-union\", ...options }\n}\n\nexport type TypeModels =\n | Int32Model\n | Int64Model\n | Float32Model\n | Float64Model\n | BooleanModel\n | StringModel\n | LiteralModel<string | number | boolean>\n | OptionalModel<TypeModels>\n | ArrayModel<TypeModels>\n | SetModel<TypeModels>\n | MapModel<TypeModels>\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | TaggedUnionModel<string, { [key: string]: any }>\n | DatetimeModel\n | DateModel\n | DurationModel\n | ErrorModel<string, { [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n\n/* prettier-ignore */\nexport type InferModelJsonType<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model? number\n : T extends Int64Model? string\n : T extends Float32Model? number\n : T extends Float64Model? number\n : T extends BooleanModel? boolean\n : T extends StringModel? string\n : T extends LiteralModel<infer R>? R\n : T extends OptionalModel<infer R> ? InferModelJsonType<R> | undefined | null\n : T extends ArrayModel<infer R>? InferModelJsonType<R>[]\n : T extends SetModel<infer R>? InferModelJsonType<R>[]\n : T extends MapModel<infer R>? Record<string, InferModelJsonType<R>>\n : T extends RecordModel<infer R>? InferRecordJsonType<R>\n : T extends UnionModel<infer R>? InferUnionJsonType<R>\n : T extends TaggedUnionModel<infer Tag, infer Variants> ? InferTaggedUnionJsonType<Tag, Variants>\n : T extends DatetimeModel? string\n : T extends DateModel? string\n : T extends DurationModel? string\n : T extends ErrorModel<infer Code, infer Context>? InferErrorModel<Code, Context>\n : T extends EnumsModel<infer R>? R[keyof R]\n : never\n\nexport interface ModelToJsonSchemaOptions {\n model: TypeModels\n target?: \"draft-2020-12\"\n reference?: \"inline\" | \"json-schema\" | \"openapi\"\n depth?: number\n}\n\nexport function generateJsonSchema(options: ModelToJsonSchemaOptions): JsonSchemaObject {\n const { model, target = \"draft-2020-12\", reference = \"json-schema\", depth = 0 } = options ?? {}\n\n const $schema = getSchemaRef(target)\n\n const convert = (partial?: JsonSchemaObject): JsonSchemaObject => ({\n $schema: depth === 0 ? $schema : undefined,\n title: model.title,\n description: model.description,\n examples: model.examples,\n deprecated: model.deprecated,\n default: model.default,\n ...partial,\n ...(\"schema\" in model ? model.schema : {}),\n })\n\n const getReferenceSchema = (schema: TypeModels): JsonSchemaObject => {\n switch (reference) {\n case \"inline\":\n return generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"json-schema\":\n return schema.id != null\n ? { $ref: \"#/$defs/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n\n case \"openapi\":\n return schema.id != null\n ? { $ref: \"#/components/schemas/\" + schema.id }\n : generateJsonSchema({ model: schema, target, reference, depth: depth + 1 })\n }\n }\n\n switch (model.kind) {\n case \"int32\":\n return convert({\n type: \"integer\",\n format: \"int32\",\n })\n\n case \"float32\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"float64\":\n return convert({\n type: \"number\",\n format: \"float\",\n })\n\n case \"int64\":\n return convert({\n type: \"string\",\n format: \"int64\",\n })\n\n case \"boolean\":\n return convert({\n type: \"boolean\",\n })\n\n case \"string\":\n return convert({\n type: \"string\",\n })\n\n case \"literal\":\n return convert({\n const: model.value,\n })\n\n case \"optional\": {\n const baseSchema = getReferenceSchema(model.base)\n\n if (\"$ref\" in baseSchema)\n return convert({\n oneOf: [baseSchema, { type: \"null\" }],\n })\n\n const { type = [], ...others } = baseSchema\n\n return convert({\n type: Array.isArray(type) ? ([...new Set([...type, \"null\"])] as JsonSchemaObject[\"type\"]) : [type, \"null\"],\n ...others,\n })\n }\n\n case \"array\":\n return convert({\n type: \"array\",\n items: getReferenceSchema(model.base),\n })\n\n case \"set\":\n return {\n $schema,\n type: \"array\",\n items: getReferenceSchema(model.base),\n uniqueItems: true,\n }\n\n case \"map\":\n return convert({\n type: \"object\",\n additionalProperties: getReferenceSchema(model.base),\n })\n\n case \"record\":\n return convert({\n type: \"object\",\n properties: Object.fromEntries(Object.entries(model.properties).map(([k, v]) => [k, getReferenceSchema(v)])),\n required: Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"optional\")\n .map(([k]) => k),\n additionalProperties: false,\n })\n\n case \"union\":\n return convert({\n oneOf: Object.entries(model.variants).map(([k, v]) => ({\n type: \"object\",\n title: v.title ?? k,\n properties: { [k]: getReferenceSchema(v as TypeModels) },\n required: [k],\n additionalProperties: false,\n })),\n })\n\n case \"tagged-union\":\n return convert({\n oneOf: Object.values(model.variants).map((o) => getReferenceSchema(o)),\n })\n\n case \"datetime\":\n return convert({\n type: \"string\",\n format: \"date-time\",\n })\n\n case \"date\":\n return convert({\n type: \"string\",\n format: \"date\",\n })\n\n case \"duration\":\n return convert({\n type: \"string\",\n format: \"duration\",\n })\n\n case \"error\":\n return convert({\n type: \"object\",\n properties: {\n code: { const: model.code },\n context:\n model.context == null\n ? undefined\n : {\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(model.context).map(([k, v]) => [k, getReferenceSchema(v as TypeModels)]),\n ),\n additionalProperties: false,\n },\n },\n additionalProperties: false,\n })\n\n case \"enums\":\n return convert({\n type: \"string\",\n enum: Object.values(model.variants),\n })\n }\n}\n\nfunction getSchemaRef(target: ModelToJsonSchemaOptions[\"target\"]) {\n switch (target) {\n case \"draft-2020-12\":\n return \"https://json-schema.org/draft/2020-12/schema\"\n }\n}\n\nexport type NamedModel =\n | RecordModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | UnionModel<{ [key: string]: TypeModels }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n","import type { Simplify } from \"type-fest\"\n\nimport type { JsonSchema } from \"@/schemas/json-schema-draft-2020-12\"\nimport type {\n HeaderObject,\n MediaTypeObject,\n OpenAPIObject,\n OperationObject,\n ParameterObjectAsSchema,\n PathItemObject,\n PathsObject,\n RequestBodyObject,\n ResponseObject,\n} from \"@/schemas/openapi-schema\"\nimport { type ExtractPathParams } from \"@/utils\"\n\nimport {\n generateJsonSchema,\n type BooleanModel,\n type Int32Model,\n type Int64Model,\n type LiteralModel,\n type Optionalize,\n type OptionalModel,\n type RecordModel,\n type StringModel,\n type TypeModels,\n} from \"./basic\"\n\nexport type AllowedHttpValue =\n | StringModel\n | Int32Model\n | Int64Model\n | BooleanModel\n | LiteralModel<string | number | boolean>\n | Optionalize<StringModel | Int32Model | Int64Model | BooleanModel | LiteralModel<string | number | boolean>>\n\nexport type PartialOf<T extends { [key: string]: any }, K extends keyof T> = Simplify<\n { [key in Exclude<keyof T, K>]: T[key] } & { [key in K]?: T[key] }\n>\n\nexport interface GenerateOpenapiOptions {\n info: OpenAPIObject[\"info\"]\n routes: HttpRouteModel[]\n securitySchemes?: NonNullable<OpenAPIObject[\"components\"]>[\"securitySchemes\"]\n tags?: OpenAPIObject[\"tags\"]\n servers?: OpenAPIObject[\"servers\"]\n}\n\nexport function generateOpenapi(options: GenerateOpenapiOptions): OpenAPIObject {\n const { info, routes, securitySchemes, tags, servers } = options\n\n const models = collectModelFromRoutes(routes)\n\n return {\n openapi: \"3.2.0\",\n info,\n paths: generatePathsObject(routes),\n components: {\n schemas: Object.fromEntries(generateComponentSchemasFromModels(models)),\n securitySchemes,\n },\n tags,\n servers,\n }\n}\n\nexport function collectModelFromRoutes(routes: HttpRouteModel[]): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const route of routes)\n for (const [id, model] of collectModelsFromRoute(route)) {\n models.set(id, model)\n }\n\n return models\n}\n\nexport function collectModelDeep(model: TypeModels): Map<string, TypeModels> {\n const ret = new Map<string, TypeModels>()\n\n if (model.id != null) ret.set(model.id, model)\n\n switch (model.kind) {\n case \"optional\":\n case \"array\":\n case \"set\":\n case \"map\": {\n for (const [id, nestModel] of collectModelDeep(model.base)) {\n ret.set(id, nestModel)\n }\n\n return ret\n }\n\n case \"record\": {\n for (const property of Object.values(model.properties))\n for (const [id, nestedModel] of collectModelDeep(property)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"union\": {\n for (const variant of Object.values(model.variants))\n for (const [id, nestedModel] of collectModelDeep(variant)) {\n ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n case \"error\": {\n if (model.context)\n for (const detail of Object.values(model.context)) {\n for (const [id, nestedModel] of collectModelDeep(detail)) ret.set(id, nestedModel)\n }\n\n return ret\n }\n\n default:\n return ret\n }\n}\n\nfunction collectModelsFromRoute(route: HttpRouteModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [route.variables, route.queries, route.headers, route.cookies]\n .filter((o) => !!o)\n .flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (route.content)\n for (const [id, subModel] of collectModelsFromContent(route.content)) {\n models.set(id, subModel)\n }\n\n if (route.responses)\n for (const response of Object.values(route.responses)) {\n for (const [id, subModel] of collectModelsFromResponse(response)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromContent(content: HttpContentModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n if (content.kind !== \"binary-stream-content\") {\n if (content.model)\n for (const [id, subModel] of collectModelDeep(content.model)) {\n models.set(id, subModel)\n }\n }\n\n return models\n}\n\nfunction collectModelsFromResponse(response: HttpResponseModel): Map<string, TypeModels> {\n const models = new Map<string, TypeModels>()\n\n for (const model of [response.cookies, response.headers].filter((o) => !!o).flatMap(Object.values)) {\n for (const [id, subModel] of collectModelDeep(model)) {\n models.set(id, subModel)\n }\n }\n\n if (response.content)\n for (const [id, subModel] of collectModelsFromContent(response.content)) {\n models.set(id, subModel)\n }\n\n return models\n}\n\nfunction generateComponentSchemasFromModels(models: Map<string, TypeModels>): Map<string, JsonSchema> {\n const ret = new Map<string, JsonSchema>()\n\n for (const [id, model] of models) {\n const schema = generateJsonSchema({ model, reference: \"openapi\" })\n ret.set(id, schema)\n }\n\n return ret\n}\n\nfunction generatePathsObject(routes: HttpRouteModel[]): PathsObject {\n const pathItems = new Map<string, PathItemObject>()\n\n for (const route of routes) {\n const item = pathItems.get(route.path) ?? {}\n\n pathItems.set(route.path, { ...item, ...generatePathItemObject(route) })\n }\n\n return Object.fromEntries(pathItems)\n}\n\nfunction generatePathItemObject(route: HttpRouteModel): PathItemObject {\n return { [route.method as \"get\"]: generateOperationObject(route) }\n}\n\nfunction getSchemaReference(model: TypeModels) {\n return model.id != null\n ? { $ref: \"#/components/schemas/\" + model.id }\n : generateJsonSchema({ model, reference: \"openapi\" })\n}\n\nfunction generateOperationObject(route: HttpRouteModel): OperationObject {\n const { id, summary, description, variables, queries, headers, cookies, content, responses } = route\n\n const parameterObjects: ParameterObjectAsSchema[] = []\n\n for (const [name, model] of Object.entries(variables)) {\n parameterObjects.push({ in: \"path\", name, required: true, schema: getSchemaReference(model) })\n }\n\n if (queries)\n for (const [name, model] of Object.entries(queries)) {\n parameterObjects.push({\n in: \"query\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (headers)\n for (const [name, model] of Object.entries(headers)) {\n parameterObjects.push({\n in: \"header\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n if (cookies)\n for (const [name, model] of Object.entries(cookies)) {\n parameterObjects.push({\n in: \"cookie\",\n name,\n required: model.kind !== \"optional\",\n schema: getSchemaReference(model),\n })\n }\n\n const responseObjects = new Map<string, ResponseObject>()\n\n if (responses)\n for (const [name, response] of Object.entries(responses)) {\n responseObjects.set(response.status.toString(), generateResponseObjectFromResponse(name, response))\n }\n\n return {\n operationId: id,\n summary: summary ?? route.id,\n description,\n parameters: parameterObjects,\n responses: Object.fromEntries(responseObjects),\n requestBody: content == null ? undefined : generateRequestBodyObject(content),\n }\n}\n\nfunction generateRequestBodyObject(content: HttpContentModel): RequestBodyObject {\n switch (content.kind) {\n case \"plain-text-content\":\n case \"json-content\":\n case \"form-content\":\n case \"server-sent-event-content\":\n return {\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n\n default:\n return {\n description: content.description,\n content: { [content.type]: generateMeidaTypeObject(content) },\n }\n }\n}\n\nfunction generateMeidaTypeObject(content: HttpContentModel): MediaTypeObject {\n switch (content.kind) {\n case \"plain-text-content\":\n return {\n schema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"json-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n\n case \"json-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: getSchemaReference(content.model),\n }\n\n case \"binary-stream-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: { type: \"string\", format: \"binary\" },\n }\n\n case \"server-sent-event-content\":\n return {\n schema: { type: \"string\", format: \"binary\" },\n itemSchema: content.model ? getSchemaReference(content.model) : { type: \"string\" },\n }\n\n case \"form-content\":\n return {\n schema: getSchemaReference(content.model),\n }\n }\n}\n\nfunction generateResponseObjectFromResponse(name: string, response: HttpResponseModel): ResponseObject {\n const headerObjects = new Map<string, HeaderObject>()\n\n if (response.headers)\n for (const [name, model] of Object.entries(response.headers)) {\n headerObjects.set(name, { schema: getSchemaReference(model), required: model.kind !== \"optional\" })\n }\n\n return {\n description: response.description ?? name,\n headers: headerObjects.size > 0 ? Object.fromEntries(headerObjects) : undefined,\n content:\n response.content == null ? undefined : { [response.content.type]: generateMeidaTypeObject(response.content) },\n }\n}\n\nexport interface HttpResponseModel {\n status: number\n description?: string\n content?: HttpContentModel\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n}\n\nexport interface HttpRouteModel<Path extends string = string> {\n kind: \"http-route\"\n id: string\n path: Path\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\" | \"TRACE\"\n description?: string\n summary?: string\n variables: { [key in ExtractPathParams<Path>]: AllowedHttpValue }\n queries?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n cookies?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n headers?: { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }\n content?: HttpContentModel\n responses?: { [key: string]: HttpResponseModel }\n tags?: string[]\n security?: { [key: string]: string[] }\n}\n\nexport interface HttpRouteModelOptions<Path extends string> extends Omit<HttpRouteModel<Path>, \"kind\"> {}\n\nexport function route<const Path extends string>(options: HttpRouteModelOptions<Path>): HttpRouteModel<Path> {\n return { kind: \"http-route\", ...options }\n}\n\nexport interface PlainTextContentModel {\n kind: \"plain-text-content\"\n type: PlainTextLikeContentType\n model?: StringModel\n}\n\nexport interface PlainTextContentOptions extends Omit<PlainTextContentModel, \"kind\"> {}\n\nexport function plainText(options: PlainTextContentOptions): PlainTextContentModel {\n return { kind: \"plain-text-content\", ...options }\n}\n\nexport interface JsonContentModel {\n kind: \"json-content\"\n type: JsonLikeContentType\n model: TypeModels\n}\n\nexport interface JsonContentOptions extends Omit<JsonContentModel, \"kind\"> {}\n\nexport function json(options: JsonContentOptions): JsonContentModel {\n return { kind: \"json-content\", ...options }\n}\n\nexport interface JsonStreamContentModel {\n kind: \"json-stream-content\"\n type: JsonStreamLikeContentType\n model: TypeModels\n description?: string\n}\n\nexport interface JsonStreamContentOptions extends Omit<JsonStreamContentModel, \"kind\"> {}\n\nexport function jsonStream(options: JsonStreamContentOptions): JsonStreamContentModel {\n return { kind: \"json-stream-content\", ...options }\n}\n\nexport interface BinaryStreamContentModel {\n kind: \"binary-stream-content\"\n type: BinaryLikeContentType\n description?: string\n}\n\nexport interface BinaryStreamContentOptions extends Omit<BinaryStreamContentModel, \"kind\"> {}\n\nexport function binary(options: BinaryStreamContentOptions): BinaryStreamContentModel {\n return { kind: \"binary-stream-content\", ...options }\n}\n\nexport interface FormContentModel<T extends { [key: string]: AllowedHttpValue | OptionalModel<AllowedHttpValue> }> {\n kind: \"form-content\"\n type: FormLikeContentType\n model: RecordModel<T>\n}\n\nexport interface FormContentOptions<T extends { [key: string]: AllowedHttpValue }> extends Omit<\n FormContentModel<T>,\n \"kind\"\n> {}\n\nexport function form<T extends { [key: string]: AllowedHttpValue }>(\n options: FormContentOptions<T>,\n): FormContentModel<T> {\n return { kind: \"form-content\", ...options }\n}\n\nexport type HttpContentModel =\n | PlainTextContentModel\n | JsonContentModel\n | JsonStreamContentModel\n | BinaryStreamContentModel\n | FormContentModel<{ [key: string]: AllowedHttpValue }>\n | ServerSentEventContentModel\n\nexport type PlainTextLikeContentType =\n | (string & {})\n | \"text/plain\"\n | \"text/html\"\n | \"text/css\"\n | \"text/xml\"\n | \"text/markdown\"\n | \"text/csv\"\n\nexport type JsonLikeContentType =\n | (string & {})\n | \"application/json\"\n | \"application/json; charset=utf-8\"\n | \"application/ld+json\"\n | \"application/hal+json\"\n | \"application/vnd.api+json\"\n | \"application/problem+json\"\n | \"application/schema+json\"\n\nexport type PlainTextStreamLikeContentType = (string & {}) | \"text/event-stream\"\n\nexport type JsonStreamLikeContentType =\n | (string & {})\n | \"application/ndjson\"\n | \"application/x-ndjson\"\n | \"application/jsonl\"\n | \"application/json-seq\"\n | \"application/stream+json\"\n\nexport type BinaryLikeContentType =\n | (string & {})\n | \"application/octet-stream\"\n | \"application/pdf\"\n | \"application/zip\"\n | \"application/gzip\"\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\"\n | \"image/svg+xml\"\n | \"audio/mpeg\"\n | \"audio/wav\"\n | \"video/mp4\"\n | \"video/webm\"\n\nexport type FormLikeContentType = (string & {}) | \"application/x-www-form-urlencoded\" | \"multipart/form-data\"\n\nexport interface ServerSentEventContentModel {\n kind: \"server-sent-event-content\"\n type: \"text/event-stream\"\n model?: TypeModels\n}\n\nexport type ServerSentEventContentOptions = Partial<ServerSentEventContentModel>\n\nexport function sse(options?: ServerSentEventContentOptions): ServerSentEventContentModel {\n const { kind = \"server-sent-event-content\", type = \"text/event-stream\", model } = options ?? {}\n return { kind, type, model }\n}\n","import { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierJavaPlugin from \"prettier-plugin-java\"\n\nimport { literal, type LiteralModel, type NamedModel, type TypeModels } from \"@/type-system/basic\"\nimport { collectModelDeep, collectModelFromRoutes, type HttpRouteModel } from \"@/type-system/http\"\n\nexport interface GenerateJavaClassOptions {\n package: string\n model: NamedModel\n}\n\nexport function generateJavaClass(options: GenerateJavaClassOptions): string {\n const { model, package: packageName } = options\n\n switch (model.kind) {\n case \"record\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(\n ${Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.properties)\n .filter(([__dirname, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n `\n\n case \"union\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n \n @NullMarked\n public sealed interface ${model.id}{\n ${Object.entries(model.variants)\n .map(([k, v]) => generateUnionVariantCode(packageName, model.id, k, v))\n .join(\"\\n\")}\n }\n `\n\n case \"error\":\n return `\n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n @NullMarked\n public record ${model.id}(Context context){\n ${generateStaticPropertyCode(packageName, \"code\", literal({ value: model.code }))}\n\n public ${model.id}(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n this(new Context(${getPropertyNames(model.context)}));\n }\n\n public record Context(\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generatePropertyCode(packageName, k, v))}\n ){\n ${Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) =>\n generateStaticPropertyCode(packageName, k, v as LiteralModel<string | number | boolean>),\n )\n .join(\";\")}\n }\n }\n `\n\n case \"enums\":\n return `\n \n package ${packageName};\n\n import org.jspecify.annotations.NullMarked;\n\n public enum ${model.id} {\n\n ${Object.entries(model.variants).map(([k, v]) => `${k}(\"${v}\")`)};\n \n private final String value;\n\n public ${model.id}(String value){\n this.value = value;\n }\n\n @com.fasterxml.jackson.annotation.JsonValue\n public String getValue() { \n return value;\n }\n }\n `\n }\n}\n\nfunction getPropertyNames(properties?: { [key: string]: TypeModels }): string {\n if (properties == null) return \"\"\n return Object.keys(properties).join(\",\")\n}\n\nfunction generateUnionVariantCode(\n packageName: string,\n unionId: string,\n variantName: string,\n variant: TypeModels,\n): string {\n switch (variant.kind) {\n case \"literal\":\n return `\n record ${variantName}() implements ${unionId} {\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateStaticPropertyCode(packageName, \"value\", variant)}\n }\n `\n\n default:\n return `\n record ${variantName}(\n @com.fasterxml.jackson.annotation.JsonCreator\n @com.fasterxml.jackson.annotation.JsonValue\n ${generateModelSignature(packageName, variant)} value\n ) implements ${unionId} {}\n `\n }\n}\n\nfunction generatePropertyCode(packageName: string, name: string, property: TypeModels): string {\n return `${generateModelSignature(packageName, property)} ${name}`\n}\n\nfunction generateStaticPropertyCode(\n packageName: string,\n name: string,\n property: LiteralModel<string | number | boolean>,\n): string {\n return `public ${generateModelSignature(packageName, property)} ${name} = ${generateStaticValue(property.value)}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : value + \"d\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(packageName: string, model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"int\"\n case \"int64\":\n return \"long\"\n case \"float32\":\n return \"float\"\n case \"float64\":\n return \"double\"\n case \"boolean\":\n return \"boolean\"\n case \"date\":\n return \"java.time.LocalDate\"\n case \"datetime\":\n return \"java.time.LocalDateTime\"\n case \"duration\":\n return \"java.time.Duration\"\n case \"array\":\n return `Array<${generateModelSignature(packageName, model.base)}>`\n case \"set\":\n return `Set<${generateModelSignature(packageName, model.base)}>`\n case \"map\":\n return `Map<String, ${generateModelSignature(packageName, model.base)}>`\n case \"optional\":\n switch (model.base.kind) {\n case \"int32\":\n return \"@Nullable Integer\"\n case \"int64\":\n return \"@Nullable Long\"\n case \"float32\":\n return \"@Nullable Float\"\n case \"float64\":\n return \"@Nullable Double\"\n case \"boolean\":\n return \"@Nullable Boolean\"\n case \"optional\":\n return generateModelSignature(packageName, model.base)\n default:\n return `@Nullable ${generateModelSignature(packageName, model.base)}`\n }\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"String\"\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return Number.isInteger(model.value) ? \"int\" : \"double\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return packageName + \".\" + model.id\n }\n}\n\nexport async function formatJava(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"java\",\n plugins: [PrettierJavaPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateJavaOptions {\n package: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateJavaCodes(options: GenerateJavaOptions): Promise<{ path: string; code: string }[]> {\n const { package: packageName, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = packageName + \".\" + id\n\n const path = resolve(srcDir, ...fullname.split(\".\"), \".java\")\n\n const code = await formatJava(generateJavaClass({ package: packageName, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import { resolve } from \"pathe\"\nimport { format } from \"prettier\"\nimport PrettierRustPlugin from \"prettier-plugin-rust\"\n\nimport {\n type EnumsModel,\n type ErrorModel,\n type LiteralModel,\n type RecordModel,\n type TypeModels,\n type UnionModel,\n} from \"@/type-system/basic\"\nimport type { HttpRouteModel } from \"@/type-system/http\"\nimport { collectModelDeep, collectModelFromRoutes } from \"@/type-system/http\"\n\nexport interface GenerateRustCodeOptions {\n module_name: string\n model:\n | RecordModel<{ [key: string]: TypeModels }>\n | UnionModel<{ [key: string]: TypeModels }>\n | EnumsModel<{ [key: string]: string }>\n | ErrorModel<string, { [key: string]: TypeModels }>\n}\n\nexport function generateRustCode(options: GenerateRustCodeOptions): string {\n const { model } = options\n\n switch (model.kind) {\n case \"record\":\n return generateRecordCode(model)\n case \"union\":\n return generateUnionCode(model)\n case \"error\":\n return generateErrorCode(model)\n case \"enums\":\n return generateEnumCode(model)\n }\n}\n\nfunction generateRecordCode(model: RecordModel<{ [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const structFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.properties)\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n const hasConstants = constFields.length > 0\n const hasFields = structFields.length > 0\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (hasConstants && hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else if (hasFields) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n structFields.forEach((f) => {\n code += ` ${f},\\n`\n })\n code += `}\\n`\n } else if (hasConstants) {\n code += `#[derive(Serialize)]\\npub struct ${structName};\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.id}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateUnionCode(model: UnionModel<{ [key: string]: TypeModels }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize)]\\n#[serde(tag = \"type\", content = \"value\")]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toPascalCase(k)\n if (v.kind === \"literal\") {\n code += ` ${variantName},\\n`\n } else {\n const variantType = generateModelSignature(v)\n code += ` ${variantName}(${variantType}),\\n`\n }\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateErrorCode(model: ErrorModel<string, { [key: string]: TypeModels }>): string {\n const structName = toPascalCase(model.id || \"Unknown\")\n const contextFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind !== \"literal\")\n .map(([k, v]) => generateStructField(k, v))\n\n const constFields = Object.entries(model.context ?? {})\n .filter(([_, v]) => v.kind === \"literal\")\n .map(([k, v]) => generateConstField(k, v as LiteralModel<string | number | boolean>))\n\n let code = `use serde::Serialize;\\n\\n`\n\n if (contextFields.length > 0 || constFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n if (contextFields.length > 0) {\n code += ` pub context: ${structName}Context,\\n`\n }\n code += `}\\n\\n`\n\n if (contextFields.length > 0) {\n code += `#[derive(Serialize)]\\npub struct ${structName}Context {\\n`\n contextFields.forEach((f) => {\n code += ` ${f};\\n`\n })\n code += `}\\n\\n`\n }\n\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n constFields.forEach((f) => {\n code += ` pub ${f};\\n`\n })\n code += `}\\n`\n } else {\n code += `#[derive(Serialize)]\\npub struct ${structName} {\\n`\n code += ` pub code: &'static str,\\n`\n code += `}\\n\\n`\n code += `impl ${structName} {\\n`\n code += ` pub const CODE: &'static str = \"${model.code}\";\\n`\n code += `}\\n`\n }\n\n return code\n}\n\nfunction generateEnumCode(model: EnumsModel<{ [key: string]: string }>): string {\n const enumName = toPascalCase(model.id || \"Unknown\")\n\n let code = `use serde::Serialize;\\n\\n`\n code += `#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)]\\npub enum ${enumName} {\\n`\n\n Object.entries(model.variants).forEach(([k, v]) => {\n const variantName = toUpperSnakeCase(k)\n code += ` #[serde(rename = \"${v}\")]\\n`\n code += ` ${variantName},\\n`\n })\n\n code += `}\\n`\n return code\n}\n\nfunction generateStructField(name: string, property: TypeModels): string {\n const fieldName = toSnakeCase(name)\n const fieldType = generateModelSignature(property)\n return `pub ${fieldName}: ${fieldType}`\n}\n\nfunction generateConstField(name: string, property: LiteralModel<string | number | boolean>): string {\n const constName = toUpperSnakeCase(name)\n const constType = generateModelSignature(property)\n const constValue = generateStaticValue(property.value)\n return `const ${constName}: ${constType} = ${constValue}`\n}\n\nfunction generateStaticValue(value: string | number | boolean): string {\n switch (typeof value) {\n case \"string\":\n return `\"${value}\"`\n case \"boolean\":\n return String(value)\n case \"number\":\n return Number.isInteger(value) ? String(value) : `${value}.0`\n default:\n throw Error(\"Unsupported literal value\")\n }\n}\n\nfunction generateModelSignature(model: TypeModels): string {\n switch (model.kind) {\n case \"string\":\n return \"String\"\n case \"int32\":\n return \"i32\"\n case \"int64\":\n return \"i64\"\n case \"float32\":\n return \"f32\"\n case \"float64\":\n return \"f64\"\n case \"boolean\":\n return \"bool\"\n case \"date\":\n return \"chrono::NaiveDate\"\n case \"datetime\":\n return \"chrono::DateTime<chrono::Utc>\"\n case \"duration\":\n return \"serde_json::Value\"\n case \"array\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"set\":\n return `Vec<${generateModelSignature(model.base)}>`\n case \"map\":\n return `std::collections::HashMap<String, ${generateModelSignature(model.base)}>`\n case \"optional\":\n return `Option<${generateModelSignature(model.base)}>`\n case \"literal\":\n switch (typeof model.value) {\n case \"string\":\n return \"&str\"\n case \"boolean\":\n return \"bool\"\n case \"number\":\n return Number.isInteger(model.value) ? \"i64\" : \"f64\"\n default:\n throw Error(\"Unsupported literal value\")\n }\n default:\n return model.id ? toPascalCase(model.id) : \"()\"\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\"))\n .replace(/^(.)/, (_, c) => (c ? c.toUpperCase() : \"\"))\n}\n\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .replace(/[-\\s]+/g, \"_\")\n .replace(/^_/, \"\")\n .toLowerCase()\n}\n\nfunction toUpperSnakeCase(str: string): string {\n return toSnakeCase(str).toUpperCase()\n}\n\nexport async function formatRust(code: string): Promise<string> {\n try {\n return await format(code, {\n parser: \"jinx-rust\",\n plugins: [PrettierRustPlugin],\n })\n } catch (error) {\n console.error(error)\n return code\n }\n}\n\nexport interface GenerateRustOptions {\n module_name: string\n srcDir: string\n routes?: HttpRouteModel[]\n models?: TypeModels[]\n}\n\nexport async function generateRustCodes(options: GenerateRustOptions): Promise<{ path: string; code: string }[]> {\n const { module_name, srcDir, routes = [], models = [] } = options\n\n const codes = new Map<string, string>()\n\n const namedModels = collectModelFromRoutes(routes)\n\n for (const model of models)\n for (const [id, subModel] of collectModelDeep(model)) {\n namedModels.set(id, subModel)\n }\n\n for (const [id, model] of namedModels) {\n if (model.kind !== \"union\" && model.kind !== \"record\" && model.kind !== \"enums\" && model.kind !== \"error\") continue\n\n const fullname = module_name + \"::\" + toSnakeCase(id)\n\n const path = resolve(srcDir, ...fullname.split(\"::\"), \".rs\")\n\n const code = await formatRust(generateRustCode({ module_name: fullname, model }))\n\n codes.set(path, code)\n }\n\n return codes\n .entries()\n .map(([path, code]) => ({ path, code }))\n .toArray()\n}\n","import type { Simplify } from \"type-fest\"\n\nimport {\n type ArrayModel,\n type BooleanModel,\n type DateModel,\n type DatetimeModel,\n type DurationModel,\n type EnumsModel,\n type ErrorModel,\n type Float32Model,\n type Float64Model,\n type Int32Model,\n type Int64Model,\n type KeyOfOptional,\n type LiteralModel,\n type MapModel,\n type OptionalModel,\n type RecordModel,\n type SetModel,\n type StringModel,\n type TaggedUnionModel,\n type TypeModels,\n type UnionModel,\n} from \"./basic\"\n\n/* prettier-ignore */\nexport type InferDeserialized<T> = \n | any extends T ? never\n : TypeModels extends T ? any\n : T extends Int32Model ? number\n : T extends Int64Model ? bigint\n : T extends Float32Model ? number\n : T extends Float64Model ? number\n : T extends BooleanModel ? boolean\n : T extends StringModel ? string\n : T extends LiteralModel<infer R> ? R\n : T extends OptionalModel<infer R> ? InferDeserialized<R> | undefined | null\n : T extends ArrayModel<infer R> ? InferDeserialized<R>[]\n : T extends SetModel<infer R> ? Set<InferDeserialized<R>>\n : T extends MapModel<infer R> ? Map<string, InferDeserialized<R>>\n : T extends RecordModel<infer R> ? InferDeserializedRecord<R>\n : T extends UnionModel<infer R> ? InferDeserializedUnion<R>\n : T extends TaggedUnionModel<infer _Tag, infer R> ? InferDeserializedTaggedUnion<R>\n : T extends DatetimeModel ? Temporal.Instant\n : T extends DateModel ? Temporal.Instant\n : T extends DurationModel ? Temporal.Duration\n : T extends ErrorModel<infer Code, infer Context> ? InferDeserializedError<Code, Context>\n : T extends EnumsModel<infer R> ? R[keyof R]\n : never\n\n// prettier-ignore\nexport type InferDeserializedRecord<T extends {[key: string]: TypeModels}, O extends KeyOfOptional<T> = KeyOfOptional<T>> = Simplify<\n & { [key in Exclude<keyof T, O>]: InferDeserialized<T[key]> } \n & { [key in O]?: InferDeserialized<T[key]> }\n>\n\n// prettier-ignore\nexport type InferDeserializedUnion<T extends { [key: string]: TypeModels }> = {\n [key in keyof T]: { [k in key]: InferDeserialized<T[key]> }\n}[keyof T]\n\n// prettier-ignore\nexport type InferDeserializedTaggedUnion<Variants extends {[key: string]: RecordModel<{[key: string]: TypeModels}>}> = {\n [key in keyof Variants]: InferDeserialized<Variants[key]>\n}[keyof Variants]\n\n// prettier-ignore\nexport type InferDeserializedError<Code extends string, Context extends { [key: string]: TypeModels }> = [Context] extends [never] \n ? { code: Code }\n : { code: Code; context: InferDeserializedRecord<Context> }\n\nexport function deserialize<T extends TypeModels>(model: T, json: string): DeserializeResult<InferDeserialized<T>> {\n return deserializeInner(model, JSON.parse(json))\n}\n\nexport function deserializeInner<T extends TypeModels>(model: T, value: any): DeserializeResult<InferDeserialized<T>> {\n type Ret = DeserializeResult<InferDeserialized<T>>\n\n const success = (value: any): Ret => ({ isSuccess: true, value })\n\n if (model.kind === \"string\") {\n if (typeof value === \"string\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"boolean\") {\n if (typeof value === \"boolean\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\") {\n if (typeof value === \"number\") return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"int64\") {\n if (typeof value === \"string\") {\n try {\n return success(BigInt(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"date\" || model.kind === \"datetime\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Instant.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"duration\") {\n if (typeof value === \"string\") {\n try {\n return success(Temporal.Duration.from(value))\n } catch {\n return deserializeFailed(model, value)\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"optional\") {\n return value == null ? success(undefined) : deserializeInner(model.base, value)\n }\n\n if (model.kind === \"literal\") {\n if (model.value === value) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"array\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(value.map((o) => deserializeInner(model.base, o)))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"set\") {\n if (typeof value === \"object\" && Array.isArray(value)) {\n return success(new Set(value.map((o) => deserializeInner(model.base, o))))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"map\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in value) {\n const result = deserializeInner(model.base, value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success(properties)\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"enums\") {\n if (typeof value === \"string\" && Object.values(model.variants).includes(value)) return success(value)\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"record\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const properties = new Map<string, any>()\n\n for (const key in model.properties) {\n const result = deserializeInner(model.properties[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return deserializeFailed(model, value)\n }\n\n return success(Object.fromEntries(properties))\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n const result = deserializeInner(model.variants[key], value[key])\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (model.kind === \"tagged-union\") {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const tag = value[model.tag]\n\n for (const [key, variant] of Object.entries(model.variants)) {\n const tagModel = variant.properties[model.tag] as TypeModels\n\n if (tagModel.kind === \"literal\" && tagModel.value === tag) {\n const result = deserializeInner(variant, value)\n\n if (result.isSuccess) return success({ [key]: result.value })\n }\n }\n }\n\n return deserializeFailed(model, value)\n }\n\n if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"code\" in value &&\n \"context\" in value &&\n value.code === model.code &&\n typeof value.context === \"object\" &&\n !Array.isArray(value.context)\n ) {\n const properties = new Map<string, any>()\n\n for (const key in model.context) {\n const result = deserializeInner(model.context[key], value[key])\n\n if (result.isSuccess) properties.set(key, result.value)\n else return result\n }\n\n return success({ code: model.code, context: Object.fromEntries(properties) })\n }\n\n return deserializeFailed(model, value)\n}\n\nexport interface DeserializeSuccess<T> {\n isSuccess: true\n value: T\n}\n\nexport interface DeserializeFailed {\n isSuccess: false\n code: \"deserial-failed\"\n context: {\n expect: TypeModels\n receive: any\n }\n}\n\nfunction deserializeFailed(expect: TypeModels, receive: any): DeserializeFailed {\n return {\n isSuccess: false,\n code: \"deserial-failed\",\n context: { expect, receive },\n }\n}\n\nexport type DeserializeResult<T> = DeserializeSuccess<T> | DeserializeFailed\n\nexport function serialize<T extends TypeModels>(model: T, value: InferDeserialized<T>): string {\n if (model.kind === \"string\" || model.kind === \"int64\") {\n const ret = value as string | bigint\n return `\"${ret.toString()}\"`\n }\n\n if (model.kind === \"int32\" || model.kind === \"float32\" || model.kind === \"float64\" || model.kind === \"boolean\") {\n const ret = value as string | number | boolean | bigint\n return ret.toString()\n }\n\n if (model.kind === \"array\") {\n const arr = value as unknown[]\n return arr.map((o) => serialize(model.base, o)).join(\",\")\n }\n\n if (model.kind === \"set\") {\n const set = value as Set<unknown>\n return set\n .values()\n .map((o) => serialize(model.base, o))\n .toArray()\n .join(\",\")\n }\n\n if (model.kind === \"map\") {\n const map = value as Map<string, unknown>\n return `{${map.entries().map(([k, v]) => `\"${k}\": ${serialize(model.base, v)}`)}}`\n }\n\n if (model.kind === \"literal\") return model.value.toString()\n\n if (model.kind === \"date\" || model.kind === \"datetime\" || model.kind === \"duration\") {\n const ret = value as Temporal.Instant | Temporal.Duration\n return ret.toJSON()\n }\n\n if (model.kind === \"optional\") {\n return value == null ? \"null\" : serialize(model.base, value)\n }\n\n if (model.kind === \"error\") {\n const properties: string[] = []\n\n for (const key in model.context) {\n properties.push(`\"${key}\": ${serialize(model.context[key], value[key])}`)\n }\n\n return `{\"code\":\"${model.code}\",context:{${properties}}}`\n }\n\n if (model.kind === \"record\") {\n const properties: string[] = []\n\n for (const key in model.properties) {\n properties.push(`\"${key}\": ${serialize(model.properties[key], value[key])}`)\n }\n\n return `{${properties}}`\n }\n\n if (model.kind === \"union\") {\n const variantKeys = Object.keys(model.variants)\n\n for (const key of variantKeys)\n if (key in value) {\n return `{\"${key}\":${serialize(model.variants[key], value[key])}}`\n }\n }\n\n if (model.kind === \"tagged-union\") {\n return JSON.stringify(value)\n }\n\n // Enums\n return String(value)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,32 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huanglangjian/specs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
7
7
|
],
|
|
8
8
|
"type": "module",
|
|
9
|
-
"
|
|
10
|
-
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.mts",
|
|
12
|
+
"import": "./dist/index.mjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
11
15
|
"publishConfig": {
|
|
12
16
|
"access": "public"
|
|
13
17
|
},
|
|
14
18
|
"dependencies": {
|
|
15
|
-
"es-toolkit": "^1.
|
|
19
|
+
"es-toolkit": "^1.46.1",
|
|
16
20
|
"pathe": "^2.0.3",
|
|
17
|
-
"prettier": "^3.8.
|
|
21
|
+
"prettier": "^3.8.3",
|
|
18
22
|
"prettier-plugin-java": "^2.8.1",
|
|
19
23
|
"prettier-plugin-rust": "^0.1.9",
|
|
20
24
|
"text-case": "^1.2.10"
|
|
21
25
|
},
|
|
22
26
|
"devDependencies": {
|
|
23
|
-
"@types/node": "^25.
|
|
24
|
-
"@vitest/ui": "^4.1.
|
|
27
|
+
"@types/node": "^25.6.2",
|
|
28
|
+
"@vitest/ui": "^4.1.5",
|
|
25
29
|
"temporal-polyfill": "^0.3.2",
|
|
26
|
-
"tsdown": "^0.
|
|
27
|
-
"type-fest": "^5.
|
|
28
|
-
"typescript": "^6.0.
|
|
29
|
-
"vitest": "^4.1.
|
|
30
|
+
"tsdown": "^0.22.0",
|
|
31
|
+
"type-fest": "^5.6.0",
|
|
32
|
+
"typescript": "^6.0.3",
|
|
33
|
+
"vitest": "^4.1.5"
|
|
30
34
|
},
|
|
31
35
|
"scripts": {
|
|
32
36
|
"build": "tsdown",
|