@sdk-it/core 0.15.0 → 0.17.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.ts CHANGED
@@ -3,13 +3,17 @@ import type { TypeDeriver } from './lib/deriver.ts';
3
3
  import type { ResponseItem } from './lib/paths.ts';
4
4
  export * from './lib/deriver.ts';
5
5
  export * from './lib/file-system.ts';
6
- export * from './lib/operation.ts';
7
6
  export * from './lib/paths.ts';
8
7
  export * from './lib/program.ts';
9
- export declare function removeDuplicates<T>(data: T[], accessor: (item: T) => T[keyof T]): T[];
8
+ export * from './lib/ref.ts';
9
+ export declare function removeDuplicates<T>(data: T[], accessor?: (item: T) => T[keyof T] | T): T[];
10
10
  export type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;
11
11
  export declare function toLitObject<T extends Record<string, any>>(obj: T, accessor?: (value: InferRecordValue<T>) => string): string;
12
12
  export type NaunceResponseAnalyzerFn = (handler: ts.ArrowFunction, deriver: TypeDeriver, node: ts.Node) => ResponseItem[];
13
13
  export type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;
14
14
  export type ResponseAnalyzerFn = (handler: ts.ArrowFunction, deriver: TypeDeriver) => ResponseItem[];
15
+ export declare function isEmpty(value: unknown): value is null | undefined | '';
16
+ export declare function pascalcase(value: string): string;
17
+ export declare function spinalcase(value: string): string;
18
+ export declare function snakecase(value: string): string;
15
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AAEjC,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAChC,CAAC,EAAE,CAEL;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9E,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,GAAG,EAAE,CAAC,EACN,QAAQ,GAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,MAAyB,UAKpE;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,KACV,YAAY,EAAE,CAAC;AACpB,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,WAAW,KACjB,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAE7B,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAkB,GACrD,CAAC,EAAE,CAEL;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9E,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,GAAG,EAAE,CAAC,EACN,QAAQ,GAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,MAAyB,UAKpE;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,KACV,YAAY,EAAE,CAAC;AACpB,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,WAAW,KACjB,YAAY,EAAE,CAAC;AAEpB,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,EAAE,CAWtE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAEtC"}
package/dist/index.js CHANGED
@@ -1,3 +1,10 @@
1
+ // packages/core/src/index.ts
2
+ import {
3
+ pascalcase as _pascalcase,
4
+ snakecase as _snakecase,
5
+ spinalcase as _spinalcase
6
+ } from "stringcase";
7
+
1
8
  // packages/core/src/lib/deriver.ts
2
9
  import ts, { TypeFlags, symbolName } from "typescript";
3
10
  var deriveSymbol = Symbol.for("serialize");
@@ -59,6 +66,13 @@ var TypeDeriver = class {
59
66
  [$types]: ["number"]
60
67
  };
61
68
  }
69
+ if (type.flags & TypeFlags.BooleanLiteral) {
70
+ return {
71
+ [deriveSymbol]: true,
72
+ optional: false,
73
+ [$types]: ["boolean"]
74
+ };
75
+ }
62
76
  if (type.flags & TypeFlags.TemplateLiteral) {
63
77
  return {
64
78
  [deriveSymbol]: true,
@@ -523,6 +537,38 @@ async function getFolderExports(folder, includeExtension = true, extensions = ["
523
537
  }
524
538
  return exports.join("\n");
525
539
  }
540
+ async function getFolderExportsV2(folder, options = {
541
+ extensions: "ts",
542
+ ignore: () => false,
543
+ includeExtension: true,
544
+ exportSyntax: "export * from "
545
+ }) {
546
+ options.includeExtension ??= true;
547
+ if (!await exist(folder)) {
548
+ return "";
549
+ }
550
+ const files = await readdir(folder, { withFileTypes: true });
551
+ const exports = [];
552
+ for (const file of files) {
553
+ if (options.ignore?.(file)) {
554
+ continue;
555
+ }
556
+ if (file.isDirectory()) {
557
+ if (await exist(
558
+ `${file.parentPath}/${file.name}/index.${options.extensions}`
559
+ )) {
560
+ exports.push(
561
+ `${options.exportSyntax} './${file.name}/index${options.includeExtension ? `.${options.extensions}` : ""}';`
562
+ );
563
+ }
564
+ } else if (file.name !== `index.${options.extensions}` && options.extensions.includes(getExt(file.name))) {
565
+ exports.push(
566
+ `${options.exportSyntax} './${options.includeExtension ? file.name : file.name.replace(extname(file.name), "")}';`
567
+ );
568
+ }
569
+ }
570
+ return exports.join("\n");
571
+ }
526
572
  var getExt = (fileName) => {
527
573
  if (!fileName) {
528
574
  return "";
@@ -538,40 +584,6 @@ var getExt = (fileName) => {
538
584
  return ext || "txt";
539
585
  };
540
586
 
541
- // packages/core/src/lib/operation.ts
542
- import { camelcase } from "stringcase";
543
- var defaults2 = {
544
- operationId: (operation, path, method) => {
545
- if (operation.operationId) {
546
- return camelcase(operation.operationId);
547
- }
548
- return camelcase(
549
- [method, ...path.replace(/[\\/\\{\\}]/g, " ").split(" ")].filter(Boolean).join(" ").trim()
550
- );
551
- }
552
- };
553
- function forEachOperation(config, callback) {
554
- const result = [];
555
- for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {
556
- const { parameters = [], ...methods2 } = pathItem;
557
- for (const [method, operation] of Object.entries(methods2)) {
558
- const formatOperationId = config.operationId ?? defaults2.operationId;
559
- const operationName = formatOperationId(operation, path, method);
560
- result.push(
561
- callback(
562
- { name: operationName, method, path },
563
- {
564
- ...operation,
565
- parameters: [...parameters, ...operation.parameters ?? []],
566
- operationId: operationName
567
- }
568
- )
569
- );
570
- }
571
- }
572
- return result;
573
- }
574
-
575
587
  // packages/core/src/lib/paths.ts
576
588
  var methods = [
577
589
  "get",
@@ -596,12 +608,13 @@ var Paths = class {
596
608
  this.#commonZodImport = config.commonZodImport;
597
609
  this.#onOperation = config.onOperation;
598
610
  }
599
- addPath(name, path, method, selectors, responses, sourceFile, tags, description) {
611
+ addPath(name, path, method, contentType, selectors, responses, sourceFile, tags, description) {
600
612
  const responsesObject = this.#responseItemToResponses(responses);
601
613
  this.#operations.push({
602
614
  name,
603
615
  path: this.#tunePath(path),
604
616
  sourceFile,
617
+ contentType,
605
618
  method,
606
619
  selectors,
607
620
  responses: responsesObject,
@@ -700,8 +713,9 @@ var Paths = class {
700
713
  tags: operation.tags,
701
714
  description: operation.description,
702
715
  requestBody: Object.keys(bodySchema).length ? {
716
+ required: required.length ? true : false,
703
717
  content: {
704
- "application/json": {
718
+ [operation.contentType || "application/json"]: {
705
719
  schema: {
706
720
  required: required.length ? required : void 0,
707
721
  type: "object",
@@ -743,11 +757,13 @@ async function evalZod(schema, commonZodImport) {
743
757
  `const z = require("zod");`,
744
758
  commonZodImport ? `const commonZod = require('${commonZodImport}');` : "",
745
759
  `const {zodToJsonSchema} = require('zod-to-json-schema');`,
746
- `const schema = ${schema.replace(".optional()", "")};`,
760
+ `const schema = ${schema.replace(".optional()", "").replaceAll("instanceof(File)", "string().base64()")};`,
747
761
  `const jsonSchema = zodToJsonSchema(schema, {
748
- $refStrategy: 'root',
749
- basePath: ['#', 'components', 'schemas']
750
- });`,
762
+ $refStrategy: 'root',
763
+ basePath: ['#', 'components', 'schemas'],
764
+ target: 'jsonSchema7',
765
+ base64Strategy: 'format:binary',
766
+ });`,
751
767
  `export default jsonSchema;`
752
768
  ];
753
769
  const base64 = Buffer.from(lines.join("\n")).toString("base64");
@@ -757,8 +773,8 @@ function toSchema(data) {
757
773
  if (data === null || data === void 0) {
758
774
  return { type: "any" };
759
775
  } else if (typeof data === "string") {
760
- const isRef = data.startsWith("#");
761
- if (isRef) {
776
+ const isRef2 = data.startsWith("#");
777
+ if (isRef2) {
762
778
  return { $ref: data };
763
779
  }
764
780
  return { type: data };
@@ -868,33 +884,92 @@ function isInterfaceType2(type) {
868
884
  return false;
869
885
  }
870
886
 
887
+ // packages/core/src/lib/ref.ts
888
+ import { get } from "lodash-es";
889
+ function isRef(obj) {
890
+ return obj && "$ref" in obj;
891
+ }
892
+ function notRef(obj) {
893
+ return !isRef(obj);
894
+ }
895
+ function cleanRef(ref) {
896
+ return ref.replace(/^#\//, "");
897
+ }
898
+ function parseRef(ref) {
899
+ const parts = ref.split("/");
900
+ const [model] = parts.splice(-1);
901
+ const [namespace] = parts.splice(-1);
902
+ return {
903
+ model,
904
+ namespace,
905
+ path: cleanRef(parts.join("/"))
906
+ };
907
+ }
908
+ function followRef(spec, ref) {
909
+ const pathParts = cleanRef(ref).split("/");
910
+ const entry = get(spec, pathParts);
911
+ if (entry && "$ref" in entry) {
912
+ return followRef(spec, entry.$ref);
913
+ }
914
+ return entry;
915
+ }
916
+
871
917
  // packages/core/src/index.ts
872
- function removeDuplicates(data, accessor) {
918
+ function removeDuplicates(data, accessor = (item) => item) {
873
919
  return [...new Map(data.map((x) => [accessor(x), x])).values()];
874
920
  }
875
921
  function toLitObject(obj, accessor = (value) => value) {
876
922
  return `{${Object.keys(obj).map((key) => `${key}: ${accessor(obj[key])}`).join(", ")}}`;
877
923
  }
924
+ function isEmpty(value) {
925
+ if (value === null || value === void 0 || value === "") {
926
+ return true;
927
+ }
928
+ if (Array.isArray(value) && value.length === 0) {
929
+ return true;
930
+ }
931
+ if (typeof value === "object" && Object.keys(value).length === 0) {
932
+ return true;
933
+ }
934
+ return false;
935
+ }
936
+ function pascalcase(value) {
937
+ return _pascalcase(value.split("/").join(" "));
938
+ }
939
+ function spinalcase(value) {
940
+ return _spinalcase(value.split("/").join(" "));
941
+ }
942
+ function snakecase(value) {
943
+ return _snakecase(value.split("/").join(" "));
944
+ }
878
945
  export {
879
946
  $types,
880
947
  Paths,
881
948
  TypeDeriver,
882
- defaults2 as defaults,
949
+ cleanRef,
883
950
  deriveSymbol,
884
951
  exist,
885
- forEachOperation,
952
+ followRef,
886
953
  getExt,
887
954
  getFile,
888
955
  getFolderExports,
956
+ getFolderExportsV2,
889
957
  getProgram,
890
958
  getPropertyAssignment,
891
959
  isCallExpression,
960
+ isEmpty,
892
961
  isHttpMethod,
893
962
  isInterfaceType2 as isInterfaceType,
963
+ isRef,
894
964
  methods,
965
+ notRef,
966
+ parseRef,
895
967
  parseTsConfig,
968
+ pascalcase,
896
969
  readFolder,
897
970
  removeDuplicates,
971
+ snakecase,
972
+ spinalcase,
898
973
  toLitObject,
899
974
  toSchema,
900
975
  writeFiles
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/lib/deriver.ts", "../src/lib/file-system.ts", "../src/lib/operation.ts", "../src/lib/paths.ts", "../src/lib/program.ts", "../src/index.ts"],
4
- "sourcesContent": ["import ts, { TypeFlags, symbolName } from 'typescript';\n\ntype Collector = Record<string, any>;\nexport const deriveSymbol = Symbol.for('serialize');\nexport const $types = Symbol.for('types');\nconst defaults: Record<string, string> = {\n Readable: 'any',\n ReadableStream: 'any',\n DateConstructor: 'string',\n ArrayBufferConstructor: 'any',\n SharedArrayBufferConstructor: 'any',\n Int8ArrayConstructor: 'any',\n Uint8Array: 'any',\n};\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n constructor(checker: ts.TypeChecker) {\n this.checker = checker;\n }\n\n serializeType(type: ts.Type): any {\n const indexType = type.getStringIndexType();\n if (indexType) {\n return {\n [deriveSymbol]: true,\n kind: 'record',\n optional: false,\n [$types]: [this.serializeType(indexType)],\n };\n }\n if (type.flags & TypeFlags.Any) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Unknown) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.TemplateLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.String) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.Number) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['number'],\n };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.Null) {\n return {\n [deriveSymbol]: true,\n optional: true,\n [$types]: ['null'],\n };\n }\n if (type.isIntersection()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'intersection',\n optional,\n [$types]: types,\n };\n }\n if (type.isUnion()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n // ignore undefined\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const [argType] = this.checker.getTypeArguments(type as ts.TypeReference);\n if (!argType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n console.warn(\n `Could not find generic type argument for array type ${typeName}`,\n );\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const typeSymbol = argType.getSymbol();\n if (!typeSymbol) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: [this.serializeType(argType)],\n };\n }\n\n if (typeSymbol.valueDeclaration) {\n return {\n kind: 'array',\n [deriveSymbol]: true,\n [$types]: [this.serializeNode(typeSymbol.valueDeclaration)],\n };\n }\n const maybeDeclaration = typeSymbol.declarations?.[0];\n if (maybeDeclaration) {\n if (ts.isMappedTypeNode(maybeDeclaration)) {\n const resolvedType = this.checker\n .getPropertiesOfType(argType)\n .reduce<Record<string, unknown>>((acc, prop) => {\n const propType = this.checker.getTypeOfSymbol(prop);\n acc[prop.name] = this.serializeType(propType);\n return acc;\n }, {});\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: [resolvedType],\n };\n } else {\n return {\n kind: 'array',\n ...this.serializeNode(maybeDeclaration),\n };\n }\n }\n\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: ['any'],\n };\n }\n if (type.isClass()) {\n const declaration = type.symbol?.valueDeclaration;\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n if (isInterfaceType(type)) {\n const valueDeclaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!valueDeclaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(valueDeclaration);\n }\n if (type.flags & TypeFlags.Object) {\n if (defaults[symbolName(type.symbol)]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[type.symbol.name]],\n };\n }\n const properties = this.checker.getPropertiesOfType(type);\n if (properties.length > 0) {\n const serializedProps: Record<string, any> = {};\n for (const prop of properties) {\n const propAssingment = (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertyAssignment(it),\n );\n // get literal properties values if any\n if (propAssingment) {\n const type = this.checker.getTypeAtLocation(\n propAssingment.initializer,\n );\n serializedProps[prop.name] = this.serializeType(type);\n }\n if (\n (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertySignature(it),\n )\n ) {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n }\n }\n return {\n [deriveSymbol]: true,\n kind: 'object',\n optional: false,\n [$types]: [serializedProps],\n };\n }\n const declaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n console.warn(`Unhandled type: ${type.flags} ${ts.TypeFlags[type.flags]}`);\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.checker.typeToString(\n type,\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n ),\n ],\n };\n }\n\n serializeNode(node: ts.Node): any {\n if (ts.isObjectLiteralExpression(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, any> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n\n // get literal properties values if any\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop)) {\n const type = this.checker.getTypeAtLocation(prop.initializer);\n props[prop.name.getText()] = this.serializeType(type);\n }\n }\n\n return props;\n }\n if (ts.isPropertyAccessExpression(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertySignature(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertyDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isInterfaceDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Interface has no name');\n }\n if (defaults[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[node.name.text]],\n };\n }\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, any> = {};\n for (const member of node.members.filter(ts.isPropertySignature)) {\n members[member.name.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = members;\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n };\n }\n if (ts.isClassDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Class has no name');\n }\n if (defaults[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[node.name.text]],\n };\n }\n\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, unknown> = {};\n for (const member of node.members.filter(ts.isPropertyDeclaration)) {\n members[member.name!.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = members;\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n $ref: `#/components/schemas/${node.name.text}`,\n };\n }\n if (ts.isVariableDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n if (!node.type) {\n console.warn(`No type found for ${node.name.getText()}`);\n return 'any';\n }\n const type = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(type);\n }\n if (ts.isIdentifier(node)) {\n const symbol = this.checker.getSymbolAtLocation(node);\n if (!symbol) {\n console.warn(`Identifer: No symbol found for ${node.getText()}`);\n return null;\n }\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAwaitExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isCallExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAsExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isTypeLiteralNode(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, unknown> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [props],\n };\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return {\n [deriveSymbol]: true,\n optional: true,\n [$types]: ['null'],\n };\n }\n if (node.kind === ts.SyntaxKind.BooleanKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: true,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: false,\n [$types]: ['boolean'],\n };\n }\n if (ts.isArrayLiteralExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n console.warn(`Unhandled node: ${ts.SyntaxKind[node.kind]} ${node.flags}`);\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n}\n\nfunction isInterfaceType(type: ts.Type): boolean {\n if (type.isClassOrInterface()) {\n // Check if it's an interface\n return !!(type.symbol.flags & ts.SymbolFlags.Interface);\n }\n return false;\n}\n", "import type { Dirent } from 'node:fs';\nimport { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport { dirname, extname, isAbsolute, join } from 'node:path';\n\nexport async function getFile(filePath: string) {\n if (await exist(filePath)) {\n return readFile(filePath, 'utf-8');\n }\n return null;\n}\n\nexport async function exist(file: string): Promise<boolean> {\n return stat(file)\n .then(() => true)\n .catch(() => false);\n}\n\nexport async function readFolder(path: string) {\n if (await exist(path)) {\n return readdir(path);\n }\n return [] as string[];\n}\n\nexport async function writeFiles(\n dir: string,\n contents: Record<\n string,\n null | string | { content: string; ignoreIfExists?: boolean }\n >,\n) {\n await Promise.all(\n Object.entries(contents).map(async ([file, content]) => {\n if (content === null) {\n return;\n }\n const filePath = isAbsolute(file) ? file : join(dir, file);\n await mkdir(dirname(filePath), { recursive: true });\n if (typeof content === 'string') {\n await writeFile(filePath, content, 'utf-8');\n } else {\n if (content.ignoreIfExists) {\n if (!(await exist(filePath))) {\n await writeFile(filePath, content.content, 'utf-8');\n }\n } else {\n await writeFile(filePath, content.content, 'utf-8');\n }\n }\n }),\n );\n}\n\nexport async function getFolderExports(\n folder: string,\n includeExtension = true,\n extensions = ['ts'],\n ignore: (dirent: Dirent) => boolean = () => false,\n) {\n const files = await readdir(folder, { withFileTypes: true });\n const exports: string[] = [];\n for (const file of files) {\n if (ignore(file)) {\n continue;\n }\n if (file.isDirectory()) {\n if (await exist(`${file.parentPath}/${file.name}/index.ts`)) {\n exports.push(\n `export * from './${file.name}/index${includeExtension ? '.ts' : ''}';`,\n );\n }\n } else if (\n file.name !== 'index.ts' &&\n extensions.includes(getExt(file.name))\n ) {\n exports.push(\n `export * from './${includeExtension ? file.name : file.name.replace(extname(file.name), '')}';`,\n );\n }\n }\n return exports.join('\\n');\n}\n\nexport const getExt = (fileName?: string) => {\n if (!fileName) {\n return ''; // shouldn't happen as there will always be a file name\n }\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) {\n return '';\n }\n const ext = fileName\n .slice(lastDot + 1)\n .split('/')\n .filter(Boolean)\n .join('');\n if (ext === fileName) {\n // files that have no extension\n return '';\n }\n return ext || 'txt';\n};\n", "import type {\n OpenAPIObject,\n OperationObject,\n ParameterObject,\n ReferenceObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId'>> = {\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return camelcase(operation.operationId);\n }\n return camelcase(\n [method, ...path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').split(' ')]\n .filter(Boolean)\n .join(' ')\n .trim(),\n );\n },\n};\n\ntype TunedOperationObject = OperationObject & {\n operationId: string;\n parameters: (ParameterObject | ReferenceObject)[];\n};\n\nexport function forEachOperation<T>(\n config: GenerateSdkConfig,\n callback: (\n entry: { name: string; method: string; path: string },\n operation: TunedOperationObject,\n ) => T,\n) {\n const result: T[] = [];\n for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {\n const { parameters = [], ...methods } = pathItem;\n\n for (const [method, operation] of Object.entries(methods) as [\n string,\n OperationObject,\n ][]) {\n const formatOperationId = config.operationId ?? defaults.operationId;\n const operationName = formatOperationId(operation, path, method);\n result.push(\n callback(\n { name: operationName, method, path },\n {\n ...operation,\n parameters: [...parameters, ...(operation.parameters ?? [])],\n operationId: operationName,\n },\n ),\n );\n }\n }\n return result;\n}\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n}\n", "import type {\n HeadersObject,\n OperationObject,\n ParameterObject,\n PathsObject,\n ResponseObject,\n ResponsesObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { $types } from './deriver.ts';\n\nexport type Method =\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'trace'\n | 'head';\nexport const methods = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'trace',\n 'head',\n] as const;\nexport type SemanticSource =\n | 'query'\n | 'queries'\n | 'body'\n | 'params'\n | 'headers';\n\nconst semanticSourceToOpenAPI = {\n queries: 'query',\n query: 'query',\n headers: 'header',\n params: 'path',\n} as const;\nexport interface Selector {\n name: string;\n select: string;\n against: string;\n source: SemanticSource;\n nullable: boolean;\n required: boolean;\n}\n\nexport interface ResponseItem {\n statusCode: string;\n response?: DateType;\n contentType: string;\n headers: (string | Record<string, string[]>)[];\n}\n\nexport type OnOperation = (\n sourceFile: string,\n method: Method,\n path: string,\n operation: OperationObject,\n) => PathsObject;\nexport class Paths {\n #commonZodImport?: string;\n #onOperation?: OnOperation;\n #operations: Array<{\n sourceFile: string;\n name: string;\n path: string;\n method: Method;\n selectors: Selector[];\n responses: ResponsesObject;\n tags?: string[];\n description?: string;\n }> = [];\n\n constructor(config: { commonZodImport?: string; onOperation?: OnOperation }) {\n this.#commonZodImport = config.commonZodImport;\n this.#onOperation = config.onOperation;\n }\n\n addPath(\n name: string,\n path: string,\n method: Method,\n selectors: Selector[],\n responses: ResponseItem[],\n sourceFile: string,\n tags?: string[],\n description?: string,\n ) {\n const responsesObject = this.#responseItemToResponses(responses);\n\n this.#operations.push({\n name,\n path: this.#tunePath(path),\n sourceFile,\n method,\n selectors,\n responses: responsesObject,\n tags,\n description,\n });\n return this;\n }\n\n #responseItemToResponses(responses: ResponseItem[]): ResponsesObject {\n const responsesObject: ResponsesObject = {};\n for (const item of responses) {\n const ct = item.contentType;\n const schema = item.response ? toSchema(item.response) : {};\n if (!responsesObject[item.statusCode]) {\n responsesObject[item.statusCode] = {\n description: `Response for ${item.statusCode}`,\n content:\n ct !== 'empty'\n ? {\n [ct]:\n ct === 'application/octet-stream'\n ? { schema: { type: 'string', format: 'binary' } }\n : { schema },\n }\n : undefined,\n headers: item.headers.length\n ? item.headers.reduce<HeadersObject>((acc, current) => {\n const headers =\n typeof current === 'string' ? { [current]: [] } : current;\n return Object.entries(headers).reduce<HeadersObject>(\n (subAcc, [key, value]) => {\n const header: HeadersObject = {\n [key]: {\n schema: {\n type: 'string',\n enum: value.length ? value : undefined,\n },\n },\n };\n return { ...subAcc, ...header };\n },\n acc,\n );\n }, {})\n : undefined,\n } satisfies ResponseObject;\n } else {\n if (!responsesObject[item.statusCode].content[ct]) {\n responsesObject[item.statusCode].content[ct] = { schema };\n } else {\n const existing = responsesObject[item.statusCode].content[ct]\n .schema as SchemaObject;\n if (existing.oneOf) {\n if (\n !existing.oneOf.find(\n (it) => JSON.stringify(it) === JSON.stringify(schema),\n )\n ) {\n existing.oneOf.push(schema);\n }\n } else if (JSON.stringify(existing) !== JSON.stringify(schema)) {\n responsesObject[item.statusCode].content[ct].schema = {\n oneOf: [existing, schema],\n };\n }\n }\n }\n }\n return responsesObject;\n }\n\n async #selectosToParameters(selectors: Selector[]) {\n const parameters: ParameterObject[] = [];\n const bodySchemaProps: Record<\n string,\n { required: boolean; schema: SchemaObject }\n > = {};\n for (const selector of selectors) {\n if (selector.source === 'body') {\n bodySchemaProps[selector.name] = {\n required: selector.required,\n schema: await evalZod(selector.against, this.#commonZodImport),\n };\n continue;\n }\n\n const parameter: ParameterObject = {\n in: semanticSourceToOpenAPI[selector.source],\n name: selector.name,\n required: selector.required,\n schema: await evalZod(selector.against, this.#commonZodImport),\n };\n parameters.push(parameter);\n }\n return { parameters, bodySchemaProps };\n }\n\n async getPaths() {\n const operations: PathsObject = {};\n for (const operation of this.#operations) {\n const { path, method, selectors } = operation;\n const { parameters, bodySchemaProps } =\n await this.#selectosToParameters(selectors);\n const bodySchema: Record<string, SchemaObject> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(bodySchemaProps)) {\n if (value.required) {\n required.push(key);\n }\n bodySchema[key] = value.schema;\n }\n const operationObject: OperationObject = {\n operationId: operation.name,\n parameters,\n tags: operation.tags,\n description: operation.description,\n requestBody: Object.keys(bodySchema).length\n ? {\n content: {\n 'application/json': {\n schema: {\n required: required.length ? required : undefined,\n type: 'object',\n properties: bodySchema,\n },\n },\n },\n }\n : undefined,\n responses:\n Object.keys(operation.responses).length === 0\n ? undefined\n : operation.responses,\n };\n if (!operations[path]) {\n operations[path] = {};\n }\n operations[path][method] = operationObject;\n if (this.#onOperation) {\n const paths = this.#onOperation?.(\n operation.sourceFile,\n method,\n path,\n operationObject,\n );\n Object.assign(operations, paths ?? {});\n }\n }\n return operations;\n }\n\n /**\n * Converts Express/Node.js style path parameters (/path/:param) to OpenAPI style (/path/{param})\n */\n #tunePath(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}');\n }\n}\n\nasync function evalZod(schema: string, commonZodImport?: string) {\n // https://github.com/nodejs/node/issues/51956\n const lines = [\n `import { createRequire } from \"node:module\";`,\n `const filename = \"${import.meta.url}\";`,\n `const require = createRequire(filename);`,\n `const z = require(\"zod\");`,\n commonZodImport ? `const commonZod = require('${commonZodImport}');` : '',\n `const {zodToJsonSchema} = require('zod-to-json-schema');`,\n `const schema = ${schema.replace('.optional()', '')};`,\n `const jsonSchema = zodToJsonSchema(schema, {\n \t$refStrategy: 'root',\n \tbasePath: ['#', 'components', 'schemas']\n });`,\n `export default jsonSchema;`,\n ];\n const base64 = Buffer.from(lines.join('\\n')).toString('base64');\n return import(`data:text/javascript;base64,${base64}`)\n .then((mod) => mod.default)\n .then(({ $schema, ...result }) => result);\n}\n\ninterface DateType {\n [$types]: any[];\n kind: string;\n optional: boolean;\n value?: string;\n}\n\nexport function toSchema(data: DateType | string | null | undefined): any {\n if (data === null || data === undefined) {\n return { type: 'any' };\n } else if (typeof data === 'string') {\n const isRef = data.startsWith('#');\n if (isRef) {\n return { $ref: data };\n }\n return { type: data };\n } else if (data.kind === 'literal') {\n return { enum: [data.value], type: data[$types][0] };\n } else if (data.kind === 'record') {\n return {\n type: 'object',\n additionalProperties: toSchema(data[$types][0]),\n };\n } else if (data.kind === 'array') {\n const items = data[$types].map(toSchema);\n return { type: 'array', items: data[$types].length ? items[0] : {} };\n } else if (data.kind === 'union') {\n return { anyOf: data[$types].map(toSchema) };\n } else if (data.kind === 'intersection') {\n return { allOf: data[$types].map(toSchema) };\n } else if ($types in data) {\n return data[$types].map(toSchema)[0] ?? {};\n } else {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n props[key] = toSchema(value as any);\n if (!(value as any).optional) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties: props,\n required,\n additionalProperties: false,\n };\n }\n}\n\nexport function isHttpMethod(name: string): name is Method {\n return ['get', 'post', 'put', 'delete', 'patch'].includes(name);\n}\n", "import debug from 'debug';\nimport { dirname, join } from 'node:path';\nimport ts from 'typescript';\n\nconst logger = debug('january:client');\n\nexport function parseTsConfig(tsconfigPath: string) {\n logger(`Using TypeScript version: ${ts.version}`);\n const configContent = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n\n if (configContent.error) {\n console.error(\n `Failed to read tsconfig file:`,\n ts.formatDiagnosticsWithColorAndContext([configContent.error], {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getNewLine: () => ts.sys.newLine,\n }),\n );\n throw new Error('Failed to parse tsconfig.json');\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configContent.config,\n ts.sys,\n dirname(tsconfigPath),\n );\n\n if (parsed.errors.length > 0) {\n console.error(\n `Errors found in tsconfig.json:`,\n ts.formatDiagnosticsWithColorAndContext(parsed.errors, {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getNewLine: () => ts.sys.newLine,\n }),\n );\n throw new Error('Failed to parse tsconfig.json');\n }\n return parsed;\n}\nexport function getProgram(tsconfigPath: string) {\n const tsConfigParseResult = parseTsConfig(tsconfigPath);\n logger(`Parsing tsconfig`);\n return ts.createProgram({\n options: {\n ...tsConfigParseResult.options,\n noEmit: true,\n incremental: true,\n tsBuildInfoFile: join(dirname(tsconfigPath), './.tsbuildinfo'), // not working atm\n },\n rootNames: tsConfigParseResult.fileNames,\n projectReferences: tsConfigParseResult.projectReferences,\n configFileParsingDiagnostics: tsConfigParseResult.errors,\n });\n}\nexport function getPropertyAssignment(node: ts.Node, name: string) {\n if (ts.isObjectLiteralExpression(node)) {\n return node.properties\n .filter((prop) => ts.isPropertyAssignment(prop))\n .find((prop) => prop.name!.getText() === name);\n }\n return undefined;\n}\nexport function isCallExpression(\n node: ts.Node,\n name: string,\n): node is ts.CallExpression {\n return (\n ts.isCallExpression(node) &&\n node.expression &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === name\n );\n}\n\nexport function isInterfaceType(type: ts.Type): boolean {\n if (type.isClassOrInterface()) {\n // Check if it's an interface\n return !!(type.symbol.flags & ts.SymbolFlags.Interface);\n }\n return false;\n}\n", "import type ts from 'typescript';\n\nimport type { TypeDeriver } from './lib/deriver.ts';\nimport type { ResponseItem } from './lib/paths.ts';\n\nexport * from './lib/deriver.ts';\nexport * from './lib/file-system.ts';\nexport * from './lib/operation.ts';\nexport * from './lib/paths.ts';\nexport * from './lib/program.ts';\n\nexport function removeDuplicates<T>(\n data: T[],\n accessor: (item: T) => T[keyof T],\n): T[] {\n return [...new Map(data.map((x) => [accessor(x), x])).values()];\n}\n\nexport type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;\n\nexport function toLitObject<T extends Record<string, any>>(\n obj: T,\n accessor: (value: InferRecordValue<T>) => string = (value) => value,\n) {\n return `{${Object.keys(obj)\n .map((key) => `${key}: ${accessor(obj[key])}`)\n .join(', ')}}`;\n}\n\nexport type NaunceResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n node: ts.Node,\n) => ResponseItem[];\nexport type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;\n\nexport type ResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n) => ResponseItem[];\n"],
5
- "mappings": "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",
6
- "names": ["type", "defaults", "methods", "dirname", "join", "ts", "isInterfaceType"]
3
+ "sources": ["../src/index.ts", "../src/lib/deriver.ts", "../src/lib/file-system.ts", "../src/lib/paths.ts", "../src/lib/program.ts", "../src/lib/ref.ts"],
4
+ "sourcesContent": ["import {\n pascalcase as _pascalcase,\n snakecase as _snakecase,\n spinalcase as _spinalcase,\n} from 'stringcase';\nimport type ts from 'typescript';\n\nimport type { TypeDeriver } from './lib/deriver.ts';\nimport type { ResponseItem } from './lib/paths.ts';\n\nexport * from './lib/deriver.ts';\nexport * from './lib/file-system.ts';\nexport * from './lib/paths.ts';\nexport * from './lib/program.ts';\nexport * from './lib/ref.ts';\n\nexport function removeDuplicates<T>(\n data: T[],\n accessor: (item: T) => T[keyof T] | T = (item) => item,\n): T[] {\n return [...new Map(data.map((x) => [accessor(x), x])).values()];\n}\n\nexport type InferRecordValue<T> = T extends Record<string, infer U> ? U : any;\n\nexport function toLitObject<T extends Record<string, any>>(\n obj: T,\n accessor: (value: InferRecordValue<T>) => string = (value) => value,\n) {\n return `{${Object.keys(obj)\n .map((key) => `${key}: ${accessor(obj[key])}`)\n .join(', ')}}`;\n}\n\nexport type NaunceResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n node: ts.Node,\n) => ResponseItem[];\nexport type NaunceResponseAnalyzer = Record<string, NaunceResponseAnalyzerFn>;\n\nexport type ResponseAnalyzerFn = (\n handler: ts.ArrowFunction,\n deriver: TypeDeriver,\n) => ResponseItem[];\n\nexport function isEmpty(value: unknown): value is null | undefined | '' {\n if (value === null || value === undefined || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return true;\n }\n return false;\n}\n\nexport function pascalcase(value: string) {\n return _pascalcase(value.split('/').join(' '));\n}\nexport function spinalcase(value: string) {\n return _spinalcase(value.split('/').join(' '));\n}\nexport function snakecase(value: string) {\n return _snakecase(value.split('/').join(' '));\n}\n", "import ts, { TypeFlags, symbolName } from 'typescript';\n\ntype Collector = Record<string, any>;\nexport const deriveSymbol = Symbol.for('serialize');\nexport const $types = Symbol.for('types');\nconst defaults: Record<string, string> = {\n Readable: 'any',\n ReadableStream: 'any',\n DateConstructor: 'string',\n ArrayBufferConstructor: 'any',\n SharedArrayBufferConstructor: 'any',\n Int8ArrayConstructor: 'any',\n Uint8Array: 'any',\n};\nexport class TypeDeriver {\n public readonly collector: Collector = {};\n public readonly checker: ts.TypeChecker;\n constructor(checker: ts.TypeChecker) {\n this.checker = checker;\n }\n\n serializeType(type: ts.Type): any {\n const indexType = type.getStringIndexType();\n if (indexType) {\n return {\n [deriveSymbol]: true,\n kind: 'record',\n optional: false,\n [$types]: [this.serializeType(indexType)],\n };\n }\n if (type.flags & TypeFlags.Any) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.flags & TypeFlags.Unknown) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [],\n };\n }\n if (type.isStringLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['string'],\n };\n }\n if (type.isNumberLiteral()) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: type.value,\n [$types]: ['number'],\n };\n }\n if (type.flags & TypeFlags.BooleanLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n\n if (type.flags & TypeFlags.TemplateLiteral) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.String) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['string'],\n };\n }\n if (type.flags & TypeFlags.Number) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['number'],\n };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (type.flags & TypeFlags.Null) {\n return {\n [deriveSymbol]: true,\n optional: true,\n [$types]: ['null'],\n };\n }\n if (type.isIntersection()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'intersection',\n optional,\n [$types]: types,\n };\n }\n if (type.isUnion()) {\n let optional: boolean | undefined;\n const types: any[] = [];\n for (const unionType of type.types) {\n if (optional === undefined) {\n // ignore undefined\n optional = (unionType.flags & ts.TypeFlags.Undefined) !== 0;\n if (optional) {\n continue;\n }\n }\n\n types.push(this.serializeType(unionType));\n }\n return {\n [deriveSymbol]: true,\n kind: 'union',\n optional,\n [$types]: types,\n };\n }\n if (this.checker.isArrayLikeType(type)) {\n const [argType] = this.checker.getTypeArguments(type as ts.TypeReference);\n if (!argType) {\n const typeName = type.symbol?.getName() || '<unknown>';\n console.warn(\n `Could not find generic type argument for array type ${typeName}`,\n );\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: ['any'],\n };\n }\n const typeSymbol = argType.getSymbol();\n if (!typeSymbol) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'array',\n [$types]: [this.serializeType(argType)],\n };\n }\n\n if (typeSymbol.valueDeclaration) {\n return {\n kind: 'array',\n [deriveSymbol]: true,\n [$types]: [this.serializeNode(typeSymbol.valueDeclaration)],\n };\n }\n const maybeDeclaration = typeSymbol.declarations?.[0];\n if (maybeDeclaration) {\n if (ts.isMappedTypeNode(maybeDeclaration)) {\n const resolvedType = this.checker\n .getPropertiesOfType(argType)\n .reduce<Record<string, unknown>>((acc, prop) => {\n const propType = this.checker.getTypeOfSymbol(prop);\n acc[prop.name] = this.serializeType(propType);\n return acc;\n }, {});\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: [resolvedType],\n };\n } else {\n return {\n kind: 'array',\n ...this.serializeNode(maybeDeclaration),\n };\n }\n }\n\n return {\n kind: 'array',\n optional: false,\n [deriveSymbol]: true,\n [$types]: ['any'],\n };\n }\n if (type.isClass()) {\n const declaration = type.symbol?.valueDeclaration;\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n if (isInterfaceType(type)) {\n const valueDeclaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!valueDeclaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(valueDeclaration);\n }\n if (type.flags & TypeFlags.Object) {\n if (defaults[symbolName(type.symbol)]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[type.symbol.name]],\n };\n }\n const properties = this.checker.getPropertiesOfType(type);\n if (properties.length > 0) {\n const serializedProps: Record<string, any> = {};\n for (const prop of properties) {\n const propAssingment = (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertyAssignment(it),\n );\n // get literal properties values if any\n if (propAssingment) {\n const type = this.checker.getTypeAtLocation(\n propAssingment.initializer,\n );\n serializedProps[prop.name] = this.serializeType(type);\n }\n if (\n (prop.getDeclarations() ?? []).find((it) =>\n ts.isPropertySignature(it),\n )\n ) {\n const propType = this.checker.getTypeOfSymbol(prop);\n serializedProps[prop.name] = this.serializeType(propType);\n }\n }\n return {\n [deriveSymbol]: true,\n kind: 'object',\n optional: false,\n [$types]: [serializedProps],\n };\n }\n const declaration =\n type.symbol.valueDeclaration ?? type.symbol.declarations?.[0];\n if (!declaration) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [type.symbol.getName()],\n };\n }\n return this.serializeNode(declaration);\n }\n console.warn(`Unhandled type: ${type.flags} ${ts.TypeFlags[type.flags]}`);\n\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [\n this.checker.typeToString(\n type,\n undefined,\n ts.TypeFormatFlags.NoTruncation,\n ),\n ],\n };\n }\n\n serializeNode(node: ts.Node): any {\n if (ts.isObjectLiteralExpression(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, any> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n\n // get literal properties values if any\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop)) {\n const type = this.checker.getTypeAtLocation(prop.initializer);\n props[prop.name.getText()] = this.serializeType(type);\n }\n }\n\n return props;\n }\n if (ts.isPropertyAccessExpression(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertySignature(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isPropertyDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n const type = this.checker.getTypeOfSymbol(symbol);\n return this.serializeType(type);\n }\n if (ts.isInterfaceDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Interface has no name');\n }\n if (defaults[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[node.name.text]],\n };\n }\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, any> = {};\n for (const member of node.members.filter(ts.isPropertySignature)) {\n members[member.name.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = members;\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n };\n }\n if (ts.isClassDeclaration(node)) {\n if (!node.name?.text) {\n throw new Error('Class has no name');\n }\n if (defaults[node.name.text]) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [defaults[node.name.text]],\n };\n }\n\n if (!this.collector[node.name.text]) {\n this.collector[node.name.text] = {};\n const members: Record<string, unknown> = {};\n for (const member of node.members.filter(ts.isPropertyDeclaration)) {\n members[member.name!.getText()] = this.serializeNode(member);\n }\n this.collector[node.name.text] = members;\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [`#/components/schemas/${node.name.text}`],\n $ref: `#/components/schemas/${node.name.text}`,\n };\n }\n if (ts.isVariableDeclaration(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.name);\n if (!symbol) {\n console.warn(`No symbol found for ${node.name.getText()}`);\n return null;\n }\n if (!node.type) {\n console.warn(`No type found for ${node.name.getText()}`);\n return 'any';\n }\n const type = this.checker.getTypeFromTypeNode(node.type);\n return this.serializeType(type);\n }\n if (ts.isIdentifier(node)) {\n const symbol = this.checker.getSymbolAtLocation(node);\n if (!symbol) {\n console.warn(`Identifer: No symbol found for ${node.getText()}`);\n return null;\n }\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAwaitExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isCallExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isAsExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n if (ts.isTypeLiteralNode(node)) {\n const symbolType = this.checker.getTypeAtLocation(node);\n const props: Record<string, unknown> = {};\n for (const symbol of symbolType.getProperties()) {\n const type = this.checker.getTypeOfSymbol(symbol);\n props[symbol.name] = this.serializeType(type);\n }\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: [props],\n };\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return {\n [deriveSymbol]: true,\n optional: true,\n [$types]: ['null'],\n };\n }\n if (node.kind === ts.SyntaxKind.BooleanKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: true,\n [$types]: ['boolean'],\n };\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return {\n [deriveSymbol]: true,\n optional: false,\n kind: 'literal',\n value: false,\n [$types]: ['boolean'],\n };\n }\n if (ts.isArrayLiteralExpression(node)) {\n const type = this.checker.getTypeAtLocation(node);\n return this.serializeType(type);\n }\n\n console.warn(`Unhandled node: ${ts.SyntaxKind[node.kind]} ${node.flags}`);\n return {\n [deriveSymbol]: true,\n optional: false,\n [$types]: ['any'],\n };\n }\n}\n\nfunction isInterfaceType(type: ts.Type): boolean {\n if (type.isClassOrInterface()) {\n // Check if it's an interface\n return !!(type.symbol.flags & ts.SymbolFlags.Interface);\n }\n return false;\n}\n", "import type { Dirent } from 'node:fs';\nimport { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport { dirname, extname, isAbsolute, join } from 'node:path';\n\nexport async function getFile(filePath: string) {\n if (await exist(filePath)) {\n return readFile(filePath, 'utf-8');\n }\n return null;\n}\n\nexport async function exist(file: string): Promise<boolean> {\n return stat(file)\n .then(() => true)\n .catch(() => false);\n}\n\nexport async function readFolder(path: string) {\n if (await exist(path)) {\n return readdir(path);\n }\n return [] as string[];\n}\n\nexport async function writeFiles(\n dir: string,\n contents: Record<\n string,\n null | string | { content: string; ignoreIfExists?: boolean }\n >,\n) {\n await Promise.all(\n Object.entries(contents).map(async ([file, content]) => {\n if (content === null) {\n return;\n }\n const filePath = isAbsolute(file) ? file : join(dir, file);\n await mkdir(dirname(filePath), { recursive: true });\n if (typeof content === 'string') {\n await writeFile(filePath, content, 'utf-8');\n } else {\n if (content.ignoreIfExists) {\n if (!(await exist(filePath))) {\n await writeFile(filePath, content.content, 'utf-8');\n }\n } else {\n await writeFile(filePath, content.content, 'utf-8');\n }\n }\n }),\n );\n}\n\nexport async function getFolderExports(\n folder: string,\n includeExtension = true,\n extensions = ['ts'],\n ignore: (dirent: Dirent) => boolean = () => false,\n) {\n const files = await readdir(folder, { withFileTypes: true });\n const exports: string[] = [];\n for (const file of files) {\n if (ignore(file)) {\n continue;\n }\n if (file.isDirectory()) {\n if (await exist(`${file.parentPath}/${file.name}/index.ts`)) {\n exports.push(\n `export * from './${file.name}/index${includeExtension ? '.ts' : ''}';`,\n );\n }\n } else if (\n file.name !== 'index.ts' &&\n extensions.includes(getExt(file.name))\n ) {\n exports.push(\n `export * from './${includeExtension ? file.name : file.name.replace(extname(file.name), '')}';`,\n );\n }\n }\n return exports.join('\\n');\n}\n\nexport async function getFolderExportsV2(\n folder: string,\n options: {\n includeExtension?: boolean;\n extensions: string;\n ignore?: (dirent: Dirent) => boolean;\n exportSyntax: string;\n } = {\n extensions: 'ts',\n ignore: () => false,\n includeExtension: true,\n exportSyntax: 'export * from ',\n },\n) {\n options.includeExtension ??= true;\n if (!(await exist(folder))) {\n return '';\n }\n const files = await readdir(folder, { withFileTypes: true });\n const exports: string[] = [];\n for (const file of files) {\n if (options.ignore?.(file)) {\n continue;\n }\n if (file.isDirectory()) {\n if (\n await exist(\n `${file.parentPath}/${file.name}/index.${options.extensions}`,\n )\n ) {\n exports.push(\n `${options.exportSyntax} './${file.name}/index${options.includeExtension ? `.${options.extensions}` : ''}';`,\n );\n }\n } else if (\n file.name !== `index.${options.extensions}` &&\n options.extensions.includes(getExt(file.name))\n ) {\n exports.push(\n `${options.exportSyntax} './${options.includeExtension ? file.name : file.name.replace(extname(file.name), '')}';`,\n );\n }\n }\n return exports.join('\\n');\n}\n\nexport const getExt = (fileName?: string) => {\n if (!fileName) {\n return ''; // shouldn't happen as there will always be a file name\n }\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) {\n return '';\n }\n const ext = fileName\n .slice(lastDot + 1)\n .split('/')\n .filter(Boolean)\n .join('');\n if (ext === fileName) {\n // files that have no extension\n return '';\n }\n return ext || 'txt';\n};\n", "import type {\n HeadersObject,\n OperationObject,\n ParameterObject,\n PathsObject,\n ResponseObject,\n ResponsesObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { $types } from './deriver.ts';\n\nexport type Method =\n | 'get'\n | 'post'\n | 'put'\n | 'patch'\n | 'delete'\n | 'trace'\n | 'head';\nexport const methods = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'trace',\n 'head',\n] as const;\nexport type SemanticSource =\n | 'query'\n | 'queries'\n | 'body'\n | 'params'\n | 'headers';\n\nconst semanticSourceToOpenAPI = {\n queries: 'query',\n query: 'query',\n headers: 'header',\n params: 'path',\n} as const;\nexport interface Selector {\n name: string;\n select: string;\n against: string;\n source: SemanticSource;\n nullable: boolean;\n required: boolean;\n}\n\nexport interface ResponseItem {\n statusCode: string;\n response?: DateType;\n contentType: string;\n headers: (string | Record<string, string[]>)[];\n}\n\nexport type OnOperation = (\n sourceFile: string,\n method: Method,\n path: string,\n operation: OperationObject,\n) => PathsObject;\nexport class Paths {\n #commonZodImport?: string;\n #onOperation?: OnOperation;\n #operations: Array<{\n sourceFile: string;\n name: string;\n path: string;\n method: Method;\n selectors: Selector[];\n responses: ResponsesObject;\n contentType?: string;\n tags?: string[];\n description?: string;\n }> = [];\n\n constructor(config: { commonZodImport?: string; onOperation?: OnOperation }) {\n this.#commonZodImport = config.commonZodImport;\n this.#onOperation = config.onOperation;\n }\n\n addPath(\n name: string,\n path: string,\n method: Method,\n contentType: string | undefined,\n selectors: Selector[],\n responses: ResponseItem[],\n sourceFile: string,\n tags?: string[],\n description?: string,\n ) {\n const responsesObject = this.#responseItemToResponses(responses);\n\n this.#operations.push({\n name,\n path: this.#tunePath(path),\n sourceFile,\n contentType: contentType,\n method,\n selectors,\n responses: responsesObject,\n tags,\n description,\n });\n return this;\n }\n\n #responseItemToResponses(responses: ResponseItem[]): ResponsesObject {\n const responsesObject: ResponsesObject = {};\n for (const item of responses) {\n const ct = item.contentType;\n const schema = item.response ? toSchema(item.response) : {};\n if (!responsesObject[item.statusCode]) {\n responsesObject[item.statusCode] = {\n description: `Response for ${item.statusCode}`,\n content:\n ct !== 'empty'\n ? {\n [ct]:\n ct === 'application/octet-stream'\n ? { schema: { type: 'string', format: 'binary' } }\n : { schema },\n }\n : undefined,\n headers: item.headers.length\n ? item.headers.reduce<HeadersObject>((acc, current) => {\n const headers =\n typeof current === 'string' ? { [current]: [] } : current;\n return Object.entries(headers).reduce<HeadersObject>(\n (subAcc, [key, value]) => {\n const header: HeadersObject = {\n [key]: {\n schema: {\n type: 'string',\n enum: value.length ? value : undefined,\n },\n },\n };\n return { ...subAcc, ...header };\n },\n acc,\n );\n }, {})\n : undefined,\n } satisfies ResponseObject;\n } else {\n if (!responsesObject[item.statusCode].content[ct]) {\n responsesObject[item.statusCode].content[ct] = { schema };\n } else {\n const existing = responsesObject[item.statusCode].content[ct]\n .schema as SchemaObject;\n if (existing.oneOf) {\n if (\n !existing.oneOf.find(\n (it) => JSON.stringify(it) === JSON.stringify(schema),\n )\n ) {\n existing.oneOf.push(schema);\n }\n } else if (JSON.stringify(existing) !== JSON.stringify(schema)) {\n responsesObject[item.statusCode].content[ct].schema = {\n oneOf: [existing, schema],\n };\n }\n }\n }\n }\n return responsesObject;\n }\n\n async #selectosToParameters(selectors: Selector[]) {\n const parameters: ParameterObject[] = [];\n const bodySchemaProps: Record<\n string,\n { required: boolean; schema: SchemaObject }\n > = {};\n for (const selector of selectors) {\n if (selector.source === 'body') {\n bodySchemaProps[selector.name] = {\n required: selector.required,\n schema: await evalZod(selector.against, this.#commonZodImport),\n };\n continue;\n }\n\n const parameter: ParameterObject = {\n in: semanticSourceToOpenAPI[selector.source],\n name: selector.name,\n required: selector.required,\n schema: await evalZod(selector.against, this.#commonZodImport),\n };\n parameters.push(parameter);\n }\n return { parameters, bodySchemaProps };\n }\n\n async getPaths() {\n const operations: PathsObject = {};\n for (const operation of this.#operations) {\n const { path, method, selectors } = operation;\n const { parameters, bodySchemaProps } =\n await this.#selectosToParameters(selectors);\n const bodySchema: Record<string, SchemaObject> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(bodySchemaProps)) {\n if (value.required) {\n required.push(key);\n }\n bodySchema[key] = value.schema;\n }\n const operationObject: OperationObject = {\n operationId: operation.name,\n parameters,\n tags: operation.tags,\n description: operation.description,\n requestBody: Object.keys(bodySchema).length\n ? {\n required: required.length ? true : false,\n content: {\n [operation.contentType || 'application/json']: {\n schema: {\n required: required.length ? required : undefined,\n type: 'object',\n properties: bodySchema,\n },\n },\n },\n }\n : undefined,\n responses:\n Object.keys(operation.responses).length === 0\n ? undefined\n : operation.responses,\n };\n if (!operations[path]) {\n operations[path] = {};\n }\n operations[path][method] = operationObject;\n if (this.#onOperation) {\n const paths = this.#onOperation?.(\n operation.sourceFile,\n method,\n path,\n operationObject,\n );\n Object.assign(operations, paths ?? {});\n }\n }\n return operations;\n }\n\n /**\n * Converts Express/Node.js style path parameters (/path/:param) to OpenAPI style (/path/{param})\n */\n #tunePath(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}');\n }\n}\n\nasync function evalZod(schema: string, commonZodImport?: string) {\n // https://github.com/nodejs/node/issues/51956\n const lines = [\n `import { createRequire } from \"node:module\";`,\n `const filename = \"${import.meta.url}\";`,\n `const require = createRequire(filename);`,\n `const z = require(\"zod\");`,\n commonZodImport ? `const commonZod = require('${commonZodImport}');` : '',\n `const {zodToJsonSchema} = require('zod-to-json-schema');`,\n `const schema = ${schema.replace('.optional()', '').replaceAll('instanceof(File)', 'string().base64()')};`,\n `const jsonSchema = zodToJsonSchema(schema, {\n $refStrategy: 'root',\n basePath: ['#', 'components', 'schemas'],\n target: 'jsonSchema7',\n base64Strategy: 'format:binary',\n });`,\n `export default jsonSchema;`,\n ];\n\n const base64 = Buffer.from(lines.join('\\n')).toString('base64');\n return import(`data:text/javascript;base64,${base64}`)\n .then((mod) => mod.default)\n .then(({ $schema, ...result }) => result);\n}\n\ninterface DateType {\n [$types]: any[];\n kind: string;\n optional: boolean;\n value?: string;\n}\n\nexport function toSchema(data: DateType | string | null | undefined): any {\n if (data === null || data === undefined) {\n return { type: 'any' };\n } else if (typeof data === 'string') {\n const isRef = data.startsWith('#');\n if (isRef) {\n return { $ref: data };\n }\n return { type: data };\n } else if (data.kind === 'literal') {\n return { enum: [data.value], type: data[$types][0] };\n } else if (data.kind === 'record') {\n return {\n type: 'object',\n additionalProperties: toSchema(data[$types][0]),\n };\n } else if (data.kind === 'array') {\n const items = data[$types].map(toSchema);\n return { type: 'array', items: data[$types].length ? items[0] : {} };\n } else if (data.kind === 'union') {\n return { anyOf: data[$types].map(toSchema) };\n } else if (data.kind === 'intersection') {\n return { allOf: data[$types].map(toSchema) };\n } else if ($types in data) {\n return data[$types].map(toSchema)[0] ?? {};\n } else {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(data)) {\n props[key] = toSchema(value as any);\n if (!(value as any).optional) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties: props,\n required,\n additionalProperties: false,\n };\n }\n}\n\nexport function isHttpMethod(name: string): name is Method {\n return ['get', 'post', 'put', 'delete', 'patch'].includes(name);\n}\n", "import debug from 'debug';\nimport { dirname, join } from 'node:path';\nimport ts from 'typescript';\n\nconst logger = debug('january:client');\n\nexport function parseTsConfig(tsconfigPath: string) {\n logger(`Using TypeScript version: ${ts.version}`);\n const configContent = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n\n if (configContent.error) {\n console.error(\n `Failed to read tsconfig file:`,\n ts.formatDiagnosticsWithColorAndContext([configContent.error], {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getNewLine: () => ts.sys.newLine,\n }),\n );\n throw new Error('Failed to parse tsconfig.json');\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configContent.config,\n ts.sys,\n dirname(tsconfigPath),\n );\n\n if (parsed.errors.length > 0) {\n console.error(\n `Errors found in tsconfig.json:`,\n ts.formatDiagnosticsWithColorAndContext(parsed.errors, {\n getCanonicalFileName: (path) => path,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getNewLine: () => ts.sys.newLine,\n }),\n );\n throw new Error('Failed to parse tsconfig.json');\n }\n return parsed;\n}\nexport function getProgram(tsconfigPath: string) {\n const tsConfigParseResult = parseTsConfig(tsconfigPath);\n logger(`Parsing tsconfig`);\n return ts.createProgram({\n options: {\n ...tsConfigParseResult.options,\n noEmit: true,\n incremental: true,\n tsBuildInfoFile: join(dirname(tsconfigPath), './.tsbuildinfo'), // not working atm\n },\n rootNames: tsConfigParseResult.fileNames,\n projectReferences: tsConfigParseResult.projectReferences,\n configFileParsingDiagnostics: tsConfigParseResult.errors,\n });\n}\nexport function getPropertyAssignment(node: ts.Node, name: string) {\n if (ts.isObjectLiteralExpression(node)) {\n return node.properties\n .filter((prop) => ts.isPropertyAssignment(prop))\n .find((prop) => prop.name!.getText() === name);\n }\n return undefined;\n}\nexport function isCallExpression(\n node: ts.Node,\n name: string,\n): node is ts.CallExpression {\n return (\n ts.isCallExpression(node) &&\n node.expression &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === name\n );\n}\n\nexport function isInterfaceType(type: ts.Type): boolean {\n if (type.isClassOrInterface()) {\n // Check if it's an interface\n return !!(type.symbol.flags & ts.SymbolFlags.Interface);\n }\n return false;\n}\n", "import { get } from 'lodash-es';\nimport type {\n OpenAPIObject,\n ParameterObject,\n ReferenceObject,\n RequestBodyObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nexport function isRef(obj: any): obj is ReferenceObject {\n return obj && '$ref' in obj;\n}\nexport function notRef(obj: any): obj is SchemaObject {\n return !isRef(obj);\n}\n\nexport function cleanRef(ref: string) {\n return ref.replace(/^#\\//, '');\n}\n\nexport function parseRef(ref: string) {\n const parts = ref.split('/');\n const [model] = parts.splice(-1);\n const [namespace] = parts.splice(-1);\n return {\n model,\n namespace,\n path: cleanRef(parts.join('/')),\n };\n}\nexport function followRef<\n T extends SchemaObject | ParameterObject | RequestBodyObject = SchemaObject,\n>(spec: OpenAPIObject, ref: string): T {\n const pathParts = cleanRef(ref).split('/');\n const entry = get(spec, pathParts) as T | ReferenceObject;\n if (entry && '$ref' in entry) {\n return followRef<T>(spec, entry.$ref);\n }\n return entry;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["type", "isRef", "dirname", "join", "ts", "isInterfaceType"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../../src/lib/deriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,YAAY,CAAC;AAEvD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,eAAO,MAAM,YAAY,eAA0B,CAAC;AACpD,eAAO,MAAM,MAAM,eAAsB,CAAC;AAU1C,qBAAa,WAAW;IACtB,SAAgB,SAAS,EAAE,SAAS,CAAM;IAC1C,SAAgB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;gBAC5B,OAAO,EAAE,EAAE,CAAC,WAAW;IAInC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;IA2QjC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;CA6LlC"}
1
+ {"version":3,"file":"deriver.d.ts","sourceRoot":"","sources":["../../src/lib/deriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,MAAM,YAAY,CAAC;AAEvD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,eAAO,MAAM,YAAY,eAA0B,CAAC;AACpD,eAAO,MAAM,MAAM,eAAsB,CAAC;AAU1C,qBAAa,WAAW;IACtB,SAAgB,SAAS,EAAE,SAAS,CAAM;IAC1C,SAAgB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;gBAC5B,OAAO,EAAE,EAAE,CAAC,WAAW;IAInC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;IAmRjC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG;CA6LlC"}
@@ -7,5 +7,11 @@ export declare function writeFiles(dir: string, contents: Record<string, null |
7
7
  ignoreIfExists?: boolean;
8
8
  }>): Promise<void>;
9
9
  export declare function getFolderExports(folder: string, includeExtension?: boolean, extensions?: string[], ignore?: (dirent: Dirent) => boolean): Promise<string>;
10
+ export declare function getFolderExportsV2(folder: string, options?: {
11
+ includeExtension?: boolean;
12
+ extensions: string;
13
+ ignore?: (dirent: Dirent) => boolean;
14
+ exportSyntax: string;
15
+ }): Promise<string>;
10
16
  export declare const getExt: (fileName?: string) => string;
11
17
  //# sourceMappingURL=file-system.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/lib/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,0BAK7C;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,qBAK5C;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,CACd,MAAM,EACN,IAAI,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,CAC9D,iBAsBF;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,gBAAgB,UAAO,EACvB,UAAU,WAAS,EACnB,MAAM,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAqB,mBAwBlD;AAED,eAAO,MAAM,MAAM,cAAe,MAAM,WAkBvC,CAAC"}
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/lib/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,0BAK7C;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,qBAK5C;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,CACd,MAAM,EACN,IAAI,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,CAC9D,iBAsBF;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,gBAAgB,UAAO,EACvB,UAAU,WAAS,EACnB,MAAM,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAqB,mBAwBlD;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CAMtB,mBAgCF;AAED,eAAO,MAAM,MAAM,GAAI,WAAW,MAAM,WAkBvC,CAAC"}
@@ -24,7 +24,7 @@ export declare class Paths {
24
24
  commonZodImport?: string;
25
25
  onOperation?: OnOperation;
26
26
  });
27
- addPath(name: string, path: string, method: Method, selectors: Selector[], responses: ResponseItem[], sourceFile: string, tags?: string[], description?: string): this;
27
+ addPath(name: string, path: string, method: Method, contentType: string | undefined, selectors: Selector[], responses: ResponseItem[], sourceFile: string, tags?: string[], description?: string): this;
28
28
  getPaths(): Promise<PathsObject>;
29
29
  }
30
30
  interface DateType {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,MAAM,GACd,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,CAAC;AACX,eAAO,MAAM,OAAO,qEAQV,CAAC;AACX,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAQd,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,KACvB,WAAW,CAAC;AACjB,qBAAa,KAAK;;gBAcJ,MAAM,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE;IAK3E,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,WAAW,CAAC,EAAE,MAAM;IA0GhB,QAAQ;CA4Df;AAwBD,UAAU,QAAQ;IAChB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAyCxE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,CAEzD"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEf,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,MAAM,GACd,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,CAAC;AACX,eAAO,MAAM,OAAO,qEAQV,CAAC;AACX,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAQd,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,KACvB,WAAW,CAAC;AACjB,qBAAa,KAAK;;gBAeJ,MAAM,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE;IAK3E,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,WAAW,CAAC,EAAE,MAAM;IA2GhB,QAAQ;CA6Df;AA2BD,UAAU,QAAQ;IAChB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAyCxE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,CAEzD"}
@@ -0,0 +1,11 @@
1
+ import type { OpenAPIObject, ParameterObject, ReferenceObject, RequestBodyObject, SchemaObject } from 'openapi3-ts/oas31';
2
+ export declare function isRef(obj: any): obj is ReferenceObject;
3
+ export declare function notRef(obj: any): obj is SchemaObject;
4
+ export declare function cleanRef(ref: string): string;
5
+ export declare function parseRef(ref: string): {
6
+ model: string;
7
+ namespace: string;
8
+ path: string;
9
+ };
10
+ export declare function followRef<T extends SchemaObject | ParameterObject | RequestBodyObject = SchemaObject>(spec: OpenAPIObject, ref: string): T;
11
+ //# sourceMappingURL=ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/lib/ref.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAEtD;AACD,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,YAAY,CAEpD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM;;;;EASnC;AACD,wBAAgB,SAAS,CACvB,CAAC,SAAS,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,YAAY,EAC3E,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAOrC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdk-it/core",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -22,13 +22,14 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "debug": "^4.4.0",
25
- "typescript": "^5.7.2",
26
- "stringcase": "^4.3.1"
25
+ "stringcase": "^4.3.1",
26
+ "lodash-es": "^4.17.21",
27
+ "zod-to-json-schema": "^3.24.3"
27
28
  },
28
29
  "peerDependencies": {
30
+ "typescript": "^5.8.3",
29
31
  "openapi3-ts": "^4.4.0",
30
- "zod": "^3.24.2",
31
- "zod-to-json-schema": "^3.24.3"
32
+ "zod": "^3.24.2"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/debug": "^4.1.12"
@@ -1,17 +0,0 @@
1
- import type { OpenAPIObject, OperationObject, ParameterObject, ReferenceObject } from 'openapi3-ts/oas31';
2
- export declare const defaults: Partial<GenerateSdkConfig> & Required<Pick<GenerateSdkConfig, 'operationId'>>;
3
- type TunedOperationObject = OperationObject & {
4
- operationId: string;
5
- parameters: (ParameterObject | ReferenceObject)[];
6
- };
7
- export declare function forEachOperation<T>(config: GenerateSdkConfig, callback: (entry: {
8
- name: string;
9
- method: string;
10
- path: string;
11
- }, operation: TunedOperationObject) => T): T[];
12
- export interface GenerateSdkConfig {
13
- spec: OpenAPIObject;
14
- operationId?: (operation: OperationObject, path: string, method: string) => string;
15
- }
16
- export {};
17
- //# sourceMappingURL=operation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/lib/operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAG3B,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAYhD,CAAC;AAEF,KAAK,oBAAoB,GAAG,eAAe,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,eAAe,GAAG,eAAe,CAAC,EAAE,CAAC;CACnD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,CACR,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrD,SAAS,EAAE,oBAAoB,KAC5B,CAAC,OAyBP;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;CACb"}