@sdk-it/dart 0.19.1 → 0.20.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.js CHANGED
@@ -7,15 +7,14 @@ import { join } from "node:path";
7
7
  import { camelcase as camelcase3 } from "stringcase";
8
8
  import yaml from "yaml";
9
9
  import {
10
- followRef as followRef2,
11
- getFolderExportsV2,
10
+ followRef as followRef3,
12
11
  isEmpty as isEmpty2,
13
- isRef as isRef2,
12
+ isRef as isRef3,
14
13
  notRef as notRef2,
15
14
  pascalcase as pascalcase2,
16
- snakecase as snakecase2,
17
- writeFiles
15
+ snakecase as snakecase2
18
16
  } from "@sdk-it/core";
17
+ import { getFolderExportsV2, writeFiles } from "@sdk-it/core/file-system.js";
19
18
 
20
19
  // packages/spec/dist/lib/loaders/local-loader.js
21
20
  import { parse } from "yaml";
@@ -25,6 +24,7 @@ import { parse as parse2 } from "yaml";
25
24
 
26
25
  // packages/spec/dist/lib/operation.js
27
26
  import { camelcase } from "stringcase";
27
+ import { followRef, isRef } from "@sdk-it/core";
28
28
  var defaults = {
29
29
  operationId: (operation, path, method) => {
30
30
  if (operation.operationId) {
@@ -39,9 +39,18 @@ var defaults = {
39
39
  );
40
40
  },
41
41
  tag: (operation, path) => {
42
- return operation.tags?.[0] || determineGenericTag(path, operation);
42
+ return operation.tags?.[0] ? sanitizeTag(operation.tags?.[0]) : determineGenericTag(path, operation);
43
43
  }
44
44
  };
45
+ function resolveResponses(spec, operation) {
46
+ const responses = operation.responses ?? {};
47
+ const resolved = {};
48
+ for (const status in responses) {
49
+ const response = isRef(responses[status]) ? followRef(spec, responses[status].$ref) : responses[status];
50
+ resolved[status] = response;
51
+ }
52
+ return resolved;
53
+ }
45
54
  function forEachOperation(config, callback) {
46
55
  const result = [];
47
56
  for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {
@@ -65,7 +74,8 @@ function forEachOperation(config, callback) {
65
74
  {
66
75
  ...operation,
67
76
  parameters: [...parameters, ...operation.parameters ?? []],
68
- operationId: operationName
77
+ operationId: operationName,
78
+ responses: resolveResponses(config.spec, operation)
69
79
  }
70
80
  )
71
81
  );
@@ -74,15 +84,11 @@ function forEachOperation(config, callback) {
74
84
  return result;
75
85
  }
76
86
  var reservedKeywords = /* @__PURE__ */ new Set([
77
- "abstract",
78
- "arguments",
79
87
  "await",
80
- "boolean",
88
+ // Reserved in async functions
81
89
  "break",
82
- "byte",
83
90
  "case",
84
91
  "catch",
85
- "char",
86
92
  "class",
87
93
  "const",
88
94
  "continue",
@@ -90,85 +96,59 @@ var reservedKeywords = /* @__PURE__ */ new Set([
90
96
  "default",
91
97
  "delete",
92
98
  "do",
93
- "double",
94
99
  "else",
95
100
  "enum",
96
- "eval",
97
101
  "export",
98
102
  "extends",
99
103
  "false",
100
- "final",
101
104
  "finally",
102
- "float",
103
105
  "for",
104
106
  "function",
105
- "goto",
106
107
  "if",
107
108
  "implements",
109
+ // Strict mode
108
110
  "import",
109
111
  "in",
110
112
  "instanceof",
111
- "int",
112
113
  "interface",
114
+ // Strict mode
113
115
  "let",
114
- "long",
115
- "native",
116
+ // Strict mode
116
117
  "new",
117
118
  "null",
118
119
  "package",
120
+ // Strict mode
119
121
  "private",
122
+ // Strict mode
120
123
  "protected",
124
+ // Strict mode
121
125
  "public",
126
+ // Strict mode
122
127
  "return",
123
- "short",
124
128
  "static",
129
+ // Strict mode
125
130
  "super",
126
131
  "switch",
127
- "synchronized",
128
132
  "this",
129
133
  "throw",
130
- "throws",
131
- "transient",
132
134
  "true",
133
135
  "try",
134
136
  "typeof",
135
137
  "var",
136
138
  "void",
137
- "volatile",
138
139
  "while",
139
140
  "with",
140
141
  "yield",
141
- // Potentially problematic identifiers / Common Verbs used as tags
142
- "object",
143
- "string",
144
- "number",
145
- "any",
146
- "unknown",
147
- "never",
148
- "get",
149
- "list",
150
- "create",
151
- "update",
152
- "delete",
153
- "post",
154
- "put",
155
- "patch",
156
- "do",
157
- "send",
158
- "add",
159
- "remove",
160
- "set",
161
- "find",
162
- "search",
163
- "check",
164
- "make"
165
- // Added make, check
142
+ // Strict mode / Generator functions
143
+ // 'arguments' is not technically a reserved word, but it's a special identifier within functions
144
+ // and assigning to it or declaring it can cause issues or unexpected behavior.
145
+ "arguments"
166
146
  ]);
167
147
  function sanitizeTag(camelCasedTag) {
168
148
  if (/^\d/.test(camelCasedTag)) {
169
149
  return `_${camelCasedTag}`;
170
150
  }
171
- return reservedKeywords.has(camelCasedTag) ? `${camelCasedTag}_` : camelCasedTag;
151
+ return reservedKeywords.has(camelcase(camelCasedTag)) ? `${camelCasedTag}_` : camelCasedTag;
172
152
  }
173
153
  function determineGenericTag(pathString, operation) {
174
154
  const operationId = operation.operationId || "";
@@ -192,7 +172,6 @@ function determineGenericTag(pathString, operation) {
192
172
  "search",
193
173
  "check",
194
174
  "make"
195
- // Added make
196
175
  ]);
197
176
  const segments = pathString.split("/").filter(Boolean);
198
177
  const potentialCandidates = segments.filter(
@@ -315,9 +294,9 @@ import assert from "node:assert";
315
294
  import { camelcase as camelcase2, snakecase } from "stringcase";
316
295
  import {
317
296
  cleanRef,
318
- followRef,
297
+ followRef as followRef2,
319
298
  isEmpty,
320
- isRef,
299
+ isRef as isRef2,
321
300
  notRef,
322
301
  parseRef,
323
302
  pascalcase
@@ -365,7 +344,7 @@ var DartSerializer = class {
365
344
  this.#spec.components.schemas ??= {};
366
345
  this.#spec.components.responses ??= {};
367
346
  const checkSchema = (schema) => {
368
- if (isRef(schema)) {
347
+ if (isRef2(schema)) {
369
348
  const { model } = parseRef(schema.$ref);
370
349
  return model === schemaName;
371
350
  }
@@ -571,7 +550,7 @@ return ${matches.join(" && ")};
571
550
  const schemaName = cleanRef($ref).split("/").pop();
572
551
  const serialized = this.handle(
573
552
  schemaName,
574
- followRef(this.#spec, $ref),
553
+ followRef2(this.#spec, $ref),
575
554
  required,
576
555
  {
577
556
  ...context,
@@ -584,7 +563,7 @@ return ${matches.join(" && ")};
584
563
  // fixme: this method should no longer be needed because the logic in it is being preprocessed before emitting begins
585
564
  #allOf(className, schemas, context) {
586
565
  const name = pascalcase(context.propName || className);
587
- const refs = schemas.filter(isRef);
566
+ const refs = schemas.filter(isRef2);
588
567
  const nonRefs = schemas.filter(notRef);
589
568
  if (nonRefs.some((it) => it.type && it.type !== "object")) {
590
569
  assert(false, `allOf ${name} must be an object`);
@@ -592,7 +571,7 @@ return ${matches.join(" && ")};
592
571
  const objectSchema = merge(
593
572
  {},
594
573
  ...nonRefs,
595
- ...refs.map((ref) => followRef(this.#spec, ref.$ref))
574
+ ...refs.map((ref) => followRef2(this.#spec, ref.$ref))
596
575
  );
597
576
  delete objectSchema.allOf;
598
577
  return this.handle(name, objectSchema, true, context);
@@ -608,8 +587,8 @@ return ${matches.join(" && ")};
608
587
  };
609
588
  }
610
589
  const nullSchemaIndex = schemas.findIndex((schema) => {
611
- if (isRef(schema)) {
612
- const refSchema = followRef(this.#spec, schema.$ref);
590
+ if (isRef2(schema)) {
591
+ const refSchema = followRef2(this.#spec, schema.$ref);
613
592
  return refSchema.type === "null";
614
593
  }
615
594
  return schema.type === "null";
@@ -649,7 +628,7 @@ return ${matches.join(" && ")};
649
628
  const patterns = [];
650
629
  const objects = schemas.filter(notRef).filter((it) => it.type === "object");
651
630
  for (const schema of schemas) {
652
- if (isRef(schema)) {
631
+ if (isRef2(schema)) {
653
632
  const refType = this.#ref(className, schema.$ref, true, context);
654
633
  patterns.push({
655
634
  pattern: `case ${refType.type || "Map<String, dynamic>"} map when ${refType.use}.matches(map): return ${refType.use}.fromJson(map);`,
@@ -900,7 +879,7 @@ return false;
900
879
  };
901
880
  }
902
881
  #serialize(className, schema, required = true, context = {}) {
903
- if (isRef(schema)) {
882
+ if (isRef2(schema)) {
904
883
  return this.#ref(className, schema.$ref, required, context);
905
884
  }
906
885
  if (schema.allOf && Array.isArray(schema.allOf)) {
@@ -964,7 +943,7 @@ return false;
964
943
  }
965
944
  };
966
945
  function isObjectSchema(schema) {
967
- return !isRef(schema) && (schema.type === "object" || !!schema.properties);
946
+ return !isRef2(schema) && (schema.type === "object" || !!schema.properties);
968
947
  }
969
948
 
970
949
  // packages/dart/src/lib/http/dispatcher.txt
@@ -979,14 +958,14 @@ var responses_default = "sealed class ApiError {\n final String message;\n fin
979
958
  // packages/dart/src/lib/generate.ts
980
959
  function tuneSpec(spec, schemas, refs) {
981
960
  for (const [name, schema] of Object.entries(schemas)) {
982
- if (isRef2(schema))
961
+ if (isRef3(schema))
983
962
  continue;
984
963
  if (!isEmpty2(schema.anyOf) && !isEmpty2(schema.oneOf)) {
985
964
  delete schema.anyOf;
986
965
  }
987
966
  if (!isEmpty2(schema.allOf)) {
988
967
  const schemas2 = schema.allOf;
989
- const refs2 = schemas2.filter(isRef2);
968
+ const refs2 = schemas2.filter(isRef3);
990
969
  const nonRefs = schemas2.filter(notRef2);
991
970
  if (nonRefs.some((it) => it.type && it.type !== "object")) {
992
971
  assert2(false, `allOf ${name} must be an object`);
@@ -994,7 +973,7 @@ function tuneSpec(spec, schemas, refs) {
994
973
  const objectSchema = merge2(
995
974
  {},
996
975
  ...nonRefs,
997
- ...refs2.map((ref) => followRef2(spec, ref.$ref))
976
+ ...refs2.map((ref) => followRef3(spec, ref.$ref))
998
977
  );
999
978
  delete objectSchema.allOf;
1000
979
  delete schema.allOf;
@@ -1004,7 +983,7 @@ function tuneSpec(spec, schemas, refs) {
1004
983
  if (!isEmpty2(schema.oneOf)) {
1005
984
  for (const oneOfIdx in schema.oneOf) {
1006
985
  const oneOf = schema.oneOf[oneOfIdx];
1007
- if (isRef2(oneOf))
986
+ if (isRef3(oneOf))
1008
987
  continue;
1009
988
  if (!isEmpty2(oneOf.required) && schema.properties) {
1010
989
  schema.oneOf[oneOfIdx] = schema.properties[oneOf.required[0]];
@@ -1016,7 +995,7 @@ function tuneSpec(spec, schemas, refs) {
1016
995
  }
1017
996
  schema.properties ??= {};
1018
997
  for (const [propName, value] of Object.entries(schema.properties)) {
1019
- if (isRef2(value))
998
+ if (isRef3(value))
1020
999
  continue;
1021
1000
  const refName = pascalcase2(`${name} ${propName.replace("[]", "")}`);
1022
1001
  refs.push({ name: refName, value });
@@ -1031,7 +1010,7 @@ function tuneSpec(spec, schemas, refs) {
1031
1010
  tuneSpec(spec, props, refs);
1032
1011
  }
1033
1012
  } else if (schema.type === "array") {
1034
- if (isRef2(schema.items))
1013
+ if (isRef3(schema.items))
1035
1014
  continue;
1036
1015
  const refName = name;
1037
1016
  refs.push({ name: refName, value: schema.items ?? {} });
@@ -1056,15 +1035,16 @@ async function generate(spec, settings) {
1056
1035
  for (const status in operation.responses) {
1057
1036
  if (!isSuccessStatusCode(status))
1058
1037
  continue;
1059
- const response2 = isRef2(operation.responses[status]) ? followRef2(spec, operation.responses[status].$ref) : operation.responses[status];
1038
+ const response2 = operation.responses[status];
1060
1039
  if (!isEmpty2(response2.content)) {
1061
1040
  for (const [contentType, mediaType] of Object.entries(
1062
1041
  response2.content
1063
1042
  )) {
1064
1043
  if (parseJsonContentType(contentType)) {
1065
- if (mediaType.schema && !isRef2(mediaType.schema)) {
1044
+ if (mediaType.schema && !isRef3(mediaType.schema)) {
1066
1045
  const outputName = pascalcase2(`${operation.operationId} output`);
1067
1046
  spec.components.schemas[outputName] = mediaType.schema;
1047
+ operation.responses[status].content ??= {};
1068
1048
  operation.responses[status].content[contentType].schema = {
1069
1049
  $ref: `#/components/schemas/${outputName}`
1070
1050
  };
@@ -1232,9 +1212,9 @@ function toInputs(spec, { entry, operation }) {
1232
1212
  let contentType = "empty";
1233
1213
  let encode = "";
1234
1214
  if (!isEmpty2(operation.requestBody)) {
1235
- const requestBody = isRef2(operation.requestBody) ? followRef2(spec, operation.requestBody.$ref) : operation.requestBody;
1215
+ const requestBody = isRef3(operation.requestBody) ? followRef3(spec, operation.requestBody.$ref) : operation.requestBody;
1236
1216
  for (const type in requestBody.content) {
1237
- const ctSchema = isRef2(requestBody.content[type].schema) ? followRef2(spec, requestBody.content[type].schema.$ref) : requestBody.content[type].schema;
1217
+ const ctSchema = isRef3(requestBody.content[type].schema) ? followRef3(spec, requestBody.content[type].schema.$ref) : requestBody.content[type].schema;
1238
1218
  if (!ctSchema) {
1239
1219
  console.warn(
1240
1220
  `Schema not found for ${type} in ${entry.method} ${entry.path}`
@@ -1265,7 +1245,7 @@ function toOutput(spec, operation) {
1265
1245
  operation.responses ??= {};
1266
1246
  const outputs = {};
1267
1247
  for (const status in operation.responses) {
1268
- const response = isRef2(operation.responses[status]) ? followRef2(spec, operation.responses[status].$ref) : operation.responses[status];
1248
+ const response = isRef3(operation.responses[status]) ? followRef3(spec, operation.responses[status].$ref) : operation.responses[status];
1269
1249
  for (const type in response.content) {
1270
1250
  const { schema } = response.content[type];
1271
1251
  if (!schema) {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/generate.ts", "../../spec/src/lib/loaders/local-loader.ts", "../../spec/src/lib/loaders/remote-loader.ts", "../../spec/src/lib/operation.ts", "../src/lib/dart-emitter.ts", "../src/lib/http/dispatcher.txt", "../src/lib/http/interceptors.txt", "../src/lib/http/responses.txt"],
4
- "sourcesContent": ["import { parse as partContentType } from 'fast-content-type-parse';\nimport { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n OpenAPIObject,\n OperationObject,\n ParameterObject,\n ReferenceObject,\n RequestBodyObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\nimport yaml from 'yaml';\n\nimport {\n followRef,\n getFolderExportsV2,\n isEmpty,\n isRef,\n notRef,\n pascalcase,\n snakecase,\n writeFiles,\n} from '@sdk-it/core';\nimport {\n type Operation,\n forEachOperation,\n isStreamingContentType,\n isSuccessStatusCode,\n parseJsonContentType,\n} from '@sdk-it/spec';\n\nimport { DartSerializer, isObjectSchema } from './dart-emitter.ts';\nimport dispatcherTxt from './http/dispatcher.txt';\nimport interceptorsTxt from './http/interceptors.txt';\nimport responsesTxt from './http/responses.txt';\n\nfunction tuneSpec(\n spec: OpenAPIObject,\n schemas: Record<string, SchemaObject | ReferenceObject>,\n refs: { name: string; value: SchemaObject }[],\n) {\n for (const [name, schema] of Object.entries(schemas)) {\n if (isRef(schema)) continue;\n\n if (!isEmpty(schema.anyOf) && !isEmpty(schema.oneOf)) {\n delete schema.anyOf;\n }\n if (!isEmpty(schema.allOf)) {\n const schemas = schema.allOf;\n const refs = schemas.filter(isRef);\n const nonRefs = schemas.filter(notRef);\n if (nonRefs.some((it) => it.type && it.type !== 'object')) {\n assert(false, `allOf ${name} must be an object`);\n }\n const objectSchema = merge(\n {},\n ...nonRefs,\n ...refs.map((ref) => followRef(spec, ref.$ref)),\n );\n delete objectSchema.allOf;\n delete schema.allOf;\n Object.assign(schema, objectSchema);\n }\n\n if (schema.type === 'object') {\n if (!isEmpty(schema.oneOf)) {\n for (const oneOfIdx in schema.oneOf) {\n const oneOf = schema.oneOf[oneOfIdx];\n if (isRef(oneOf)) continue;\n if (!isEmpty(oneOf.required) && schema.properties) {\n schema.oneOf[oneOfIdx] = schema.properties[oneOf.required[0]];\n }\n }\n\n delete schema.type;\n tuneSpec(spec, schemas, refs);\n continue;\n }\n\n schema.properties ??= {};\n\n for (const [propName, value] of Object.entries(schema.properties)) {\n if (isRef(value)) continue;\n const refName = pascalcase(`${name} ${propName.replace('[]', '')}`);\n refs.push({ name: refName, value });\n schema.properties[propName] = {\n $ref: `#/components/schemas/${refName}`,\n };\n const props = Object.fromEntries(\n Object.entries(value.properties ?? {}).map(([key, value]) => {\n return [pascalcase(`${refName} ${key}`), value];\n }),\n );\n tuneSpec(spec, props, refs);\n // if (value.oneOf && Array.isArray(value.oneOf) && value.oneOf.length) {\n // for (const oneOfIdx in value.oneOf) {\n // const oneOf = value.oneOf[oneOfIdx];\n // if (isRef(oneOf)) continue;\n // if (oneOf.type === 'string') {\n // console.log(refName);\n // // const refName= pascalcase(`${name} ${key} ${oneOfIdx}`);\n // // schema.oneOf[oneOfIdx] = {\n // // $ref: `#/components/schemas/${refName}`,\n // // };\n // }\n // }\n // }\n }\n } else if (schema.type === 'array') {\n if (isRef(schema.items)) continue;\n const refName = name;\n refs.push({ name: refName, value: schema.items ?? {} });\n schema.items = {\n $ref: `#/components/schemas/${refName}`,\n };\n }\n }\n}\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: { output: string }) => void | Promise<void>;\n },\n) {\n const clientName = settings.name || 'Client';\n const output = join(settings.output, 'lib');\n const groups: Record<\n string,\n {\n use: string;\n methods: string[];\n }\n > = {};\n spec.components ??= {};\n spec.components.schemas ??= {};\n const inputs: Record<string, string> = {};\n const outputs: Record<string, string> = {};\n forEachOperation({ spec }, (entry, operation) => {\n // if (entry.path !== '/v6/prepareUpload') {\n // return;\n // }\n operation.responses ??= {};\n spec.components ??= {};\n spec.components.schemas ??= {};\n for (const status in operation.responses) {\n if (!isSuccessStatusCode(status)) continue;\n const response = isRef(operation.responses[status] as ReferenceObject)\n ? followRef<ResponseObject>(spec, operation.responses[status].$ref)\n : (operation.responses[status] as ResponseObject);\n if (!isEmpty(response.content)) {\n for (const [contentType, mediaType] of Object.entries(\n response.content,\n )) {\n if (parseJsonContentType(contentType)) {\n if (mediaType.schema && !isRef(mediaType.schema)) {\n const outputName = pascalcase(`${operation.operationId} output`);\n spec.components.schemas[outputName] = mediaType.schema;\n operation.responses[status].content[contentType].schema = {\n $ref: `#/components/schemas/${outputName}`,\n };\n }\n }\n // handle chunked response\n }\n }\n }\n console.log(`Processing ${entry.method} ${entry.path}`);\n const group =\n groups[entry.groupName] ??\n (groups[entry.groupName] = {\n methods: [],\n use: `final ${entry.groupName} = new ${pascalcase(entry.groupName)}();`,\n });\n\n const input = toInputs(spec, { entry, operation });\n Object.assign(inputs, input.inputs);\n\n const response = toOutput(spec, operation);\n if (response) {\n Object.assign(outputs, response.outputs);\n }\n group.methods.push(`\n Future<${response ? response.returnType : 'http.StreamedResponse'}> ${camelcase(operation.operationId)}(\n ${isEmpty(operation.requestBody) ? '' : `${input.inputName} input`}\n ) async {\n final stream = await this.dispatcher.${input.contentType}(RequestConfig(\n method: '${entry.method}',\n url: Uri.parse('${entry.path}'),\n headers: {},\n ), ${['json', 'multipart'].includes(input.contentType) ? input.encode : ``});\n ${response ? `${response.decode};` : 'return stream;'}\n }\n `);\n });\n\n const newRefs: { name: string; value: SchemaObject }[] = [];\n tuneSpec(spec, spec.components.schemas, newRefs);\n for (const ref of newRefs) {\n spec.components.schemas[ref.name] = ref.value;\n }\n await writeFile(\n join(process.cwd(), 'openai.json'),\n JSON.stringify(spec, null, 2),\n );\n\n const models = Object.entries(spec.components.schemas).reduce<\n Record<string, string>\n >((acc, [name, schema]) => {\n const serializer = new DartSerializer(spec, (name, content) => {\n acc[`models/${snakecase(name)}.dart`] =\n `import 'dart:io';import 'dart:typed_data'; import './index.dart';\\n\\n${content}`;\n });\n serializer.handle(pascalcase(name), schema);\n return acc;\n }, {});\n\n const clazzez = Object.entries(groups).reduce<Record<string, string>>(\n (acc, [name, { methods }]) => {\n return {\n ...acc,\n [`api/${snakecase(name)}.dart`]: `\nimport 'dart:convert';\n\nimport 'package:http/http.dart' as http;\n\nimport '../interceptors.dart';\nimport '../inputs/index.dart';\nimport '../outputs/index.dart';\nimport '../models/index.dart';\nimport '../http.dart';\n\n class ${pascalcase(name)}Client {\n final Dispatcher dispatcher;\n final Receiver receiver;\n ${pascalcase(name)}Client(this.dispatcher, this.receiver);\n ${methods.join('\\n')}\n }\n `,\n };\n },\n {},\n );\n\n const client = `\n ${Object.keys(groups)\n .map((name) => `import './api/${snakecase(name)}.dart';`)\n .join('\\n')}\nimport './interceptors.dart';\nimport './http.dart';\n\n class ${clientName} {\n final Options options;\n${Object.keys(groups)\n .map((name) => `late final ${pascalcase(name)}Client ${camelcase(name)};`)\n .join('\\n')}\n\n ${clientName}(this.options) {\n final interceptors = [BaseUrlInterceptor(() => this.options.baseUrl)];\n final dispatcher = Dispatcher(interceptors);\n final receiver = Receiver(interceptors);\n ${Object.keys(groups)\n .map(\n (name) =>\n `this.${camelcase(name)} = ${pascalcase(name)}Client(dispatcher, receiver);`,\n )\n .join('\\n')}\n\n }\n\n void setOptions({String? baseUrl}) {\n if (baseUrl != null) {\n options.baseUrl = baseUrl;\n }\n }\n }\n\n\nclass Options {\n String baseUrl;\n Options({required this.baseUrl});\n}\n\n `;\n await writeFiles(output, {\n ...models,\n ...inputs,\n ...outputs,\n });\n\n await writeFiles(output, {\n 'models/index.dart': await getFolderExportsV2(join(output, 'models'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'inputs/index.dart': await getFolderExportsV2(join(output, 'inputs'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'outputs/index.dart': await getFolderExportsV2(join(output, 'outputs'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'interceptors.dart': interceptorsTxt,\n 'http.dart': dispatcherTxt,\n 'responses.dart': responsesTxt,\n ...clazzez,\n });\n await writeFiles(output, {\n 'package.dart': `${await getFolderExportsV2(join(output), {\n exportSyntax: 'export',\n extensions: 'dart',\n ignore(dirent) {\n return dirent.isFile() && dirent.name === 'package.dart';\n },\n })}${client}`,\n });\n\n await writeFiles(settings.output, {\n 'pubspec.yaml': {\n ignoreIfExists: true,\n content: yaml.stringify({\n name: settings.name\n ? `${snakecase(clientName.toLowerCase())}_sdk`\n : 'sdk',\n version: '0.0.1',\n environment: {\n sdk: '^3.7.2',\n },\n dependencies: {\n http: '^1.3.0',\n mime: '^2.0.0',\n },\n }),\n },\n });\n\n await settings.formatCode?.({\n output: output,\n });\n}\n\n// function makeRequestBody(spec: OpenAPIObject, operation: OperationObject) {\n// const requestBody = operation.requestBody;\n// const params = (operation.parameters ?? []).map((it) =>\n// isRef(it) ? followRef<ParameterObject>(spec, it.$ref) : it,\n// );\n// if (!requestBody) return {\n\n// }\n// if (isRef(requestBody)) {\n// return followRef<RequestBodyObject>(operation, requestBody.$ref);\n// }\n// return requestBody;\n// }\n\nfunction toInputs(spec: OpenAPIObject, { entry, operation }: Operation) {\n const inputs: Record<string, unknown> = {};\n const inputName = pascalcase(`${operation.operationId} input`);\n let contentType = 'empty';\n let encode = '';\n\n if (!isEmpty(operation.requestBody)) {\n const requestBody = isRef(operation.requestBody)\n ? followRef<RequestBodyObject>(spec, operation.requestBody.$ref)\n : operation.requestBody;\n\n for (const type in requestBody.content) {\n const ctSchema = isRef(requestBody.content[type].schema)\n ? followRef(spec, requestBody.content[type].schema.$ref)\n : requestBody.content[type].schema;\n if (!ctSchema) {\n console.warn(\n `Schema not found for ${type} in ${entry.method} ${entry.path}`,\n );\n continue;\n }\n\n const serializer = new DartSerializer(spec, (name, content) => {\n inputs[join(`inputs/${name}.dart`)] =\n `import 'dart:io';import 'dart:typed_data';import '../models/index.dart'; import './index.dart';\\n\\n${content}`;\n });\n const serialized = serializer.handle(inputName, ctSchema, true, {\n alias: isObjectSchema(ctSchema) ? undefined : inputName,\n });\n encode = serialized.encode as string;\n const [mediaType, mediaSubType] = partContentType(type).type.split('/');\n if (mediaType === 'application') {\n contentType = parseJsonContentType(type) as string;\n } else {\n contentType = mediaType;\n }\n\n // const schema = merge({}, objectSchema, {\n // required: additionalProperties\n // .filter((p) => p.required)\n // .map((p) => p.name),\n // properties: additionalProperties.reduce<Record<string, unknown>>(\n // (acc, p) => ({\n // ...acc,\n // [p.name]: p.schema,\n // }),\n // {},\n // ),\n // });\n\n // Object.assign(inputs, bodyInputs(config, objectSchema));\n // schemas[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n }\n\n return { inputs, inputName, contentType, encode };\n}\n\nfunction toOutput(spec: OpenAPIObject, operation: OperationObject) {\n const outputName = pascalcase(`${operation.operationId} output`);\n operation.responses ??= {};\n const outputs: Record<string, string> = {};\n for (const status in operation.responses) {\n const response = isRef(operation.responses[status] as ReferenceObject)\n ? followRef<ResponseObject>(spec, operation.responses[status].$ref)\n : (operation.responses[status] as ResponseObject);\n for (const type in response.content) {\n const { schema } = response.content[type];\n if (!schema) {\n console.warn(\n `Schema not found for ${type} in ${operation.operationId}`,\n );\n continue;\n }\n const serializer = new DartSerializer(spec, (name, content) => {\n // outputs[join(`outputs/${name}.dart`)] =\n // `import 'dart:typed_data'; import '../models/index.dart'; \\n\\n${content}`;\n });\n if (isStreamingContentType(type)) {\n return {\n type: 'stream',\n outputName,\n outputs,\n decode: `return stream`,\n returnType: `http.StreamedResponse`,\n };\n }\n if (parseJsonContentType(type)) {\n const serialized = serializer.handle(outputName, schema, true, {\n // alias: outputName,\n noEmit: true,\n });\n return {\n type: 'json',\n outputName,\n outputs,\n decode: `final json = await this.receiver.json(stream); return ${serialized.fromJson}`,\n returnType: serialized.use,\n };\n }\n }\n }\n return null;\n}\n", "import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport { parse } from 'yaml';\n\nexport async function loadLocal(location: string) {\n const extName = extname(location);\n const text = await readFile(location, 'utf-8');\n switch (extName) {\n case '.json':\n return JSON.parse(text);\n case '.yaml':\n case '.yml':\n return parse(text);\n default:\n throw new Error(`Unsupported file extension: ${extName}`);\n }\n}\n", "import { extname } from 'node:path';\nimport { parse } from 'yaml';\n\nexport async function loadRemote<T>(location: string): Promise<T> {\n const extName = extname(location);\n const response = await fetch(location);\n switch (extName) {\n case '.json':\n return response.json() as Promise<T>;\n case '.yaml':\n case '.yml': {\n const text = await response.text();\n return parse(text);\n }\n default:\n try {\n // try to parse it as json first\n return response.json() as Promise<T>;\n } catch {\n // parse as yaml\n const text = await response.text();\n return parse(text) as Promise<T>;\n }\n }\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' | 'tag'>> = {\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return camelcase(operation.operationId);\n }\n const metadata = operation['x-oaiMeta'];\n if (metadata && metadata.name) {\n return camelcase(metadata.name);\n }\n return camelcase(\n [method, ...path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').split(' ')]\n .filter(Boolean)\n .join(' ')\n .trim(),\n );\n },\n tag: (operation, path) => {\n return operation.tags?.[0] || determineGenericTag(path, operation);\n },\n};\n\nexport type TunedOperationObject = OperationObject & {\n operationId: string;\n parameters: (ParameterObject | ReferenceObject)[];\n};\n\nexport interface OperationEntry {\n name?: string;\n method: string;\n path: string;\n groupName: string;\n tag: string;\n}\nexport type Operation = {\n entry: OperationEntry;\n operation: TunedOperationObject;\n};\n\nexport function forEachOperation<T>(\n config: GenerateSdkConfig,\n callback: (entry: OperationEntry, operation: TunedOperationObject) => T,\n) {\n const result: T[] = [];\n for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {\n const { parameters = [], ...methods } = pathItem;\n\n // Convert Express-style routes (:param) to OpenAPI-style routes ({param})\n const fixedPath = path.replace(/:([^/]+)/g, '{$1}');\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 formatTag = config.tag ?? defaults.tag;\n const operationName = formatOperationId(operation, fixedPath, method);\n const operationTag = formatTag(operation, fixedPath);\n const metadata = operation['x-oaiMeta'] ?? {};\n result.push(\n callback(\n {\n name: metadata.name,\n method,\n path: fixedPath,\n groupName: operationTag,\n tag: operationTag,\n },\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 tag?: (operation: OperationObject, path: string) => string;\n}\n\n// --- Function Definition (determineGenericTag, sanitizeTag, reservedKeywords, commonVerbs) ---\n/**\n * Set of reserved TypeScript keywords and common verbs potentially used as tags.\n */\nconst reservedKeywords = new Set([\n 'abstract',\n 'arguments',\n 'await',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n // Potentially problematic identifiers / Common Verbs used as tags\n 'object',\n 'string',\n 'number',\n 'any',\n 'unknown',\n 'never',\n 'get',\n 'list',\n 'create',\n 'update',\n 'delete',\n 'post',\n 'put',\n 'patch',\n 'do',\n 'send',\n 'add',\n 'remove',\n 'set',\n 'find',\n 'search',\n 'check',\n 'make', // Added make, check\n]);\n\n/**\n * Sanitizes a potential tag name (assumed to be already camelCased)\n * to avoid conflicts with reserved keywords or invalid starting characters (numbers).\n * Appends an underscore if the tag matches a reserved keyword.\n * Prepends an underscore if the tag starts with a number.\n * @param camelCasedTag The potential tag name, already camelCased.\n * @returns The sanitized tag name.\n */\nfunction sanitizeTag(camelCasedTag: string): string {\n // Prepend underscore if starts with a number\n if (/^\\d/.test(camelCasedTag)) {\n return `_${camelCasedTag}`;\n }\n // Append underscore if it's a reserved keyword\n return reservedKeywords.has(camelCasedTag)\n ? `${camelCasedTag}_`\n : camelCasedTag;\n}\n\n/**\n * Attempts to determine a generic tag for an OpenAPI operation based on path and operationId.\n * Rules and fallbacks are documented within the code.\n * @param pathString The path string.\n * @param operation The OpenAPI Operation Object.\n * @returns A sanitized, camelCased tag name string.\n */\nexport function determineGenericTag(\n pathString: string,\n operation: OperationObject,\n): string {\n const operationId = operation.operationId || '';\n const VERSION_REGEX = /^[vV]\\d+$/;\n const commonVerbs = new Set([\n // Verbs to potentially strip from operationId prefix\n 'get',\n 'list',\n 'create',\n 'update',\n 'delete',\n 'post',\n 'put',\n 'patch',\n 'do',\n 'send',\n 'add',\n 'remove',\n 'set',\n 'find',\n 'search',\n 'check',\n 'make', // Added make\n ]);\n\n const segments = pathString.split('/').filter(Boolean);\n\n const potentialCandidates = segments.filter(\n (segment) =>\n segment &&\n !segment.startsWith('{') &&\n !segment.endsWith('}') &&\n !VERSION_REGEX.test(segment),\n );\n\n // --- Heuristic 1: Last non-'@' path segment ---\n for (let i = potentialCandidates.length - 1; i >= 0; i--) {\n const segment = potentialCandidates[i];\n if (!segment.startsWith('@')) {\n // Sanitize just before returning\n return sanitizeTag(camelcase(segment));\n }\n }\n\n const canFallbackToPathSegment = potentialCandidates.length > 0;\n\n // --- Heuristic 2: OperationId parsing ---\n if (operationId) {\n const lowerOpId = operationId.toLowerCase();\n const parts = operationId\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-zA-Z])(\\d)/g, '$1_$2')\n .replace(/(\\d)([a-zA-Z])/g, '$1_$2')\n .toLowerCase()\n .split(/[_-\\s]+/);\n\n const validParts = parts.filter(Boolean);\n\n // Quick skip: If opId is just a verb and we can use Heuristic 3, prefer that.\n if (\n commonVerbs.has(lowerOpId) &&\n validParts.length === 1 &&\n canFallbackToPathSegment\n ) {\n // Proceed directly to Heuristic 3\n }\n // Only process if there are valid parts and the quick skip didn't happen\n else if (validParts.length > 0) {\n const firstPart = validParts[0];\n const isFirstPartVerb = commonVerbs.has(firstPart);\n\n // Case 2a: Starts with verb, has following parts\n if (isFirstPartVerb && validParts.length > 1) {\n const verbPrefixLength = firstPart.length;\n let nextPartStartIndex = -1;\n if (operationId.length > verbPrefixLength) {\n // Simplified check for next part start\n const charAfterPrefix = operationId[verbPrefixLength];\n if (charAfterPrefix >= 'A' && charAfterPrefix <= 'Z') {\n nextPartStartIndex = verbPrefixLength;\n } else if (charAfterPrefix >= '0' && charAfterPrefix <= '9') {\n nextPartStartIndex = verbPrefixLength;\n } else if (['_', '-'].includes(charAfterPrefix)) {\n nextPartStartIndex = verbPrefixLength + 1;\n } else {\n const match = operationId\n .substring(verbPrefixLength)\n .match(/[A-Z0-9]/);\n if (match && match.index !== undefined) {\n nextPartStartIndex = verbPrefixLength + match.index;\n }\n if (\n nextPartStartIndex === -1 &&\n operationId.length > verbPrefixLength\n ) {\n nextPartStartIndex = verbPrefixLength; // Default guess\n }\n }\n }\n\n if (\n nextPartStartIndex !== -1 &&\n nextPartStartIndex < operationId.length\n ) {\n const remainingOriginalSubstring =\n operationId.substring(nextPartStartIndex);\n const potentialTag = camelcase(remainingOriginalSubstring);\n if (potentialTag) {\n // Sanitize just before returning\n return sanitizeTag(potentialTag);\n }\n }\n\n // Fallback: join remaining lowercased parts\n const potentialTagJoined = camelcase(validParts.slice(1).join('_'));\n if (potentialTagJoined) {\n // Sanitize just before returning\n return sanitizeTag(potentialTagJoined);\n }\n }\n\n // Case 2b: Doesn't start with verb, or only one part (might be verb)\n const potentialTagFull = camelcase(operationId);\n if (potentialTagFull) {\n const isResultSingleVerb = validParts.length === 1 && isFirstPartVerb;\n\n // Avoid returning only a verb if Heuristic 3 is possible\n if (!(isResultSingleVerb && canFallbackToPathSegment)) {\n if (potentialTagFull.length > 0) {\n // Sanitize just before returning\n return sanitizeTag(potentialTagFull);\n }\n }\n }\n\n // Case 2c: Further fallbacks within OpId if above failed/skipped\n const firstPartCamel = camelcase(firstPart);\n if (firstPartCamel) {\n const isFirstPartCamelVerb = commonVerbs.has(firstPartCamel);\n if (\n !isFirstPartCamelVerb ||\n validParts.length === 1 ||\n !canFallbackToPathSegment\n ) {\n // Sanitize just before returning\n return sanitizeTag(firstPartCamel);\n }\n }\n if (\n isFirstPartVerb &&\n validParts.length > 1 &&\n validParts[1] &&\n canFallbackToPathSegment\n ) {\n const secondPartCamel = camelcase(validParts[1]);\n if (secondPartCamel) {\n // Sanitize just before returning\n return sanitizeTag(secondPartCamel);\n }\n }\n } // End if(validParts.length > 0) after quick skip check\n } // End if(operationId)\n\n // --- Heuristic 3: First path segment (stripping '@') ---\n if (potentialCandidates.length > 0) {\n let firstCandidate = potentialCandidates[0];\n if (firstCandidate.startsWith('@')) {\n firstCandidate = firstCandidate.substring(1);\n }\n if (firstCandidate) {\n // Sanitize just before returning\n return sanitizeTag(camelcase(firstCandidate));\n }\n }\n\n // --- Heuristic 4: Default ---\n console.warn(\n `Could not determine a suitable tag for path: ${pathString}, operationId: ${operationId}. Using 'unknown'.`,\n );\n return 'unknown'; // 'unknown' is safe\n}\n\nexport function parseJsonContentType(contentType: string | null | undefined) {\n if (!contentType) {\n return null;\n }\n\n // 1. Trim whitespace\n let mainType = contentType.trim();\n\n // 2. Remove parameters (anything after the first ';')\n const semicolonIndex = mainType.indexOf(';');\n if (semicolonIndex !== -1) {\n mainType = mainType.substring(0, semicolonIndex).trim(); // Trim potential space before ';'\n }\n\n // 3. Convert to lowercase for case-insensitive comparison\n mainType = mainType.toLowerCase();\n\n if (mainType.endsWith('/json')) {\n return mainType.split('/')[1];\n } else if (mainType.endsWith('+json')) {\n return mainType.split('+')[1];\n }\n return null;\n}\n\n/**\n * Checks if a given content type string represents Server-Sent Events (SSE).\n * Handles case-insensitivity, parameters (like charset), and leading/trailing whitespace.\n *\n * @param contentType The content type string to check (e.g., from a Content-Type header).\n * @returns True if the content type is 'text/event-stream', false otherwise.\n */\nexport function isSseContentType(\n contentType: string | null | undefined,\n): boolean {\n if (!contentType) {\n return false; // Handle null, undefined, or empty string\n }\n\n // 1. Trim whitespace from the input string\n let mainType = contentType.trim();\n\n // 2. Find the position of the first semicolon (if any) to remove parameters\n const semicolonIndex = mainType.indexOf(';');\n if (semicolonIndex !== -1) {\n // Extract the part before the semicolon and trim potential space\n mainType = mainType.substring(0, semicolonIndex).trim();\n }\n\n // 3. Convert the main type part to lowercase for case-insensitive comparison\n mainType = mainType.toLowerCase();\n\n // 4. Compare against the standard SSE MIME type\n return mainType === 'text/event-stream';\n}\n\nexport function isStreamingContentType(\n contentType: string | null | undefined,\n): boolean {\n return contentType === 'application/octet-stream';\n}\n\nexport function isSuccessStatusCode(statusCode: number | string): boolean {\n statusCode = Number(statusCode);\n return statusCode >= 200 && statusCode < 300;\n}\n", "import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, snakecase } from 'stringcase';\n\nimport {\n cleanRef,\n followRef,\n isEmpty,\n isRef,\n notRef,\n parseRef,\n pascalcase,\n} from '@sdk-it/core';\n\nconst formatName = (it: any): string => {\n const startsWithDigitPattern = /^-?\\d/;\n // 1. Handle numbers\n if (typeof it === 'number') {\n if (Math.sign(it) === -1) {\n return `$_${Math.abs(it)}`;\n }\n return `$${it}`;\n }\n\n // 2. Handle the specific string 'default'\n if (it === 'default') {\n return '$default';\n }\n\n // 3. Handle other strings\n if (typeof it === 'string') {\n // 3a. Check if the string starts with a digit FIRST\n if (startsWithDigitPattern.test(it)) {\n if (typeof it === 'number') {\n if (Math.sign(it) === -1) {\n return `$_${Math.abs(it)}`;\n }\n return `$${it}`;\n }\n }\n\n // 3b. If not starting with a digit, handle brackets and snake_case\n let nameToFormat = it;\n\n // Remove a single leading '[' if present\n if (nameToFormat.startsWith('[')) {\n nameToFormat = nameToFormat.slice(1);\n }\n\n // Remove a single trailing ']' if present\n if (nameToFormat.endsWith(']')) {\n nameToFormat = nameToFormat.slice(0, -1);\n }\n\n // Apply snakecase to the (potentially modified) string\n return snakecase(nameToFormat);\n }\n\n // 4. Fallback for any other types (e.g., null, undefined, objects)\n // Convert to string first, then apply snakecase\n return snakecase(String(it));\n};\n\ntype Context = Record<string, any>;\ntype Serialized = {\n nullable?: boolean;\n encode?: string;\n use: string;\n toJson: string;\n matches?: string;\n fromJson: string;\n type?: string;\n content: string;\n simple?: boolean;\n};\ntype Emit = (name: string, content: string) => void;\n/**\n * Convert an OpenAPI (JSON Schema style) object into Dart classes\n */\nexport class DartSerializer {\n #spec: OpenAPIObject;\n #emit: Emit;\n\n constructor(spec: OpenAPIObject, emit: Emit) {\n this.#spec = spec;\n this.#emit = emit;\n }\n\n #getRefUsage(schemaName: string, list: string[] = []): string[] {\n this.#spec.components ??= {};\n this.#spec.components.schemas ??= {};\n this.#spec.components.responses ??= {};\n\n const checkSchema = (schema: SchemaObject | ReferenceObject): boolean => {\n if (isRef(schema)) {\n const { model } = parseRef(schema.$ref);\n return model === schemaName;\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return (schema.oneOf as Array<SchemaObject | ReferenceObject>).some(\n (subSchema) => checkSchema(subSchema),\n );\n }\n if (\n schema.type === 'array' &&\n schema.items &&\n notRef(schema.items) &&\n schema.items.oneOf\n ) {\n return checkSchema(schema.items);\n }\n return false;\n };\n\n for (const [key, value] of Object.entries(this.#spec.components.schemas)) {\n if (checkSchema(value)) {\n list.push(key);\n }\n }\n\n return list;\n }\n\n #object(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n if (schema.additionalProperties) {\n this.#emit(className, `typedef ${className} = Map<String, dynamic>;`);\n return {\n content: '',\n use: 'Map<String, dynamic>',\n encode: 'input',\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${camelcase(context.name)}']`,\n matches: `json['${camelcase(context.name)}'] is Map<String, dynamic>`,\n };\n }\n if (isEmpty(schema.properties)) {\n if (context.noEmit !== true) {\n this.#emit(\n className,\n `class ${className} {\n const ${className}(); // Add const constructor\n\n factory ${className}.fromJson(Map<String, dynamic> json) {\n return const ${className}();\n }\n\n Map<String, dynamic> toJson() => {};\n\n /// Determines if a given map can be parsed into an instance of this class.\n /// Returns true for any map since this class has no properties.\n static bool matches(Map<String, dynamic> json) {\n return true; // Any map is fine for an empty object\n }\n}`,\n );\n }\n return {\n content: '',\n encode: 'input.toJson()',\n use: className,\n toJson: `${this.#safe(context.name as string, context.required)}`,\n fromJson: `${className}.fromJson(json['${context.name}'])`,\n matches: `${className}.matches(json['${context.name}'])`,\n };\n }\n\n const props: string[] = [];\n const toJsonProperties: string[] = [];\n const constructorParams: string[] = [];\n const fromJsonParams: string[] = [];\n const matches: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propName = key.replace('[]', '');\n const required = (schema.required ?? []).includes(key);\n const typeStr = this.handle(className, propSchema, required, {\n name: propName,\n required,\n propName: [className, propName].filter(Boolean).join('_'),\n });\n const nullable = typeStr.nullable || !required;\n const nullableSuffix = nullable ? '?' : '';\n props.push(\n `final ${typeStr.use}${nullableSuffix} ${camelcase(propName)};`,\n );\n fromJsonParams.push(`${camelcase(propName)}: ${typeStr.fromJson}`);\n toJsonProperties.push(`'${propName}': ${typeStr.toJson}`);\n constructorParams.push(\n `${required ? 'required ' : ''}this.${camelcase(propName)},`,\n );\n if (required) {\n matches.push(`(\n json.containsKey('${camelcase(propName)}')\n ? ${nullable ? `json['${propName}'] == null` : `json['${propName}'] != null`} ${typeStr.matches ? `&& ${typeStr.matches}` : ''}\n : false)`);\n } else {\n matches.push(`(\n json.containsKey('${camelcase(propName)}')\n ? ${nullable ? `json['${propName}'] == null` : `json['${propName}'] != null`} ${typeStr.matches ? `|| ${typeStr.matches}` : ''}\n : true)`);\n }\n }\n\n const { mixins, withMixins } = this.#mixinise(className, context);\n const content = `class ${className} ${withMixins} {\n ${props.join('\\n')}\n ${!mixins.length ? 'const' : ''} ${className}({\n ${constructorParams.join('\\n')}})${mixins.length > 1 ? '' : `:super()`};\n factory ${className}.fromJson(Map<String, dynamic> json) {\nreturn ${className}(\\n${fromJsonParams.join(',\\n')});\n }\n Map<String, dynamic> toJson() => {\n${toJsonProperties.join(',\\n')}\n };\n static bool matches(Map<String, dynamic> json) {\nreturn ${matches.join(' && ')};\n }\n }`;\n if (context.noEmit !== true) {\n this.#emit(className, content);\n }\n const nullable = !context.required || context.nullable === true;\n return {\n use: className,\n content,\n encode: 'input.toJson()',\n toJson: `${this.#safe(context.name, context.required)}`,\n fromJson: context.name\n ? `${context.forJson || className}.fromJson(json['${context.name}'])`\n : `${context.forJson || className}.fromJson(json)`,\n matches: `${className}.matches(json['${context.name}'])`,\n };\n }\n\n #safe(accces: string, required: boolean) {\n return required\n ? `this.${camelcase(accces)}.toJson()`\n : `this.${camelcase(accces)} != null ? this.${camelcase(accces)}!.toJson() : null`;\n }\n\n #array(\n className: string,\n schema: SchemaObject,\n required = false,\n context: Context,\n ): Serialized {\n if (!schema.items) {\n return {\n content: '',\n use: 'List<dynamic>',\n toJson: '',\n fromJson: `List<dynamic>.from(${context.name ? `json['${context.name}']` : `json`})})`,\n matches: '',\n };\n }\n const itemsType = this.handle(className, schema.items, true, context);\n const fromJson = required\n ? context.name\n ? `(json['${context.name}'] as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()`\n : `(json as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()`\n : context.name\n ? `json['${context.name}'] != null\n ? (json['${context.name}'] as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()\n : null`\n : `json != null\n ? (json as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()\n : null`;\n\n return {\n encode: `input.map((it) => ${itemsType.simple ? 'it' : `it.toJson()`}).toList()`,\n content: '',\n use: `List<${itemsType.use}>`,\n fromJson,\n toJson: `${context.required ? `this.${camelcase(context.name)}${itemsType.simple ? '' : '.map((it) => it.toJson()).toList()'}` : `this.${camelcase(context.name)}!= null? this.${camelcase(context.name)}${itemsType.simple ? '' : '!.map((it) => it.toJson()).toList()'} : null`}`,\n matches: `json['${camelcase(context.name)}'].every((it) => ${itemsType.matches})`,\n };\n }\n\n /**\n * Convert a basic type to Dart\n */\n #primitive(\n className: string,\n type: string,\n schema: SchemaObject,\n context: Record<string, unknown>,\n required = false,\n ): Serialized {\n switch (type) {\n case 'string':\n return this.#string(schema, context);\n case 'number':\n case 'integer':\n return this.number(schema, context);\n case 'boolean':\n return {\n content: '',\n use: 'bool',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is bool`,\n };\n case 'object':\n return this.#object(className, schema, context);\n case 'array':\n return this.#array(className, schema, required, context);\n case 'null':\n return {\n content: '',\n use: 'Null',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n default:\n // Unknown type -> fallback\n return {\n content: '',\n use: 'dynamic',\n nullable: false,\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n }\n\n #ref(\n className: string,\n $ref: string,\n required: boolean,\n context: Context,\n ): Serialized {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n const serialized = this.handle(\n schemaName,\n followRef<SchemaObject>(this.#spec, $ref),\n required,\n {\n ...context,\n propName: schemaName,\n noEmit: !!context.alias || !!className || !context.forceEmit,\n },\n );\n return serialized;\n }\n\n // fixme: this method should no longer be needed because the logic in it is being preprocessed before emitting begins\n #allOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Context,\n ): Serialized {\n const name = pascalcase(context.propName || className); // className in case is top level\n\n const refs = schemas.filter(isRef);\n const nonRefs = schemas.filter(notRef);\n if (nonRefs.some((it) => it.type && it.type !== 'object')) {\n assert(false, `allOf ${name} must be an object`);\n }\n const objectSchema = merge(\n {},\n ...nonRefs,\n ...refs.map((ref) => followRef(this.#spec, ref.$ref)),\n );\n delete objectSchema.allOf;\n return this.handle(name, objectSchema, true, context);\n }\n\n #anyOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Record<string, unknown>,\n ): Serialized {\n // fixme: handle\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n const nullSchemaIndex = schemas.findIndex((schema) => {\n if (isRef(schema)) {\n const refSchema = followRef(this.#spec, schema.$ref);\n return refSchema.type === 'null';\n }\n return schema.type === 'null';\n });\n const anyOfSchemas = schemas.slice(0);\n if (nullSchemaIndex >= 0) {\n anyOfSchemas.splice(nullSchemaIndex, 1); // remove null schema\n }\n\n return this.handle(className, anyOfSchemas[0], true, {\n ...context,\n nullable: nullSchemaIndex >= 0,\n });\n }\n\n #mixinise(name: string, context: Context) {\n const mixins = this.#getRefUsage(name);\n if (context.mixin) {\n mixins.unshift(context.mixin);\n }\n const withMixins =\n mixins.length > 1\n ? ` with ${mixins.join(', ')}`\n : mixins.length === 1\n ? `extends ${mixins[0]}`\n : '';\n return {\n withMixins,\n mixins,\n };\n }\n\n #oneOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Context,\n ): Serialized {\n const name = pascalcase(context.propName || className); // className in case is top level\n\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n const content: string[] = [];\n const patterns: { pattern: string; name: string }[] = [];\n // FIXME: if there is just one type then no need to add the discriminator\n const objects = schemas.filter(notRef).filter((it) => it.type === 'object');\n for (const schema of schemas) {\n if (isRef(schema)) {\n const refType = this.#ref(className, schema.$ref, true, context);\n patterns.push({\n pattern: `case ${refType.type || 'Map<String, dynamic>'} map when ${refType.use}.matches(map): return ${refType.use}.fromJson(map);`,\n name: refType.use,\n });\n } else if (schema.type === 'string') {\n // todo: make this into a schema with ref (preproccesing)\n content.push(`class ${name}Text with ${name} {\n final String value;\n ${name}Text(this.value);\n @override\n dynamic toJson() => value;\n static bool matches(dynamic value) {\n return value is String;\n }}\n `);\n patterns.push({\n pattern: `case String(): return ${name}Text(json);`,\n name: `${name}Text`,\n });\n } else if (schema.type === 'array') {\n // todo: make this into a schema with ref (preproccesing) with all varients types (integer, string)\n // todo: this can be abstracted so the varients somehow dynamic without having to replicate the same classes all the time\n const itemsType = this.handle(name, schema.items!, true, {\n ...context,\n noEmit: true,\n });\n content.push(`class ${name}List with ${name} {\n final List<${itemsType.use}> value;\n ${name}List(this.value);\n @override\n dynamic toJson() => value;\n static bool matches(dynamic value) {\n return value is List;\n }}`);\n patterns.push({\n pattern: `case List(): return ${name}List(List<${itemsType.use}>.from(json));`,\n name: `${name}List`,\n });\n }\n }\n if (objects.length) {\n // todo: take a look at CompoundFilterFilters at the end\n const candidates: Record<string, Set<string>> = {};\n for (const schema of objects) {\n if (schema.additionalProperties === true) {\n continue;\n }\n assert(\n schema.properties,\n `Schema ${name} has no properties which are required in oneOf in order to determine the discriminator.`,\n );\n for (const [propName, propSchema] of Object.entries(\n schema.properties,\n )) {\n if (\n notRef(propSchema) &&\n propSchema.enum &&\n // fixme: the enum can have more than one value as long as it is not duplicated else where on the other schemas\n propSchema.enum.length === 1\n ) {\n candidates[propName] ??= new Set();\n candidates[propName].add(String(propSchema.enum[0]));\n }\n }\n }\n\n let discriminatorProp: string | undefined;\n\n for (const [name, values] of Object.entries(candidates)) {\n if (\n // make sure we pick the prop that exists on all objects\n values.size === objects.filter((it) => it.properties?.[name]).length\n ) {\n discriminatorProp = name;\n break;\n }\n }\n\n // if (objects.filter((it) => it.additionalProperties !== true).length) {\n // }\n // assert(discriminatorProp, `No discriminator property found in ${name}`);\n\n if (discriminatorProp) {\n for (const schema of objects) {\n const discriminatorValue: string = (\n (schema as SchemaObject).properties![\n discriminatorProp!\n ] as SchemaObject\n ).enum?.[0];\n\n const varientName = `${name}${pascalcase(discriminatorValue)}`;\n patterns.push({\n pattern: `case Map<String, dynamic> map when ${varientName}.matches(json): return ${varientName}.fromJson(map);`,\n name: varientName,\n });\n\n const objResult = this.#object(varientName, schema, {\n ...context,\n noEmit: true,\n mixin: name,\n });\n content.push(objResult.content);\n }\n }\n }\n\n const { mixins, withMixins } = this.#mixinise(name, context);\n content.unshift(`abstract ${mixins.length ? '' : 'mixin'} class ${name} ${withMixins} {\n dynamic toJson();\n ${\n patterns.length\n ? `static ${name} fromJson(dynamic json) {\n switch (json){\n ${patterns.map((it) => it.pattern).join('\\n')}\n default:\n throw ArgumentError(\"Invalid type for query property: \\${json}\");\n }\n }\n\n\n ${\n patterns.length\n ? ` static bool matches(dynamic value) {\n return ${patterns.map((it) => `value is ${it.name}`).join(' || ')};\n }`\n : ''\n }\n\n `\n : ''\n }\n }`);\n this.#emit(name, content.join('\\n'));\n\n return {\n content: content.join('\\n'),\n use: name,\n toJson: `${this.#safe(context.name as string, context.required)}`,\n fromJson: `${name}.fromJson(json['${context.name}'])`,\n matches: `${name}.matches(json['${context.name}'])`,\n };\n }\n\n #simple(type: string) {\n switch (type) {\n case 'string':\n return 'String';\n case 'number':\n return 'double';\n case 'integer':\n return 'int';\n case 'boolean':\n return 'bool';\n default:\n return 'dynamic';\n }\n }\n\n #enum(className: string, schema: SchemaObject, context: Context): Serialized {\n const name = context.propName || className; // className in case enum is top level\n const values = schema.enum as string[];\n const valType = this.#simple((schema.type as string) || 'string');\n // fixme: if enum have one value and cannot be null then use it as default value\n\n const { mixins, withMixins } = this.#mixinise(className, context);\n\n const content = `\n class _EnumValue implements ${pascalcase(name)} {\n final ${valType} value;\n const _EnumValue(this.value);\n @override\n toJson() {return this.value;}\n}\n abstract ${mixins.length ? '' : 'mixin'} class ${pascalcase(name)} ${withMixins} {\n ${values.map((it) => `static const _EnumValue ${formatName(it)} = _EnumValue(${typeof it === 'number' ? it : `'${it}'`});`).join('\\n')}\n dynamic toJson();\n\n ${valType} get value;\n\n static _EnumValue fromJson(${valType} value) {\n switch (value) {\n${values\n .map(\n (it) =>\n `case ${typeof it === 'number' ? it : `'${it}'`}: return ${formatName(it)};`,\n )\n .join('\\n')}\ndefault:\n throw ArgumentError.value(value, \"value\", \"No enum value with that name\");\n }\n }\n\n static bool matches(${valType} value) {\n try {\nfromJson(value);\nreturn true;\n } catch (error) {\nreturn false;\n }\n }\n\n }`;\n if (context.noEmit !== true) {\n this.#emit(name, content);\n }\n return {\n type: Array.isArray(schema.type)\n ? this.#simple(schema.type[0])\n : schema.type\n ? this.#simple(schema.type)\n : undefined,\n content: content,\n use: pascalcase(name),\n toJson: `${context.required ? `this.${camelcase(context.name)}.toJson()` : `this.${camelcase(context.name)} != null ? this.${camelcase(context.name)}!.toJson() : null`}`,\n fromJson: `${pascalcase(name)}.fromJson(json['${context.name}'])`,\n matches: `${pascalcase(name)}.matches(json['${context.name}'])`,\n };\n }\n\n /**\n * Handle string type with formats\n */\n #string(schema: SchemaObject, context: Context): Serialized {\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n case 'date':\n return {\n content: '',\n use: 'DateTime',\n simple: true,\n toJson: context.required\n ? `this.${camelcase(context.name)}.toIso8601String()`\n : `this.${camelcase(context.name)} != null ? this.${camelcase(\n context.name,\n )}!.toIso8601String() : null`,\n fromJson: context.name\n ? `json['${context.name}'] != null ? DateTime.parse(json['${context.name}']) : null`\n : 'json',\n matches: `json['${context.name}'] is String`,\n };\n case 'binary':\n case 'byte':\n return {\n content: '',\n use: 'File',\n toJson: `this.${camelcase(context.name)}`,\n simple: true,\n fromJson: context.name ? `json['${context.name}']` : 'json',\n matches: `json['${context.name}'] is Uint8List`,\n };\n default:\n return {\n encode: 'input',\n use: `String`,\n content: '',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: context.name ? `json['${context.name}'] as String` : 'json',\n matches: `json['${context.name}'] is String`,\n };\n }\n }\n\n /**\n * Handle number/integer types with formats\n */\n number(schema: SchemaObject, context: Context): Serialized {\n if (schema.type === 'integer') {\n return {\n content: '',\n use: 'int',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is int`,\n };\n }\n if (['float', 'double'].includes(schema.format as string)) {\n return {\n content: '',\n use: 'double',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is double`,\n };\n }\n return {\n content: '',\n use: 'num',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is double`,\n };\n }\n\n #serialize(\n className: string,\n schema: SchemaObject | ReferenceObject,\n required = true,\n context: Context = {},\n ): Serialized {\n if (isRef(schema)) {\n return this.#ref(className, schema.$ref, required, context);\n }\n // some schemas have decalres allof, oneof, anyOf at once or combinations of them\n // so we need to process them in order\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.#allOf(className, schema.allOf, context);\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.#oneOf(className, schema.oneOf, context);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#anyOf(className, schema.anyOf, context);\n }\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(className, schema, context);\n }\n // Handle types\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n let nullable = false;\n if ('nullable' in schema && schema.nullable) {\n nullable = true;\n } else if (schema.default === null) {\n nullable = true;\n } else if (types.includes('null')) {\n nullable = true;\n }\n\n // If no explicit \"type\", fallback to dynamic\n if (!types.length) {\n // unless properties are defined then assume object\n if ('properties' in schema) {\n return this.#object(className, schema, context);\n }\n if ('items' in schema) {\n return this.#array(className, schema, true, context);\n }\n return {\n content: '',\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n nullable: false,\n matches: '', // keep it empty as 'type is dynamic' is always true\n };\n }\n return this.#primitive(\n className,\n types[0],\n schema,\n { ...context, nullable },\n required,\n );\n }\n\n handle(\n className: string,\n schema: SchemaObject | ReferenceObject,\n required = true,\n context: Context = {},\n ): Serialized {\n const alias = context.alias;\n context.alias = undefined;\n const serialized = this.#serialize(className, schema, required, {\n ...context,\n forJson: alias,\n });\n\n if (alias) {\n this.#emit(className, `typedef ${alias} = ${serialized.use};`);\n return serialized;\n }\n return serialized;\n }\n}\n\nexport function isObjectSchema(\n schema: SchemaObject | ReferenceObject,\n): schema is SchemaObject {\n return !isRef(schema) && (schema.type === 'object' || !!schema.properties);\n}\n", "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:http/http.dart' as http;\nimport 'package:http_parser/http_parser.dart';\nimport 'package:mime/mime.dart' as mime;\n\nimport './interceptors.dart';\nimport './responses.dart';\n\nclass Dispatcher {\n final List<Interceptor> interceptors;\n\n Dispatcher(this.interceptors);\n\n Future<http.StreamedResponse> multipart(\n RequestConfig config,\n Map<String, dynamic> body,\n ) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.MultipartRequest(\n modifiedConfig.method,\n modifiedConfig.url,\n );\n request.headers.addAll(modifiedConfig.headers);\n for (var entry in body.entries) {\n final key = entry.key;\n final value = entry.value;\n if (value is File) {\n final mimeType = mime.lookupMimeType(value.path);\n request.files.add(\n http.MultipartFile(\n key,\n value.openRead(),\n await value.length(),\n filename: value.uri.pathSegments.last,\n contentType: mimeType != null ? MediaType.parse(mimeType) : null,\n ),\n );\n } else {\n request.fields[key] = value.toString();\n }\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> empty(RequestConfig config) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n request.headers.addAll(modifiedConfig.headers);\n return request.send();\n }\n\n Future<http.StreamedResponse> json(RequestConfig config, dynamic body) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n request.headers.addAll(modifiedConfig.headers);\n\n request.headers['Content-Type'] = 'application/json';\n if ((body is Map || body is List)) {\n request.body = jsonEncode(body);\n } else if (body is String) {\n request.body = body;\n } else {\n throw ArgumentError('Unsupported body type: ${body.runtimeType}');\n }\n\n return request.send();\n }\n}\n\nclass Receiver {\n final List<Interceptor> interceptors;\n Receiver(this.interceptors);\n\n dynamic _parse(http.Response response) {\n final contentTypeHeader = response.headers['content-type'];\n final parsed = parseContentType(contentTypeHeader);\n if (parsed.type == 'application/json') {\n return jsonDecode(response.body);\n } else if (parsed.type == 'text/plain') {\n return response.body;\n } else if (parsed.type == 'application/octet-stream') {\n return response.bodyBytes;\n } else {\n throw UnsupportedError('Unsupported content type: ${parsed.type}');\n }\n }\n\n dynamic json(http.StreamedResponse stream) async {\n if (stream.statusCode >= 200 && stream.statusCode < 300) {\n final response = await http.Response.fromStream(stream);\n return _parse(response);\n }\n switch (stream.statusCode) {\n case 400:\n throw BadRequestError('');\n case 401:\n throw UnauthorizedError('');\n case 403:\n throw ForbiddenError('');\n case 404:\n throw NotFoundError('');\n case 500:\n throw InternalServerError('');\n case 402:\n throw PaymentRequiredError('');\n case 405:\n throw MethodNotAllowedError('');\n case 406:\n throw NotAcceptableError('');\n case 409:\n throw ConflictError('');\n case 410:\n throw GoneError('');\n case 422:\n throw UnprocessableEntityError('');\n case 429:\n throw TooManyRequestsError('');\n case 413:\n throw PayloadTooLargeError('');\n case 415:\n throw UnsupportedMediaTypeError('');\n case 501:\n throw NotImplementedError('');\n case 502:\n throw BadGatewayError('');\n case 503:\n throw ServiceUnavailableError('');\n case 504:\n throw GatewayTimeoutError('');\n default:\n throw UnknownApiError('', stream.statusCode);\n }\n }\n}\n\n({String type, Map<String, String> parameters}) parseContentType(\n String? contentTypeHeader,\n) {\n if (contentTypeHeader == null || contentTypeHeader.isEmpty) {\n return (type: '', parameters: {});\n }\n final parts = contentTypeHeader.split(';');\n final type = parts[0].trim();\n final parameters = <String, String>{};\n for (var i = 1; i < parts.length; i++) {\n final param = parts[i].split('=');\n if (param.length == 2) {\n parameters[param[0].trim()] = param[1].trim();\n }\n }\n\n return (type: type, parameters: parameters);\n}\n", "abstract class Interceptor {\n RequestConfig before(RequestConfig config);\n void after();\n}\n\nclass BaseUrlInterceptor extends Interceptor {\n final String Function() getBaseUrl;\n BaseUrlInterceptor(this.getBaseUrl);\n\n @override\n RequestConfig before(RequestConfig config) {\n final baseUrl = getBaseUrl();\n if (config.url.scheme.isEmpty) {\n config.url = Uri.parse(baseUrl + config.url.toString());\n }\n return config;\n }\n\n @override\n void after() {\n //\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n RequestConfig({required this.method, required this.url, required this.headers});\n}\n", "sealed class ApiError {\n final String message;\n final int? statusCode;\n final String status;\n const ApiError(this.message, {this.statusCode, this.status = ''});\n\n @override\n String toString() =>\n 'ApiError(status: $status, statusCode: $statusCode, message: $message)';\n}\n\nbase class BadRequestError extends ApiError {\n const BadRequestError(String message)\n : super(message, statusCode: 400, status: 'BadRequest');\n}\n\nbase class UnauthorizedError extends ApiError {\n const UnauthorizedError(String message)\n : super(message, statusCode: 401, status: 'Unauthorized');\n}\n\nbase class ForbiddenError extends ApiError {\n const ForbiddenError(String message)\n : super(message, statusCode: 403, status: 'Forbidden');\n}\n\nbase class NotFoundError extends ApiError {\n const NotFoundError(String message)\n : super(message, statusCode: 404, status: 'NotFound');\n}\n\nbase class InternalServerError extends ApiError {\n const InternalServerError(String message)\n : super(message, statusCode: 500, status: 'InternalServerError');\n}\n\nbase class UnknownApiError extends ApiError {\n const UnknownApiError(String message, int statusCode)\n : super(message, statusCode: statusCode, status: 'UnknownApiError');\n}\n\nbase class PaymentRequiredError extends ApiError {\n const PaymentRequiredError(String message)\n : super(message, statusCode: 402, status: 'PaymentRequired');\n}\n\nbase class MethodNotAllowedError extends ApiError {\n const MethodNotAllowedError(String message)\n : super(message, statusCode: 405, status: 'MethodNotAllowed');\n}\n\nbase class NotAcceptableError extends ApiError {\n const NotAcceptableError(String message)\n : super(message, statusCode: 406, status: 'NotAcceptable');\n}\n\nbase class ConflictError extends ApiError {\n const ConflictError(String message)\n : super(message, statusCode: 409, status: 'Conflict');\n}\n\nbase class GoneError extends ApiError {\n const GoneError(String message)\n : super(message, statusCode: 410, status: 'Gone');\n}\n\nbase class UnprocessableEntityError extends ApiError {\n const UnprocessableEntityError(String message)\n : super(message, statusCode: 422, status: 'UnprocessableEntity');\n}\n\nbase class TooManyRequestsError extends ApiError {\n const TooManyRequestsError(String message)\n : super(message, statusCode: 429, status: 'TooManyRequests');\n}\n\nbase class PayloadTooLargeError extends ApiError {\n const PayloadTooLargeError(String message)\n : super(message, statusCode: 413, status: 'PayloadTooLarge');\n}\n\nbase class UnsupportedMediaTypeError extends ApiError {\n const UnsupportedMediaTypeError(String message)\n : super(message, statusCode: 415, status: 'UnsupportedMediaType');\n}\n\nbase class NotImplementedError extends ApiError {\n const NotImplementedError(String message)\n : super(message, statusCode: 501, status: 'NotImplemented');\n}\n\nbase class BadGatewayError extends ApiError {\n const BadGatewayError(String message)\n : super(message, statusCode: 502, status: 'BadGateway');\n}\n\nbase class ServiceUnavailableError extends ApiError {\n const ServiceUnavailableError(String message)\n : super(message, statusCode: 503, status: 'ServiceUnavailable');\n}\n\nbase class GatewayTimeoutError extends ApiError {\n const GatewayTimeoutError(String message)\n : super(message, statusCode: 504, status: 'GatewayTimeout');\n}\n"],
5
- "mappings": ";AAAA,SAAS,SAAS,uBAAuB;AACzC,SAAS,SAAAA,cAAa;AACtB,OAAOC,aAAY;AACnB,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AAUrB,SAAS,aAAAC,kBAAiB;AAC1B,OAAO,UAAU;AAEjB;AAAA,EACE,aAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,OACK;;;ACxBP,SAAS,aAAa;;;ACDtB,SAAS,SAAAC,cAAa;;;ACKtB,SAAS,iBAAiB;AAEnB,IAAM,WACgD;EAC3D,aAAa,CAAC,WAAW,MAAM,WAAW;AACxC,QAAI,UAAU,aAAa;AACzB,aAAO,UAAU,UAAU,WAAW;IACxC;AACA,UAAM,WAAW,UAAU,WAAW;AACtC,QAAI,YAAY,SAAS,MAAM;AAC7B,aAAO,UAAU,SAAS,IAAI;IAChC;AACA,WAAO;MACL,CAAC,QAAQ,GAAG,KAAK,QAAQ,gBAAgB,GAAG,EAAE,MAAM,GAAG,CAAC,EACrD,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAK;IACV;EACF;EACA,KAAK,CAAC,WAAW,SAAS;AACxB,WAAO,UAAU,OAAO,CAAC,KAAK,oBAAoB,MAAM,SAAS;EACnE;AACF;AAmBO,SAAS,iBACd,QACA,UACA;AACA,QAAM,SAAc,CAAC;AACrB,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG;AACtE,UAAM,EAAE,aAAa,CAAC,GAAG,GAAG,QAAQ,IAAI;AAGxC,UAAM,YAAY,KAAK,QAAQ,aAAa,MAAM;AAElD,eAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,OAAO,GAGnD;AACH,YAAM,oBAAoB,OAAO,eAAe,SAAS;AACzD,YAAM,YAAY,OAAO,OAAO,SAAS;AACzC,YAAM,gBAAgB,kBAAkB,WAAW,WAAW,MAAM;AACpE,YAAM,eAAe,UAAU,WAAW,SAAS;AACnD,YAAM,WAAW,UAAU,WAAW,KAAK,CAAC;AAC5C,aAAO;QACL;UACE;YACE,MAAM,SAAS;YACf;YACA,MAAM;YACN,WAAW;YACX,KAAK;UACP;UACA;YACE,GAAG;YACH,YAAY,CAAC,GAAG,YAAY,GAAI,UAAU,cAAc,CAAC,CAAE;YAC3D,aAAa;UACf;QACF;MACF;IACF;EACF;AACA,SAAO;AACT;AAgBA,IAAM,mBAAmB,oBAAI,IAAI;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACF,CAAC;AAUD,SAAS,YAAY,eAA+B;AAElD,MAAI,MAAM,KAAK,aAAa,GAAG;AAC7B,WAAO,IAAI,aAAa;EAC1B;AAEA,SAAO,iBAAiB,IAAI,aAAa,IACrC,GAAG,aAAa,MAChB;AACN;AASO,SAAS,oBACd,YACA,WACQ;AACR,QAAM,cAAc,UAAU,eAAe;AAC7C,QAAM,gBAAgB;AACtB,QAAM,cAAc,oBAAI,IAAI;;IAE1B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EACF,CAAC;AAED,QAAM,WAAW,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AAErD,QAAM,sBAAsB,SAAS;IACnC,CAAC,YACC,WACA,CAAC,QAAQ,WAAW,GAAG,KACvB,CAAC,QAAQ,SAAS,GAAG,KACrB,CAAC,cAAc,KAAK,OAAO;EAC/B;AAGA,WAAS,IAAI,oBAAoB,SAAS,GAAG,KAAK,GAAG,KAAK;AACxD,UAAM,UAAU,oBAAoB,CAAC;AACrC,QAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAE5B,aAAO,YAAY,UAAU,OAAO,CAAC;IACvC;EACF;AAEA,QAAM,2BAA2B,oBAAoB,SAAS;AAG9D,MAAI,aAAa;AACf,UAAM,YAAY,YAAY,YAAY;AAC1C,UAAM,QAAQ,YACX,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,wBAAwB,OAAO,EACvC,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,mBAAmB,OAAO,EAClC,YAAY,EACZ,MAAM,SAAS;AAElB,UAAM,aAAa,MAAM,OAAO,OAAO;AAGvC,QACE,YAAY,IAAI,SAAS,KACzB,WAAW,WAAW,KACtB,0BACA;IAEF,WAES,WAAW,SAAS,GAAG;AAC9B,YAAM,YAAY,WAAW,CAAC;AAC9B,YAAM,kBAAkB,YAAY,IAAI,SAAS;AAGjD,UAAI,mBAAmB,WAAW,SAAS,GAAG;AAC5C,cAAM,mBAAmB,UAAU;AACnC,YAAI,qBAAqB;AACzB,YAAI,YAAY,SAAS,kBAAkB;AAEzC,gBAAM,kBAAkB,YAAY,gBAAgB;AACpD,cAAI,mBAAmB,OAAO,mBAAmB,KAAK;AACpD,iCAAqB;UACvB,WAAW,mBAAmB,OAAO,mBAAmB,KAAK;AAC3D,iCAAqB;UACvB,WAAW,CAAC,KAAK,GAAG,EAAE,SAAS,eAAe,GAAG;AAC/C,iCAAqB,mBAAmB;UAC1C,OAAO;AACL,kBAAM,QAAQ,YACX,UAAU,gBAAgB,EAC1B,MAAM,UAAU;AACnB,gBAAI,SAAS,MAAM,UAAU,QAAW;AACtC,mCAAqB,mBAAmB,MAAM;YAChD;AACA,gBACE,uBAAuB,MACvB,YAAY,SAAS,kBACrB;AACA,mCAAqB;YACvB;UACF;QACF;AAEA,YACE,uBAAuB,MACvB,qBAAqB,YAAY,QACjC;AACA,gBAAM,6BACJ,YAAY,UAAU,kBAAkB;AAC1C,gBAAM,eAAe,UAAU,0BAA0B;AACzD,cAAI,cAAc;AAEhB,mBAAO,YAAY,YAAY;UACjC;QACF;AAGA,cAAM,qBAAqB,UAAU,WAAW,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAClE,YAAI,oBAAoB;AAEtB,iBAAO,YAAY,kBAAkB;QACvC;MACF;AAGA,YAAM,mBAAmB,UAAU,WAAW;AAC9C,UAAI,kBAAkB;AACpB,cAAM,qBAAqB,WAAW,WAAW,KAAK;AAGtD,YAAI,EAAE,sBAAsB,2BAA2B;AACrD,cAAI,iBAAiB,SAAS,GAAG;AAE/B,mBAAO,YAAY,gBAAgB;UACrC;QACF;MACF;AAGA,YAAM,iBAAiB,UAAU,SAAS;AAC1C,UAAI,gBAAgB;AAClB,cAAM,uBAAuB,YAAY,IAAI,cAAc;AAC3D,YACE,CAAC,wBACD,WAAW,WAAW,KACtB,CAAC,0BACD;AAEA,iBAAO,YAAY,cAAc;QACnC;MACF;AACA,UACE,mBACA,WAAW,SAAS,KACpB,WAAW,CAAC,KACZ,0BACA;AACA,cAAM,kBAAkB,UAAU,WAAW,CAAC,CAAC;AAC/C,YAAI,iBAAiB;AAEnB,iBAAO,YAAY,eAAe;QACpC;MACF;IACF;EACF;AAGA,MAAI,oBAAoB,SAAS,GAAG;AAClC,QAAI,iBAAiB,oBAAoB,CAAC;AAC1C,QAAI,eAAe,WAAW,GAAG,GAAG;AAClC,uBAAiB,eAAe,UAAU,CAAC;IAC7C;AACA,QAAI,gBAAgB;AAElB,aAAO,YAAY,UAAU,cAAc,CAAC;IAC9C;EACF;AAGA,UAAQ;IACN,gDAAgD,UAAU,kBAAkB,WAAW;EACzF;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,aAAwC;AAC3E,MAAI,CAAC,aAAa;AAChB,WAAO;EACT;AAGA,MAAI,WAAW,YAAY,KAAK;AAGhC,QAAM,iBAAiB,SAAS,QAAQ,GAAG;AAC3C,MAAI,mBAAmB,IAAI;AACzB,eAAW,SAAS,UAAU,GAAG,cAAc,EAAE,KAAK;EACxD;AAGA,aAAW,SAAS,YAAY;AAEhC,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO,SAAS,MAAM,GAAG,EAAE,CAAC;EAC9B,WAAW,SAAS,SAAS,OAAO,GAAG;AACrC,WAAO,SAAS,MAAM,GAAG,EAAE,CAAC;EAC9B;AACA,SAAO;AACT;AAiCO,SAAS,uBACd,aACS;AACT,SAAO,gBAAgB;AACzB;AAEO,SAAS,oBAAoB,YAAsC;AACxE,eAAa,OAAO,UAAU;AAC9B,SAAO,cAAc,OAAO,aAAa;AAC3C;;;ACrdA,SAAS,aAAa;AACtB,OAAO,YAAY;AAMnB,SAAS,aAAAC,YAAW,iBAAiB;AAErC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAM,aAAa,CAAC,OAAoB;AACtC,QAAM,yBAAyB;AAE/B,MAAI,OAAO,OAAO,UAAU;AAC1B,QAAI,KAAK,KAAK,EAAE,MAAM,IAAI;AACxB,aAAO,KAAK,KAAK,IAAI,EAAE,CAAC;AAAA,IAC1B;AACA,WAAO,IAAI,EAAE;AAAA,EACf;AAGA,MAAI,OAAO,WAAW;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,OAAO,UAAU;AAE1B,QAAI,uBAAuB,KAAK,EAAE,GAAG;AACnC,UAAI,OAAO,OAAO,UAAU;AAC1B,YAAI,KAAK,KAAK,EAAE,MAAM,IAAI;AACxB,iBAAO,KAAK,KAAK,IAAI,EAAE,CAAC;AAAA,QAC1B;AACA,eAAO,IAAI,EAAE;AAAA,MACf;AAAA,IACF;AAGA,QAAI,eAAe;AAGnB,QAAI,aAAa,WAAW,GAAG,GAAG;AAChC,qBAAe,aAAa,MAAM,CAAC;AAAA,IACrC;AAGA,QAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,qBAAe,aAAa,MAAM,GAAG,EAAE;AAAA,IACzC;AAGA,WAAO,UAAU,YAAY;AAAA,EAC/B;AAIA,SAAO,UAAU,OAAO,EAAE,CAAC;AAC7B;AAkBO,IAAM,iBAAN,MAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,EAEA,YAAY,MAAqB,MAAY;AAC3C,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAa,YAAoB,OAAiB,CAAC,GAAa;AAC9D,SAAK,MAAM,eAAe,CAAC;AAC3B,SAAK,MAAM,WAAW,YAAY,CAAC;AACnC,SAAK,MAAM,WAAW,cAAc,CAAC;AAErC,UAAM,cAAc,CAAC,WAAoD;AACvE,UAAI,MAAM,MAAM,GAAG;AACjB,cAAM,EAAE,MAAM,IAAI,SAAS,OAAO,IAAI;AACtC,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,eAAQ,OAAO,MAAgD;AAAA,UAC7D,CAAC,cAAc,YAAY,SAAS;AAAA,QACtC;AAAA,MACF;AACA,UACE,OAAO,SAAS,WAChB,OAAO,SACP,OAAO,OAAO,KAAK,KACnB,OAAO,MAAM,OACb;AACA,eAAO,YAAY,OAAO,KAAK;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,WAAW,OAAO,GAAG;AACxE,UAAI,YAAY,KAAK,GAAG;AACtB,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QACE,WACA,QACA,SACY;AACZ,QAAI,OAAO,sBAAsB;AAC/B,WAAK,MAAM,WAAW,WAAW,SAAS,0BAA0B;AACpE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,QACvC,UAAU,SAASA,WAAU,QAAQ,IAAI,CAAC;AAAA,QAC1C,SAAS,SAASA,WAAU,QAAQ,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,QAAQ,OAAO,UAAU,GAAG;AAC9B,UAAI,QAAQ,WAAW,MAAM;AAC3B,aAAK;AAAA,UACH;AAAA,UACA,SAAS,SAAS;AAAA,UAClB,SAAS;AAAA;AAAA,YAEP,SAAS;AAAA,mBACF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWpB;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,QAAQ,GAAG,KAAK,MAAM,QAAQ,MAAgB,QAAQ,QAAQ,CAAC;AAAA,QAC/D,UAAU,GAAG,SAAS,mBAAmB,QAAQ,IAAI;AAAA,QACrD,SAAS,GAAG,SAAS,kBAAkB,QAAQ,IAAI;AAAA,MACrD;AAAA,IACF;AAEA,UAAM,QAAkB,CAAC;AACzB,UAAM,mBAA6B,CAAC;AACpC,UAAM,oBAA8B,CAAC;AACrC,UAAM,iBAA2B,CAAC;AAClC,UAAM,UAAoB,CAAC;AAE3B,eAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACjE,YAAM,WAAW,IAAI,QAAQ,MAAM,EAAE;AACrC,YAAM,YAAY,OAAO,YAAY,CAAC,GAAG,SAAS,GAAG;AACrD,YAAM,UAAU,KAAK,OAAO,WAAW,YAAY,UAAU;AAAA,QAC3D,MAAM;AAAA,QACN;AAAA,QACA,UAAU,CAAC,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1D,CAAC;AACD,YAAMC,YAAW,QAAQ,YAAY,CAAC;AACtC,YAAM,iBAAiBA,YAAW,MAAM;AACxC,YAAM;AAAA,QACJ,SAAS,QAAQ,GAAG,GAAG,cAAc,IAAID,WAAU,QAAQ,CAAC;AAAA,MAC9D;AACA,qBAAe,KAAK,GAAGA,WAAU,QAAQ,CAAC,KAAK,QAAQ,QAAQ,EAAE;AACjE,uBAAiB,KAAK,IAAI,QAAQ,MAAM,QAAQ,MAAM,EAAE;AACxD,wBAAkB;AAAA,QAChB,GAAG,WAAW,cAAc,EAAE,QAAQA,WAAU,QAAQ,CAAC;AAAA,MAC3D;AACA,UAAI,UAAU;AACZ,gBAAQ,KAAK;AAAA,sBACCA,WAAU,QAAQ,CAAC;AAAA,MACnCC,YAAW,SAAS,QAAQ,eAAe,SAAS,QAAQ,YAAY,IAAI,QAAQ,UAAU,MAAM,QAAQ,OAAO,KAAK,EAAE;AAAA,WACrH;AAAA,MACL,OAAO;AACL,gBAAQ,KAAK;AAAA,sBACCD,WAAU,QAAQ,CAAC;AAAA,MACnCC,YAAW,SAAS,QAAQ,eAAe,SAAS,QAAQ,YAAY,IAAI,QAAQ,UAAU,MAAM,QAAQ,OAAO,KAAK,EAAE;AAAA,UACtH;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,WAAW,IAAI,KAAK,UAAU,WAAW,OAAO;AAChE,UAAM,UAAU,SAAS,SAAS,IAAI,UAAU;AAAA,QAC5C,MAAM,KAAK,IAAI,CAAC;AAAA,QAChB,CAAC,OAAO,SAAS,UAAU,EAAE,IAAI,SAAS;AAAA,QAC1C,kBAAkB,KAAK,IAAI,CAAC,KAAK,OAAO,SAAS,IAAI,KAAK,UAAU;AAAA,iBAC3D,SAAS;AAAA,SACjB,SAAS;AAAA,EAAM,eAAe,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA,EAGhD,iBAAiB,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA,SAGrB,QAAQ,KAAK,MAAM,CAAC;AAAA;AAAA;AAGzB,QAAI,QAAQ,WAAW,MAAM;AAC3B,WAAK,MAAM,WAAW,OAAO;AAAA,IAC/B;AACA,UAAM,WAAW,CAAC,QAAQ,YAAY,QAAQ,aAAa;AAC3D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,GAAG,KAAK,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACrD,UAAU,QAAQ,OACd,GAAG,QAAQ,WAAW,SAAS,mBAAmB,QAAQ,IAAI,QAC9D,GAAG,QAAQ,WAAW,SAAS;AAAA,MACnC,SAAS,GAAG,SAAS,kBAAkB,QAAQ,IAAI;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,QAAgB,UAAmB;AACvC,WAAO,WACH,QAAQD,WAAU,MAAM,CAAC,cACzB,QAAQA,WAAU,MAAM,CAAC,mBAAmBA,WAAU,MAAM,CAAC;AAAA,EACnE;AAAA,EAEA,OACE,WACA,QACA,WAAW,OACX,SACY;AACZ,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU,sBAAsB,QAAQ,OAAO,SAAS,QAAQ,IAAI,OAAO,MAAM;AAAA,QACjF,SAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,YAAY,KAAK,OAAO,WAAW,OAAO,OAAO,MAAM,OAAO;AACpE,UAAM,WAAW,WACb,QAAQ,OACN,UAAU,QAAQ,IAAI,cAAc,UAAU,SAAS,UAAU,MAAM,SAAS;AAAA,2BAC/D,UAAU,SAAS,OAAO,GAAG,UAAU,GAAG,eAAe;AAAA,yBAE1E,iBAAiB,UAAU,SAAS,UAAU,MAAM,SAAS;AAAA,2BAC5C,UAAU,SAAS,OAAO,GAAG,UAAU,GAAG,eAAe;AAAA,yBAE5E,QAAQ,OACN,SAAS,QAAQ,IAAI;AAAA,uBACR,QAAQ,IAAI,cAAc,UAAU,SAAS,UAAU,MAAM,SAAS;AAAA,+BAC9D,UAAU,SAAS,OAAO,GAAG,UAAU,GAAG,eAAe;AAAA;AAAA,sBAG9E;AAAA,8BACoB,UAAU,SAAS,UAAU,MAAM,SAAS;AAAA,+BAC3C,UAAU,SAAS,OAAO,GAAG,UAAU,GAAG,eAAe;AAAA;AAAA;AAIpF,WAAO;AAAA,MACL,QAAQ,qBAAqB,UAAU,SAAS,OAAO,aAAa;AAAA,MACpE,SAAS;AAAA,MACT,KAAK,QAAQ,UAAU,GAAG;AAAA,MAC1B;AAAA,MACA,QAAQ,GAAG,QAAQ,WAAW,QAAQA,WAAU,QAAQ,IAAI,CAAC,GAAG,UAAU,SAAS,KAAK,oCAAoC,KAAK,QAAQA,WAAU,QAAQ,IAAI,CAAC,iBAAiBA,WAAU,QAAQ,IAAI,CAAC,GAAG,UAAU,SAAS,KAAK,qCAAqC,SAAS;AAAA,MACjR,SAAS,SAASA,WAAU,QAAQ,IAAI,CAAC,oBAAoB,UAAU,OAAO;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WACE,WACA,MACA,QACA,SACA,WAAW,OACC;AACZ,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,KAAK,QAAQ,QAAQ,OAAO;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,OAAO,QAAQ,OAAO;AAAA,MACpC,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,UAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,UAC/B,SAAS,SAAS,QAAQ,IAAI;AAAA,QAChC;AAAA,MACF,KAAK;AACH,eAAO,KAAK,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAChD,KAAK;AACH,eAAO,KAAK,OAAO,WAAW,QAAQ,UAAU,OAAO;AAAA,MACzD,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,UAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,QACjC;AAAA,MACF;AAEE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,UAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,QACjC;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,KACE,WACA,MACA,UACA,SACY;AACZ,UAAM,aAAa,SAAS,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAEjD,UAAM,aAAa,KAAK;AAAA,MACtB;AAAA,MACA,UAAwB,KAAK,OAAO,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,aAAa,CAAC,QAAQ;AAAA,MACrD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OACE,WACA,SACA,SACY;AACZ,UAAM,OAAO,WAAW,QAAQ,YAAY,SAAS;AAErD,UAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,UAAM,UAAU,QAAQ,OAAO,MAAM;AACrC,QAAI,QAAQ,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,SAAS,QAAQ,GAAG;AACzD,aAAO,OAAO,SAAS,IAAI,oBAAoB;AAAA,IACjD;AACA,UAAM,eAAe;AAAA,MACnB,CAAC;AAAA,MACD,GAAG;AAAA,MACH,GAAG,KAAK,IAAI,CAAC,QAAQ,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,IACtD;AACA,WAAO,aAAa;AACpB,WAAO,KAAK,OAAO,MAAM,cAAc,MAAM,OAAO;AAAA,EACtD;AAAA,EAEA,OACE,WACA,SACA,SACY;AAEZ,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,QAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,MACjC;AAAA,IACF;AACA,UAAM,kBAAkB,QAAQ,UAAU,CAAC,WAAW;AACpD,UAAI,MAAM,MAAM,GAAG;AACjB,cAAM,YAAY,UAAU,KAAK,OAAO,OAAO,IAAI;AACnD,eAAO,UAAU,SAAS;AAAA,MAC5B;AACA,aAAO,OAAO,SAAS;AAAA,IACzB,CAAC;AACD,UAAM,eAAe,QAAQ,MAAM,CAAC;AACpC,QAAI,mBAAmB,GAAG;AACxB,mBAAa,OAAO,iBAAiB,CAAC;AAAA,IACxC;AAEA,WAAO,KAAK,OAAO,WAAW,aAAa,CAAC,GAAG,MAAM;AAAA,MACnD,GAAG;AAAA,MACH,UAAU,mBAAmB;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,MAAc,SAAkB;AACxC,UAAM,SAAS,KAAK,aAAa,IAAI;AACrC,QAAI,QAAQ,OAAO;AACjB,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AACA,UAAM,aACJ,OAAO,SAAS,IACZ,SAAS,OAAO,KAAK,IAAI,CAAC,KAC1B,OAAO,WAAW,IAChB,WAAW,OAAO,CAAC,CAAC,KACpB;AACR,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OACE,WACA,SACA,SACY;AACZ,UAAM,OAAO,WAAW,QAAQ,YAAY,SAAS;AAErD,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,QAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,MACjC;AAAA,IACF;AACA,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAgD,CAAC;AAEvD,UAAM,UAAU,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC,OAAO,GAAG,SAAS,QAAQ;AAC1E,eAAW,UAAU,SAAS;AAC5B,UAAI,MAAM,MAAM,GAAG;AACjB,cAAM,UAAU,KAAK,KAAK,WAAW,OAAO,MAAM,MAAM,OAAO;AAC/D,iBAAS,KAAK;AAAA,UACZ,SAAS,QAAQ,QAAQ,QAAQ,sBAAsB,aAAa,QAAQ,GAAG,yBAAyB,QAAQ,GAAG;AAAA,UACnH,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,MACH,WAAW,OAAO,SAAS,UAAU;AAEnC,gBAAQ,KAAK,SAAS,IAAI,aAAa,IAAI;AAAA;AAAA,YAEvC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAML;AACH,iBAAS,KAAK;AAAA,UACZ,SAAS,yBAAyB,IAAI;AAAA,UACtC,MAAM,GAAG,IAAI;AAAA,QACf,CAAC;AAAA,MACH,WAAW,OAAO,SAAS,SAAS;AAGlC,cAAM,YAAY,KAAK,OAAO,MAAM,OAAO,OAAQ,MAAM;AAAA,UACvD,GAAG;AAAA,UACH,QAAQ;AAAA,QACV,CAAC;AACD,gBAAQ,KAAK,SAAS,IAAI,aAAa,IAAI;AAAA,yBAC1B,UAAU,GAAG;AAAA,cACxB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,WAKP;AACH,iBAAS,KAAK;AAAA,UACZ,SAAS,uBAAuB,IAAI,aAAa,UAAU,GAAG;AAAA,UAC9D,MAAM,GAAG,IAAI;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ;AAElB,YAAM,aAA0C,CAAC;AACjD,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,yBAAyB,MAAM;AACxC;AAAA,QACF;AACA;AAAA,UACE,OAAO;AAAA,UACP,UAAU,IAAI;AAAA,QAChB;AACA,mBAAW,CAAC,UAAU,UAAU,KAAK,OAAO;AAAA,UAC1C,OAAO;AAAA,QACT,GAAG;AACD,cACE,OAAO,UAAU,KACjB,WAAW;AAAA,UAEX,WAAW,KAAK,WAAW,GAC3B;AACA,uBAAW,QAAQ,MAAM,oBAAI,IAAI;AACjC,uBAAW,QAAQ,EAAE,IAAI,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEJ,iBAAW,CAACE,OAAM,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD;AAAA;AAAA,UAEE,OAAO,SAAS,QAAQ,OAAO,CAAC,OAAO,GAAG,aAAaA,KAAI,CAAC,EAAE;AAAA,UAC9D;AACA,8BAAoBA;AACpB;AAAA,QACF;AAAA,MACF;AAMA,UAAI,mBAAmB;AACrB,mBAAW,UAAU,SAAS;AAC5B,gBAAM,qBACH,OAAwB,WACvB,iBACF,EACA,OAAO,CAAC;AAEV,gBAAM,cAAc,GAAG,IAAI,GAAG,WAAW,kBAAkB,CAAC;AAC5D,mBAAS,KAAK;AAAA,YACZ,SAAS,sCAAsC,WAAW,0BAA0B,WAAW;AAAA,YAC/F,MAAM;AAAA,UACR,CAAC;AAED,gBAAM,YAAY,KAAK,QAAQ,aAAa,QAAQ;AAAA,YAClD,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,OAAO;AAAA,UACT,CAAC;AACD,kBAAQ,KAAK,UAAU,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;AAC3D,YAAQ,QAAQ,YAAY,OAAO,SAAS,KAAK,OAAO,UAAU,IAAI,IAAI,UAAU;AAAA;AAAA,QAGhF,SAAS,SACL,UAAU,IAAI;AAAA;AAAA,UAEhB,SAAS,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQ9C,SAAS,SACL;AAAA,iBACM,SAAS,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA,WAE9D,EACN;AAAA;AAAA,UAGO,EACN;AAAA,MACA;AACF,SAAK,MAAM,MAAM,QAAQ,KAAK,IAAI,CAAC;AAEnC,WAAO;AAAA,MACL,SAAS,QAAQ,KAAK,IAAI;AAAA,MAC1B,KAAK;AAAA,MACL,QAAQ,GAAG,KAAK,MAAM,QAAQ,MAAgB,QAAQ,QAAQ,CAAC;AAAA,MAC/D,UAAU,GAAG,IAAI,mBAAmB,QAAQ,IAAI;AAAA,MAChD,SAAS,GAAG,IAAI,kBAAkB,QAAQ,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,QAAQ,MAAc;AACpB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAM,WAAmB,QAAsB,SAA8B;AAC3E,UAAM,OAAO,QAAQ,YAAY;AACjC,UAAM,SAAS,OAAO;AACtB,UAAM,UAAU,KAAK,QAAS,OAAO,QAAmB,QAAQ;AAGhE,UAAM,EAAE,QAAQ,WAAW,IAAI,KAAK,UAAU,WAAW,OAAO;AAEhE,UAAM,UAAU;AAAA,gCACY,WAAW,IAAI,CAAC;AAAA,UACtC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,eAKF,OAAO,SAAS,KAAK,OAAO,UAAU,WAAW,IAAI,CAAC,IAAI,UAAU;AAAA,QAC3E,OAAO,IAAI,CAAC,OAAO,2BAA2B,WAAW,EAAE,CAAC,iBAAiB,OAAO,OAAO,WAAW,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,QAGpI,OAAO;AAAA;AAAA,mCAEoB,OAAO;AAAA;AAAA,EAExC,OACC;AAAA,MACC,CAAC,OACC,QAAQ,OAAO,OAAO,WAAW,KAAK,IAAI,EAAE,GAAG,YAAY,WAAW,EAAE,CAAC;AAAA,IAC7E,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMa,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU7B,QAAI,QAAQ,WAAW,MAAM;AAC3B,WAAK,MAAM,MAAM,OAAO;AAAA,IAC1B;AACA,WAAO;AAAA,MACL,MAAM,MAAM,QAAQ,OAAO,IAAI,IAC3B,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC,IAC3B,OAAO,OACL,KAAK,QAAQ,OAAO,IAAI,IACxB;AAAA,MACN;AAAA,MACA,KAAK,WAAW,IAAI;AAAA,MACpB,QAAQ,GAAG,QAAQ,WAAW,QAAQF,WAAU,QAAQ,IAAI,CAAC,cAAc,QAAQA,WAAU,QAAQ,IAAI,CAAC,mBAAmBA,WAAU,QAAQ,IAAI,CAAC,mBAAmB;AAAA,MACvK,UAAU,GAAG,WAAW,IAAI,CAAC,mBAAmB,QAAQ,IAAI;AAAA,MAC5D,SAAS,GAAG,WAAW,IAAI,CAAC,kBAAkB,QAAQ,IAAI;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAsB,SAA8B;AAC1D,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ,QAAQ,WACZ,QAAQA,WAAU,QAAQ,IAAI,CAAC,uBAC/B,QAAQA,WAAU,QAAQ,IAAI,CAAC,mBAAmBA;AAAA,YAChD,QAAQ;AAAA,UACV,CAAC;AAAA,UACL,UAAU,QAAQ,OACd,SAAS,QAAQ,IAAI,qCAAqC,QAAQ,IAAI,eACtE;AAAA,UACJ,SAAS,SAAS,QAAQ,IAAI;AAAA,QAChC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,UACvC,QAAQ;AAAA,UACR,UAAU,QAAQ,OAAO,SAAS,QAAQ,IAAI,OAAO;AAAA,UACrD,SAAS,SAAS,QAAQ,IAAI;AAAA,QAChC;AAAA,MACF;AACE,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,UACvC,UAAU,QAAQ,OAAO,SAAS,QAAQ,IAAI,iBAAiB;AAAA,UAC/D,SAAS,SAAS,QAAQ,IAAI;AAAA,QAChC;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAsB,SAA8B;AACzD,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,QACvC,UAAU,SAAS,QAAQ,IAAI;AAAA,QAC/B,SAAS,SAAS,QAAQ,IAAI;AAAA,MAChC;AAAA,IACF;AACA,QAAI,CAAC,SAAS,QAAQ,EAAE,SAAS,OAAO,MAAgB,GAAG;AACzD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,QACvC,UAAU,SAAS,QAAQ,IAAI;AAAA,QAC/B,SAAS,SAAS,QAAQ,IAAI;AAAA,MAChC;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,QAAQA,WAAU,QAAQ,IAAI,CAAC;AAAA,MACvC,UAAU,SAAS,QAAQ,IAAI;AAAA,MAC/B,SAAS,SAAS,QAAQ,IAAI;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,WACE,WACA,QACA,WAAW,MACX,UAAmB,CAAC,GACR;AACZ,QAAI,MAAM,MAAM,GAAG;AACjB,aAAO,KAAK,KAAK,WAAW,OAAO,MAAM,UAAU,OAAO;AAAA,IAC5D;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACrD;AACA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACrD;AACA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACrD;AACA,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,aAAO,KAAK,MAAM,WAAW,QAAQ,OAAO;AAAA,IAC9C;AAEA,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IACnC,OAAO,OACP,OAAO,OACL,CAAC,OAAO,IAAI,IACZ,CAAC;AAEP,QAAI,WAAW;AACf,QAAI,cAAc,UAAU,OAAO,UAAU;AAC3C,iBAAW;AAAA,IACb,WAAW,OAAO,YAAY,MAAM;AAClC,iBAAW;AAAA,IACb,WAAW,MAAM,SAAS,MAAM,GAAG;AACjC,iBAAW;AAAA,IACb;AAGA,QAAI,CAAC,MAAM,QAAQ;AAEjB,UAAI,gBAAgB,QAAQ;AAC1B,eAAO,KAAK,QAAQ,WAAW,QAAQ,OAAO;AAAA,MAChD;AACA,UAAI,WAAW,QAAQ;AACrB,eAAO,KAAK,OAAO,WAAW,QAAQ,MAAM,OAAO;AAAA,MACrD;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ,GAAGA,WAAU,QAAQ,IAAc,CAAC;AAAA,QAC5C,UAAU,SAAS,QAAQ,IAAI;AAAA,QAC/B,UAAU;AAAA,QACV,SAAS;AAAA;AAAA,MACX;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,MAAM,CAAC;AAAA,MACP;AAAA,MACA,EAAE,GAAG,SAAS,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OACE,WACA,QACA,WAAW,MACX,UAAmB,CAAC,GACR;AACZ,UAAM,QAAQ,QAAQ;AACtB,YAAQ,QAAQ;AAChB,UAAM,aAAa,KAAK,WAAW,WAAW,QAAQ,UAAU;AAAA,MAC9D,GAAG;AAAA,MACH,SAAS;AAAA,IACX,CAAC;AAED,QAAI,OAAO;AACT,WAAK,MAAM,WAAW,WAAW,KAAK,MAAM,WAAW,GAAG,GAAG;AAC7D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eACd,QACwB;AACxB,SAAO,CAAC,MAAM,MAAM,MAAM,OAAO,SAAS,YAAY,CAAC,CAAC,OAAO;AACjE;;;AC/0BA;;;ACAA;;;ACAA;;;APwCA,SAAS,SACP,MACA,SACA,MACA;AACA,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,QAAIG,OAAM,MAAM;AAAG;AAEnB,QAAI,CAACC,SAAQ,OAAO,KAAK,KAAK,CAACA,SAAQ,OAAO,KAAK,GAAG;AACpD,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,CAACA,SAAQ,OAAO,KAAK,GAAG;AAC1B,YAAMC,WAAU,OAAO;AACvB,YAAMC,QAAOD,SAAQ,OAAOF,MAAK;AACjC,YAAM,UAAUE,SAAQ,OAAOE,OAAM;AACrC,UAAI,QAAQ,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,SAAS,QAAQ,GAAG;AACzD,QAAAC,QAAO,OAAO,SAAS,IAAI,oBAAoB;AAAA,MACjD;AACA,YAAM,eAAeC;AAAA,QACnB,CAAC;AAAA,QACD,GAAG;AAAA,QACH,GAAGH,MAAK,IAAI,CAAC,QAAQI,WAAU,MAAM,IAAI,IAAI,CAAC;AAAA,MAChD;AACA,aAAO,aAAa;AACpB,aAAO,OAAO;AACd,aAAO,OAAO,QAAQ,YAAY;AAAA,IACpC;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,CAACN,SAAQ,OAAO,KAAK,GAAG;AAC1B,mBAAW,YAAY,OAAO,OAAO;AACnC,gBAAM,QAAQ,OAAO,MAAM,QAAQ;AACnC,cAAID,OAAM,KAAK;AAAG;AAClB,cAAI,CAACC,SAAQ,MAAM,QAAQ,KAAK,OAAO,YAAY;AACjD,mBAAO,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM,SAAS,CAAC,CAAC;AAAA,UAC9D;AAAA,QACF;AAEA,eAAO,OAAO;AACd,iBAAS,MAAM,SAAS,IAAI;AAC5B;AAAA,MACF;AAEA,aAAO,eAAe,CAAC;AAEvB,iBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACjE,YAAID,OAAM,KAAK;AAAG;AAClB,cAAM,UAAUQ,YAAW,GAAG,IAAI,IAAI,SAAS,QAAQ,MAAM,EAAE,CAAC,EAAE;AAClE,aAAK,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AAClC,eAAO,WAAW,QAAQ,IAAI;AAAA,UAC5B,MAAM,wBAAwB,OAAO;AAAA,QACvC;AACA,cAAM,QAAQ,OAAO;AAAA,UACnB,OAAO,QAAQ,MAAM,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAKC,MAAK,MAAM;AAC3D,mBAAO,CAACD,YAAW,GAAG,OAAO,IAAI,GAAG,EAAE,GAAGC,MAAK;AAAA,UAChD,CAAC;AAAA,QACH;AACA,iBAAS,MAAM,OAAO,IAAI;AAAA,MAc5B;AAAA,IACF,WAAW,OAAO,SAAS,SAAS;AAClC,UAAIT,OAAM,OAAO,KAAK;AAAG;AACzB,YAAM,UAAU;AAChB,WAAK,KAAK,EAAE,MAAM,SAAS,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC;AACtD,aAAO,QAAQ;AAAA,QACb,MAAM,wBAAwB,OAAO;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;AACA,eAAsB,SACpB,MACA,UAUA;AACA,QAAM,aAAa,SAAS,QAAQ;AACpC,QAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAC1C,QAAM,SAMF,CAAC;AACL,OAAK,eAAe,CAAC;AACrB,OAAK,WAAW,YAAY,CAAC;AAC7B,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAkC,CAAC;AACzC,mBAAiB,EAAE,KAAK,GAAG,CAAC,OAAO,cAAc;AAI/C,cAAU,cAAc,CAAC;AACzB,SAAK,eAAe,CAAC;AACrB,SAAK,WAAW,YAAY,CAAC;AAC7B,eAAW,UAAU,UAAU,WAAW;AACxC,UAAI,CAAC,oBAAoB,MAAM;AAAG;AAClC,YAAMU,YAAWV,OAAM,UAAU,UAAU,MAAM,CAAoB,IACjEO,WAA0B,MAAM,UAAU,UAAU,MAAM,EAAE,IAAI,IAC/D,UAAU,UAAU,MAAM;AAC/B,UAAI,CAACN,SAAQS,UAAS,OAAO,GAAG;AAC9B,mBAAW,CAAC,aAAa,SAAS,KAAK,OAAO;AAAA,UAC5CA,UAAS;AAAA,QACX,GAAG;AACD,cAAI,qBAAqB,WAAW,GAAG;AACrC,gBAAI,UAAU,UAAU,CAACV,OAAM,UAAU,MAAM,GAAG;AAChD,oBAAM,aAAaQ,YAAW,GAAG,UAAU,WAAW,SAAS;AAC/D,mBAAK,WAAW,QAAQ,UAAU,IAAI,UAAU;AAChD,wBAAU,UAAU,MAAM,EAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,gBACxD,MAAM,wBAAwB,UAAU;AAAA,cAC1C;AAAA,YACF;AAAA,UACF;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI,cAAc,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE;AACtD,UAAM,QACJ,OAAO,MAAM,SAAS,MACrB,OAAO,MAAM,SAAS,IAAI;AAAA,MACzB,SAAS,CAAC;AAAA,MACV,KAAK,SAAS,MAAM,SAAS,UAAUA,YAAW,MAAM,SAAS,CAAC;AAAA,IACpE;AAEF,UAAM,QAAQ,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AACjD,WAAO,OAAO,QAAQ,MAAM,MAAM;AAElC,UAAM,WAAW,SAAS,MAAM,SAAS;AACzC,QAAI,UAAU;AACZ,aAAO,OAAO,SAAS,SAAS,OAAO;AAAA,IACzC;AACA,UAAM,QAAQ,KAAK;AAAA,iBACN,WAAW,SAAS,aAAa,uBAAuB,KAAKG,WAAU,UAAU,WAAW,CAAC;AAAA,SACrGV,SAAQ,UAAU,WAAW,IAAI,KAAK,GAAG,MAAM,SAAS,QAAQ;AAAA;AAAA,iDAExB,MAAM,WAAW;AAAA,uBAC3C,MAAM,MAAM;AAAA,8BACL,MAAM,IAAI;AAAA;AAAA,eAEzB,CAAC,QAAQ,WAAW,EAAE,SAAS,MAAM,WAAW,IAAI,MAAM,SAAS,EAAE;AAAA,YACxE,WAAW,GAAG,SAAS,MAAM,MAAM,gBAAgB;AAAA;AAAA,KAE1D;AAAA,EACH,CAAC;AAED,QAAM,UAAmD,CAAC;AAC1D,WAAS,MAAM,KAAK,WAAW,SAAS,OAAO;AAC/C,aAAW,OAAO,SAAS;AACzB,SAAK,WAAW,QAAQ,IAAI,IAAI,IAAI,IAAI;AAAA,EAC1C;AACA,QAAM;AAAA,IACJ,KAAK,QAAQ,IAAI,GAAG,aAAa;AAAA,IACjC,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EAC9B;AAEA,QAAM,SAAS,OAAO,QAAQ,KAAK,WAAW,OAAO,EAAE,OAErD,CAAC,KAAK,CAAC,MAAM,MAAM,MAAM;AACzB,UAAM,aAAa,IAAI,eAAe,MAAM,CAACW,OAAM,YAAY;AAC7D,UAAI,UAAUC,WAAUD,KAAI,CAAC,OAAO,IAClC;AAAA;AAAA,EAAwE,OAAO;AAAA,IACnF,CAAC;AACD,eAAW,OAAOJ,YAAW,IAAI,GAAG,MAAM;AAC1C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AAAA,IACrC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,OAAOK,WAAU,IAAI,CAAC,OAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAW7BL,YAAW,IAAI,CAAC;AAAA;AAAA;AAAA,QAGpBA,YAAW,IAAI,CAAC;AAAA,QAChB,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,MAGpB;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,SAAS;AAAA,IACb,OAAO,KAAK,MAAM,EACjB,IAAI,CAAC,SAAS,iBAAiBK,WAAU,IAAI,CAAC,SAAS,EACvD,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,UAIL,UAAU;AAAA;AAAA,EAElB,OAAO,KAAK,MAAM,EACjB,IAAI,CAAC,SAAS,cAAcL,YAAW,IAAI,CAAC,UAAUG,WAAU,IAAI,CAAC,GAAG,EACxE,KAAK,IAAI,CAAC;AAAA;AAAA,IAET,UAAU;AAAA;AAAA;AAAA;AAAA,MAIR,OAAO,KAAK,MAAM,EACjB;AAAA,IACC,CAAC,SACC,QAAQA,WAAU,IAAI,CAAC,MAAMH,YAAW,IAAI,CAAC;AAAA,EACjD,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBf,QAAM,WAAW,QAAQ;AAAA,IACvB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAED,QAAM,WAAW,QAAQ;AAAA,IACvB,qBAAqB,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,GAAG;AAAA,MACpE,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,IACD,qBAAqB,MAAM,mBAAmB,KAAK,QAAQ,QAAQ,GAAG;AAAA,MACpE,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,IACD,sBAAsB,MAAM,mBAAmB,KAAK,QAAQ,SAAS,GAAG;AAAA,MACtE,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,IACD,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,CAAC;AACD,QAAM,WAAW,QAAQ;AAAA,IACvB,gBAAgB,GAAG,MAAM,mBAAmB,KAAK,MAAM,GAAG;AAAA,MACxD,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,OAAO,QAAQ;AACb,eAAO,OAAO,OAAO,KAAK,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF,CAAC,CAAC,GAAG,MAAM;AAAA,EACb,CAAC;AAED,QAAM,WAAW,SAAS,QAAQ;AAAA,IAChC,gBAAgB;AAAA,MACd,gBAAgB;AAAA,MAChB,SAAS,KAAK,UAAU;AAAA,QACtB,MAAM,SAAS,OACX,GAAGK,WAAU,WAAW,YAAY,CAAC,CAAC,SACtC;AAAA,QACJ,SAAS;AAAA,QACT,aAAa;AAAA,UACX,KAAK;AAAA,QACP;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,SAAS,aAAa;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AAgBA,SAAS,SAAS,MAAqB,EAAE,OAAO,UAAU,GAAc;AACtE,QAAM,SAAkC,CAAC;AACzC,QAAM,YAAYL,YAAW,GAAG,UAAU,WAAW,QAAQ;AAC7D,MAAI,cAAc;AAClB,MAAI,SAAS;AAEb,MAAI,CAACP,SAAQ,UAAU,WAAW,GAAG;AACnC,UAAM,cAAcD,OAAM,UAAU,WAAW,IAC3CO,WAA6B,MAAM,UAAU,YAAY,IAAI,IAC7D,UAAU;AAEd,eAAW,QAAQ,YAAY,SAAS;AACtC,YAAM,WAAWP,OAAM,YAAY,QAAQ,IAAI,EAAE,MAAM,IACnDO,WAAU,MAAM,YAAY,QAAQ,IAAI,EAAE,OAAO,IAAI,IACrD,YAAY,QAAQ,IAAI,EAAE;AAC9B,UAAI,CAAC,UAAU;AACb,gBAAQ;AAAA,UACN,wBAAwB,IAAI,OAAO,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,QAC/D;AACA;AAAA,MACF;AAEA,YAAM,aAAa,IAAI,eAAe,MAAM,CAAC,MAAM,YAAY;AAC7D,eAAO,KAAK,UAAU,IAAI,OAAO,CAAC,IAChC;AAAA;AAAA,EAAsG,OAAO;AAAA,MACjH,CAAC;AACD,YAAM,aAAa,WAAW,OAAO,WAAW,UAAU,MAAM;AAAA,QAC9D,OAAO,eAAe,QAAQ,IAAI,SAAY;AAAA,MAChD,CAAC;AACD,eAAS,WAAW;AACpB,YAAM,CAAC,WAAW,YAAY,IAAI,gBAAgB,IAAI,EAAE,KAAK,MAAM,GAAG;AACtE,UAAI,cAAc,eAAe;AAC/B,sBAAc,qBAAqB,IAAI;AAAA,MACzC,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IAiBF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,WAAW,aAAa,OAAO;AAClD;AAEA,SAAS,SAAS,MAAqB,WAA4B;AACjE,QAAM,aAAaC,YAAW,GAAG,UAAU,WAAW,SAAS;AAC/D,YAAU,cAAc,CAAC;AACzB,QAAM,UAAkC,CAAC;AACzC,aAAW,UAAU,UAAU,WAAW;AACxC,UAAM,WAAWR,OAAM,UAAU,UAAU,MAAM,CAAoB,IACjEO,WAA0B,MAAM,UAAU,UAAU,MAAM,EAAE,IAAI,IAC/D,UAAU,UAAU,MAAM;AAC/B,eAAW,QAAQ,SAAS,SAAS;AACnC,YAAM,EAAE,OAAO,IAAI,SAAS,QAAQ,IAAI;AACxC,UAAI,CAAC,QAAQ;AACX,gBAAQ;AAAA,UACN,wBAAwB,IAAI,OAAO,UAAU,WAAW;AAAA,QAC1D;AACA;AAAA,MACF;AACA,YAAM,aAAa,IAAI,eAAe,MAAM,CAAC,MAAM,YAAY;AAAA,MAG/D,CAAC;AACD,UAAI,uBAAuB,IAAI,GAAG;AAChC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,MACF;AACA,UAAI,qBAAqB,IAAI,GAAG;AAC9B,cAAM,aAAa,WAAW,OAAO,YAAY,QAAQ,MAAM;AAAA;AAAA,UAE7D,QAAQ;AAAA,QACV,CAAC;AACD,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,yDAAyD,WAAW,QAAQ;AAAA,UACpF,YAAY,WAAW;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;",
6
- "names": ["merge", "assert", "camelcase", "followRef", "isEmpty", "isRef", "notRef", "pascalcase", "snakecase", "parse", "camelcase", "nullable", "name", "isRef", "isEmpty", "schemas", "refs", "notRef", "assert", "merge", "followRef", "pascalcase", "value", "response", "camelcase", "name", "snakecase"]
4
+ "sourcesContent": ["import { parse as partContentType } from 'fast-content-type-parse';\nimport { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n OpenAPIObject,\n OperationObject,\n ReferenceObject,\n RequestBodyObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\nimport yaml from 'yaml';\n\nimport {\n followRef,\n isEmpty,\n isRef,\n notRef,\n pascalcase,\n snakecase,\n} from '@sdk-it/core';\nimport { getFolderExportsV2, writeFiles } from '@sdk-it/core/file-system.js';\nimport {\n type Operation,\n forEachOperation,\n isStreamingContentType,\n isSuccessStatusCode,\n parseJsonContentType,\n} from '@sdk-it/spec';\n\nimport { DartSerializer, isObjectSchema } from './dart-emitter.ts';\nimport dispatcherTxt from './http/dispatcher.txt';\nimport interceptorsTxt from './http/interceptors.txt';\nimport responsesTxt from './http/responses.txt';\n\nfunction tuneSpec(\n spec: OpenAPIObject,\n schemas: Record<string, SchemaObject | ReferenceObject>,\n refs: { name: string; value: SchemaObject }[],\n) {\n for (const [name, schema] of Object.entries(schemas)) {\n if (isRef(schema)) continue;\n\n if (!isEmpty(schema.anyOf) && !isEmpty(schema.oneOf)) {\n delete schema.anyOf;\n }\n if (!isEmpty(schema.allOf)) {\n const schemas = schema.allOf;\n const refs = schemas.filter(isRef);\n const nonRefs = schemas.filter(notRef);\n if (nonRefs.some((it) => it.type && it.type !== 'object')) {\n assert(false, `allOf ${name} must be an object`);\n }\n const objectSchema = merge(\n {},\n ...nonRefs,\n ...refs.map((ref) => followRef(spec, ref.$ref)),\n );\n delete objectSchema.allOf;\n delete schema.allOf;\n Object.assign(schema, objectSchema);\n }\n\n if (schema.type === 'object') {\n if (!isEmpty(schema.oneOf)) {\n for (const oneOfIdx in schema.oneOf) {\n const oneOf = schema.oneOf[oneOfIdx];\n if (isRef(oneOf)) continue;\n if (!isEmpty(oneOf.required) && schema.properties) {\n schema.oneOf[oneOfIdx] = schema.properties[oneOf.required[0]];\n }\n }\n\n delete schema.type;\n tuneSpec(spec, schemas, refs);\n continue;\n }\n\n schema.properties ??= {};\n\n for (const [propName, value] of Object.entries(schema.properties)) {\n if (isRef(value)) continue;\n const refName = pascalcase(`${name} ${propName.replace('[]', '')}`);\n refs.push({ name: refName, value });\n schema.properties[propName] = {\n $ref: `#/components/schemas/${refName}`,\n };\n const props = Object.fromEntries(\n Object.entries(value.properties ?? {}).map(([key, value]) => {\n return [pascalcase(`${refName} ${key}`), value];\n }),\n );\n tuneSpec(spec, props, refs);\n // if (value.oneOf && Array.isArray(value.oneOf) && value.oneOf.length) {\n // for (const oneOfIdx in value.oneOf) {\n // const oneOf = value.oneOf[oneOfIdx];\n // if (isRef(oneOf)) continue;\n // if (oneOf.type === 'string') {\n // console.log(refName);\n // // const refName= pascalcase(`${name} ${key} ${oneOfIdx}`);\n // // schema.oneOf[oneOfIdx] = {\n // // $ref: `#/components/schemas/${refName}`,\n // // };\n // }\n // }\n // }\n }\n } else if (schema.type === 'array') {\n if (isRef(schema.items)) continue;\n const refName = name;\n refs.push({ name: refName, value: schema.items ?? {} });\n schema.items = {\n $ref: `#/components/schemas/${refName}`,\n };\n }\n }\n}\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: { output: string }) => void | Promise<void>;\n },\n) {\n const clientName = settings.name || 'Client';\n const output = join(settings.output, 'lib');\n const groups: Record<\n string,\n {\n use: string;\n methods: string[];\n }\n > = {};\n spec.components ??= {};\n spec.components.schemas ??= {};\n const inputs: Record<string, string> = {};\n const outputs: Record<string, string> = {};\n forEachOperation({ spec }, (entry, operation) => {\n // if (entry.path !== '/v6/prepareUpload') {\n // return;\n // }\n operation.responses ??= {};\n spec.components ??= {};\n spec.components.schemas ??= {};\n for (const status in operation.responses) {\n if (!isSuccessStatusCode(status)) continue;\n const response = operation.responses[status];\n if (!isEmpty(response.content)) {\n for (const [contentType, mediaType] of Object.entries(\n response.content,\n )) {\n if (parseJsonContentType(contentType)) {\n if (mediaType.schema && !isRef(mediaType.schema)) {\n const outputName = pascalcase(`${operation.operationId} output`);\n spec.components.schemas[outputName] = mediaType.schema;\n operation.responses[status].content ??= {};\n operation.responses[status].content[contentType].schema = {\n $ref: `#/components/schemas/${outputName}`,\n };\n }\n }\n // handle chunked response\n }\n }\n }\n console.log(`Processing ${entry.method} ${entry.path}`);\n const group =\n groups[entry.groupName] ??\n (groups[entry.groupName] = {\n methods: [],\n use: `final ${entry.groupName} = new ${pascalcase(entry.groupName)}();`,\n });\n\n const input = toInputs(spec, { entry, operation });\n Object.assign(inputs, input.inputs);\n\n const response = toOutput(spec, operation);\n if (response) {\n Object.assign(outputs, response.outputs);\n }\n group.methods.push(`\n Future<${response ? response.returnType : 'http.StreamedResponse'}> ${camelcase(operation.operationId)}(\n ${isEmpty(operation.requestBody) ? '' : `${input.inputName} input`}\n ) async {\n final stream = await this.dispatcher.${input.contentType}(RequestConfig(\n method: '${entry.method}',\n url: Uri.parse('${entry.path}'),\n headers: {},\n ), ${['json', 'multipart'].includes(input.contentType) ? input.encode : ``});\n ${response ? `${response.decode};` : 'return stream;'}\n }\n `);\n });\n\n const newRefs: { name: string; value: SchemaObject }[] = [];\n tuneSpec(spec, spec.components.schemas, newRefs);\n for (const ref of newRefs) {\n spec.components.schemas[ref.name] = ref.value;\n }\n await writeFile(\n join(process.cwd(), 'openai.json'),\n JSON.stringify(spec, null, 2),\n );\n\n const models = Object.entries(spec.components.schemas).reduce<\n Record<string, string>\n >((acc, [name, schema]) => {\n const serializer = new DartSerializer(spec, (name, content) => {\n acc[`models/${snakecase(name)}.dart`] =\n `import 'dart:io';import 'dart:typed_data'; import './index.dart';\\n\\n${content}`;\n });\n serializer.handle(pascalcase(name), schema);\n return acc;\n }, {});\n\n const clazzez = Object.entries(groups).reduce<Record<string, string>>(\n (acc, [name, { methods }]) => {\n return {\n ...acc,\n [`api/${snakecase(name)}.dart`]: `\nimport 'dart:convert';\n\nimport 'package:http/http.dart' as http;\n\nimport '../interceptors.dart';\nimport '../inputs/index.dart';\nimport '../outputs/index.dart';\nimport '../models/index.dart';\nimport '../http.dart';\n\n class ${pascalcase(name)}Client {\n final Dispatcher dispatcher;\n final Receiver receiver;\n ${pascalcase(name)}Client(this.dispatcher, this.receiver);\n ${methods.join('\\n')}\n }\n `,\n };\n },\n {},\n );\n\n const client = `\n ${Object.keys(groups)\n .map((name) => `import './api/${snakecase(name)}.dart';`)\n .join('\\n')}\nimport './interceptors.dart';\nimport './http.dart';\n\n class ${clientName} {\n final Options options;\n${Object.keys(groups)\n .map((name) => `late final ${pascalcase(name)}Client ${camelcase(name)};`)\n .join('\\n')}\n\n ${clientName}(this.options) {\n final interceptors = [BaseUrlInterceptor(() => this.options.baseUrl)];\n final dispatcher = Dispatcher(interceptors);\n final receiver = Receiver(interceptors);\n ${Object.keys(groups)\n .map(\n (name) =>\n `this.${camelcase(name)} = ${pascalcase(name)}Client(dispatcher, receiver);`,\n )\n .join('\\n')}\n\n }\n\n void setOptions({String? baseUrl}) {\n if (baseUrl != null) {\n options.baseUrl = baseUrl;\n }\n }\n }\n\n\nclass Options {\n String baseUrl;\n Options({required this.baseUrl});\n}\n\n `;\n await writeFiles(output, {\n ...models,\n ...inputs,\n ...outputs,\n });\n\n await writeFiles(output, {\n 'models/index.dart': await getFolderExportsV2(join(output, 'models'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'inputs/index.dart': await getFolderExportsV2(join(output, 'inputs'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'outputs/index.dart': await getFolderExportsV2(join(output, 'outputs'), {\n exportSyntax: 'export',\n extensions: 'dart',\n }),\n 'interceptors.dart': interceptorsTxt,\n 'http.dart': dispatcherTxt,\n 'responses.dart': responsesTxt,\n ...clazzez,\n });\n await writeFiles(output, {\n 'package.dart': `${await getFolderExportsV2(join(output), {\n exportSyntax: 'export',\n extensions: 'dart',\n ignore(dirent) {\n return dirent.isFile() && dirent.name === 'package.dart';\n },\n })}${client}`,\n });\n\n await writeFiles(settings.output, {\n 'pubspec.yaml': {\n ignoreIfExists: true,\n content: yaml.stringify({\n name: settings.name\n ? `${snakecase(clientName.toLowerCase())}_sdk`\n : 'sdk',\n version: '0.0.1',\n environment: {\n sdk: '^3.7.2',\n },\n dependencies: {\n http: '^1.3.0',\n mime: '^2.0.0',\n },\n }),\n },\n });\n\n await settings.formatCode?.({\n output: output,\n });\n}\n\n// function makeRequestBody(spec: OpenAPIObject, operation: OperationObject) {\n// const requestBody = operation.requestBody;\n// const params = (operation.parameters ?? []).map((it) =>\n// isRef(it) ? followRef<ParameterObject>(spec, it.$ref) : it,\n// );\n// if (!requestBody) return {\n\n// }\n// if (isRef(requestBody)) {\n// return followRef<RequestBodyObject>(operation, requestBody.$ref);\n// }\n// return requestBody;\n// }\n\nfunction toInputs(spec: OpenAPIObject, { entry, operation }: Operation) {\n const inputs: Record<string, unknown> = {};\n const inputName = pascalcase(`${operation.operationId} input`);\n let contentType = 'empty';\n let encode = '';\n\n if (!isEmpty(operation.requestBody)) {\n const requestBody = isRef(operation.requestBody)\n ? followRef<RequestBodyObject>(spec, operation.requestBody.$ref)\n : operation.requestBody;\n\n for (const type in requestBody.content) {\n const ctSchema = isRef(requestBody.content[type].schema)\n ? followRef(spec, requestBody.content[type].schema.$ref)\n : requestBody.content[type].schema;\n if (!ctSchema) {\n console.warn(\n `Schema not found for ${type} in ${entry.method} ${entry.path}`,\n );\n continue;\n }\n\n const serializer = new DartSerializer(spec, (name, content) => {\n inputs[join(`inputs/${name}.dart`)] =\n `import 'dart:io';import 'dart:typed_data';import '../models/index.dart'; import './index.dart';\\n\\n${content}`;\n });\n const serialized = serializer.handle(inputName, ctSchema, true, {\n alias: isObjectSchema(ctSchema) ? undefined : inputName,\n });\n encode = serialized.encode as string;\n const [mediaType, mediaSubType] = partContentType(type).type.split('/');\n if (mediaType === 'application') {\n contentType = parseJsonContentType(type) as string;\n } else {\n contentType = mediaType;\n }\n\n // const schema = merge({}, objectSchema, {\n // required: additionalProperties\n // .filter((p) => p.required)\n // .map((p) => p.name),\n // properties: additionalProperties.reduce<Record<string, unknown>>(\n // (acc, p) => ({\n // ...acc,\n // [p.name]: p.schema,\n // }),\n // {},\n // ),\n // });\n\n // Object.assign(inputs, bodyInputs(config, objectSchema));\n // schemas[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n }\n\n return { inputs, inputName, contentType, encode };\n}\n\nfunction toOutput(spec: OpenAPIObject, operation: OperationObject) {\n const outputName = pascalcase(`${operation.operationId} output`);\n operation.responses ??= {};\n const outputs: Record<string, string> = {};\n for (const status in operation.responses) {\n const response = isRef(operation.responses[status] as ReferenceObject)\n ? followRef<ResponseObject>(spec, operation.responses[status].$ref)\n : (operation.responses[status] as ResponseObject);\n for (const type in response.content) {\n const { schema } = response.content[type];\n if (!schema) {\n console.warn(\n `Schema not found for ${type} in ${operation.operationId}`,\n );\n continue;\n }\n const serializer = new DartSerializer(spec, (name, content) => {\n // outputs[join(`outputs/${name}.dart`)] =\n // `import 'dart:typed_data'; import '../models/index.dart'; \\n\\n${content}`;\n });\n if (isStreamingContentType(type)) {\n return {\n type: 'stream',\n outputName,\n outputs,\n decode: `return stream`,\n returnType: `http.StreamedResponse`,\n };\n }\n if (parseJsonContentType(type)) {\n const serialized = serializer.handle(outputName, schema, true, {\n // alias: outputName,\n noEmit: true,\n });\n return {\n type: 'json',\n outputName,\n outputs,\n decode: `final json = await this.receiver.json(stream); return ${serialized.fromJson}`,\n returnType: serialized.use,\n };\n }\n }\n }\n return null;\n}\n", "import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport { parse } from 'yaml';\n\nexport async function loadLocal(location: string) {\n const extName = extname(location);\n const text = await readFile(location, 'utf-8');\n switch (extName) {\n case '.json':\n return JSON.parse(text);\n case '.yaml':\n case '.yml':\n return parse(text);\n default:\n throw new Error(`Unsupported file extension: ${extName}`);\n }\n}\n", "import { extname } from 'node:path';\nimport { parse } from 'yaml';\n\nexport async function loadRemote<T>(location: string): Promise<T> {\n const extName = extname(location);\n const response = await fetch(location);\n switch (extName) {\n case '.json':\n return response.json() as Promise<T>;\n case '.yaml':\n case '.yml': {\n const text = await response.text();\n return parse(text);\n }\n default:\n try {\n // try to parse it as json first\n return response.json() as Promise<T>;\n } catch {\n // parse as yaml\n const text = await response.text();\n return parse(text) as Promise<T>;\n }\n }\n}\n", "import type {\n OpenAPIObject,\n OperationObject,\n ParameterObject,\n ReferenceObject,\n ResponseObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\n\nimport { followRef, isRef } from '@sdk-it/core';\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId' | 'tag'>> = {\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return camelcase(operation.operationId);\n }\n const metadata = operation['x-oaiMeta'];\n if (metadata && metadata.name) {\n return camelcase(metadata.name);\n }\n return camelcase(\n [method, ...path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').split(' ')]\n .filter(Boolean)\n .join(' ')\n .trim(),\n );\n },\n tag: (operation, path) => {\n return operation.tags?.[0]\n ? sanitizeTag(operation.tags?.[0])\n : determineGenericTag(path, operation);\n },\n};\n\nexport type TunedOperationObject = Omit<\n OperationObject,\n 'operationId' | 'parameters' | 'responses'\n> & {\n operationId: string;\n parameters: (ParameterObject | ReferenceObject)[];\n responses: Record<string, ResponseObject>;\n};\n\nexport interface OperationEntry {\n name?: string;\n method: string;\n path: string;\n groupName: string;\n tag: string;\n}\nexport type Operation = {\n entry: OperationEntry;\n operation: TunedOperationObject;\n};\n\nfunction resolveResponses(spec: OpenAPIObject, operation: OperationObject) {\n const responses = operation.responses ?? {};\n const resolved: Record<string, ResponseObject> = {};\n for (const status in responses) {\n const response = isRef(responses[status] as ReferenceObject)\n ? followRef<ResponseObject>(spec, responses[status].$ref)\n : (responses[status] as ResponseObject);\n resolved[status] = response;\n }\n return resolved;\n}\n\nexport function forEachOperation<T>(\n config: GenerateSdkConfig,\n callback: (entry: OperationEntry, operation: TunedOperationObject) => T,\n) {\n const result: T[] = [];\n for (const [path, pathItem] of Object.entries(config.spec.paths ?? {})) {\n const { parameters = [], ...methods } = pathItem;\n\n // Convert Express-style routes (:param) to OpenAPI-style routes ({param})\n const fixedPath = path.replace(/:([^/]+)/g, '{$1}');\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 formatTag = config.tag ?? defaults.tag;\n const operationName = formatOperationId(operation, fixedPath, method);\n const operationTag = formatTag(operation, fixedPath);\n const metadata = operation['x-oaiMeta'] ?? {};\n\n result.push(\n callback(\n {\n name: metadata.name,\n method,\n path: fixedPath,\n groupName: operationTag,\n tag: operationTag,\n },\n {\n ...operation,\n parameters: [...parameters, ...(operation.parameters ?? [])],\n operationId: operationName,\n responses: resolveResponses(config.spec, operation),\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 tag?: (operation: OperationObject, path: string) => string;\n}\n\n/**\n * Set of reserved TypeScript keywords and common verbs potentially used as tags.\n */\n\nconst reservedKeywords = new Set([\n 'await', // Reserved in async functions\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'enum',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'implements', // Strict mode\n 'import',\n 'in',\n 'instanceof',\n 'interface', // Strict mode\n 'let', // Strict mode\n 'new',\n 'null',\n 'package', // Strict mode\n 'private', // Strict mode\n 'protected', // Strict mode\n 'public', // Strict mode\n 'return',\n 'static', // Strict mode\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield', // Strict mode / Generator functions\n // 'arguments' is not technically a reserved word, but it's a special identifier within functions\n // and assigning to it or declaring it can cause issues or unexpected behavior.\n 'arguments',\n]);\n\n/**\n * Sanitizes a potential tag name (assumed to be already camelCased)\n * to avoid conflicts with reserved keywords or invalid starting characters (numbers).\n * Appends an underscore if the tag matches a reserved keyword.\n * Prepends an underscore if the tag starts with a number.\n * @param camelCasedTag The potential tag name, already camelCased.\n * @returns The sanitized tag name.\n */\nfunction sanitizeTag(camelCasedTag: string): string {\n // Prepend underscore if starts with a number\n if (/^\\d/.test(camelCasedTag)) {\n return `_${camelCasedTag}`;\n }\n // Append underscore if it's a reserved keyword\n return reservedKeywords.has(camelcase(camelCasedTag))\n ? `${camelCasedTag}_`\n : camelCasedTag;\n}\n\n/**\n * Attempts to determine a generic tag for an OpenAPI operation based on path and operationId.\n * Rules and fallbacks are documented within the code.\n * @param pathString The path string.\n * @param operation The OpenAPI Operation Object.\n * @returns A sanitized, camelCased tag name string.\n */\nexport function determineGenericTag(\n pathString: string,\n operation: OperationObject,\n): string {\n const operationId = operation.operationId || '';\n const VERSION_REGEX = /^[vV]\\d+$/;\n const commonVerbs = new Set([\n // Verbs to potentially strip from operationId prefix\n 'get',\n 'list',\n 'create',\n 'update',\n 'delete',\n 'post',\n 'put',\n 'patch',\n 'do',\n 'send',\n 'add',\n 'remove',\n 'set',\n 'find',\n 'search',\n 'check',\n 'make',\n ]);\n\n const segments = pathString.split('/').filter(Boolean);\n\n const potentialCandidates = segments.filter(\n (segment) =>\n segment &&\n !segment.startsWith('{') &&\n !segment.endsWith('}') &&\n !VERSION_REGEX.test(segment),\n );\n\n // --- Heuristic 1: Last non-'@' path segment ---\n for (let i = potentialCandidates.length - 1; i >= 0; i--) {\n const segment = potentialCandidates[i];\n if (!segment.startsWith('@')) {\n // Sanitize just before returning\n return sanitizeTag(camelcase(segment));\n }\n }\n\n const canFallbackToPathSegment = potentialCandidates.length > 0;\n\n // --- Heuristic 2: OperationId parsing ---\n if (operationId) {\n const lowerOpId = operationId.toLowerCase();\n const parts = operationId\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-zA-Z])(\\d)/g, '$1_$2')\n .replace(/(\\d)([a-zA-Z])/g, '$1_$2')\n .toLowerCase()\n .split(/[_-\\s]+/);\n\n const validParts = parts.filter(Boolean);\n\n // Quick skip: If opId is just a verb and we can use Heuristic 3, prefer that.\n if (\n commonVerbs.has(lowerOpId) &&\n validParts.length === 1 &&\n canFallbackToPathSegment\n ) {\n // Proceed directly to Heuristic 3\n }\n // Only process if there are valid parts and the quick skip didn't happen\n else if (validParts.length > 0) {\n const firstPart = validParts[0];\n const isFirstPartVerb = commonVerbs.has(firstPart);\n\n // Case 2a: Starts with verb, has following parts\n if (isFirstPartVerb && validParts.length > 1) {\n const verbPrefixLength = firstPart.length;\n let nextPartStartIndex = -1;\n if (operationId.length > verbPrefixLength) {\n // Simplified check for next part start\n const charAfterPrefix = operationId[verbPrefixLength];\n if (charAfterPrefix >= 'A' && charAfterPrefix <= 'Z') {\n nextPartStartIndex = verbPrefixLength;\n } else if (charAfterPrefix >= '0' && charAfterPrefix <= '9') {\n nextPartStartIndex = verbPrefixLength;\n } else if (['_', '-'].includes(charAfterPrefix)) {\n nextPartStartIndex = verbPrefixLength + 1;\n } else {\n const match = operationId\n .substring(verbPrefixLength)\n .match(/[A-Z0-9]/);\n if (match && match.index !== undefined) {\n nextPartStartIndex = verbPrefixLength + match.index;\n }\n if (\n nextPartStartIndex === -1 &&\n operationId.length > verbPrefixLength\n ) {\n nextPartStartIndex = verbPrefixLength; // Default guess\n }\n }\n }\n\n if (\n nextPartStartIndex !== -1 &&\n nextPartStartIndex < operationId.length\n ) {\n const remainingOriginalSubstring =\n operationId.substring(nextPartStartIndex);\n const potentialTag = camelcase(remainingOriginalSubstring);\n if (potentialTag) {\n // Sanitize just before returning\n return sanitizeTag(potentialTag);\n }\n }\n\n // Fallback: join remaining lowercased parts\n const potentialTagJoined = camelcase(validParts.slice(1).join('_'));\n if (potentialTagJoined) {\n // Sanitize just before returning\n return sanitizeTag(potentialTagJoined);\n }\n }\n\n // Case 2b: Doesn't start with verb, or only one part (might be verb)\n const potentialTagFull = camelcase(operationId);\n if (potentialTagFull) {\n const isResultSingleVerb = validParts.length === 1 && isFirstPartVerb;\n\n // Avoid returning only a verb if Heuristic 3 is possible\n if (!(isResultSingleVerb && canFallbackToPathSegment)) {\n if (potentialTagFull.length > 0) {\n // Sanitize just before returning\n return sanitizeTag(potentialTagFull);\n }\n }\n }\n\n // Case 2c: Further fallbacks within OpId if above failed/skipped\n const firstPartCamel = camelcase(firstPart);\n if (firstPartCamel) {\n const isFirstPartCamelVerb = commonVerbs.has(firstPartCamel);\n if (\n !isFirstPartCamelVerb ||\n validParts.length === 1 ||\n !canFallbackToPathSegment\n ) {\n // Sanitize just before returning\n return sanitizeTag(firstPartCamel);\n }\n }\n if (\n isFirstPartVerb &&\n validParts.length > 1 &&\n validParts[1] &&\n canFallbackToPathSegment\n ) {\n const secondPartCamel = camelcase(validParts[1]);\n if (secondPartCamel) {\n // Sanitize just before returning\n return sanitizeTag(secondPartCamel);\n }\n }\n } // End if(validParts.length > 0) after quick skip check\n } // End if(operationId)\n\n // --- Heuristic 3: First path segment (stripping '@') ---\n if (potentialCandidates.length > 0) {\n let firstCandidate = potentialCandidates[0];\n if (firstCandidate.startsWith('@')) {\n firstCandidate = firstCandidate.substring(1);\n }\n if (firstCandidate) {\n // Sanitize just before returning\n return sanitizeTag(camelcase(firstCandidate));\n }\n }\n\n // --- Heuristic 4: Default ---\n console.warn(\n `Could not determine a suitable tag for path: ${pathString}, operationId: ${operationId}. Using 'unknown'.`,\n );\n return 'unknown'; // 'unknown' is safe\n}\n\nexport function parseJsonContentType(contentType: string | null | undefined) {\n if (!contentType) {\n return null;\n }\n\n // 1. Trim whitespace\n let mainType = contentType.trim();\n\n // 2. Remove parameters (anything after the first ';')\n const semicolonIndex = mainType.indexOf(';');\n if (semicolonIndex !== -1) {\n mainType = mainType.substring(0, semicolonIndex).trim(); // Trim potential space before ';'\n }\n\n // 3. Convert to lowercase for case-insensitive comparison\n mainType = mainType.toLowerCase();\n\n if (mainType.endsWith('/json')) {\n return mainType.split('/')[1];\n } else if (mainType.endsWith('+json')) {\n return mainType.split('+')[1];\n }\n return null;\n}\n\n/**\n * Checks if a given content type string represents Server-Sent Events (SSE).\n * Handles case-insensitivity, parameters (like charset), and leading/trailing whitespace.\n *\n * @param contentType The content type string to check (e.g., from a Content-Type header).\n * @returns True if the content type is 'text/event-stream', false otherwise.\n */\nexport function isSseContentType(\n contentType: string | null | undefined,\n): boolean {\n if (!contentType) {\n return false; // Handle null, undefined, or empty string\n }\n\n // 1. Trim whitespace from the input string\n let mainType = contentType.trim();\n\n // 2. Find the position of the first semicolon (if any) to remove parameters\n const semicolonIndex = mainType.indexOf(';');\n if (semicolonIndex !== -1) {\n // Extract the part before the semicolon and trim potential space\n mainType = mainType.substring(0, semicolonIndex).trim();\n }\n\n // 3. Convert the main type part to lowercase for case-insensitive comparison\n mainType = mainType.toLowerCase();\n\n // 4. Compare against the standard SSE MIME type\n return mainType === 'text/event-stream';\n}\n\nexport function isStreamingContentType(\n contentType: string | null | undefined,\n): boolean {\n return contentType === 'application/octet-stream';\n}\n\nexport function isSuccessStatusCode(statusCode: number | string): boolean {\n statusCode = Number(statusCode);\n return statusCode >= 200 && statusCode < 300;\n}\n", "import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, snakecase } from 'stringcase';\n\nimport {\n cleanRef,\n followRef,\n isEmpty,\n isRef,\n notRef,\n parseRef,\n pascalcase,\n} from '@sdk-it/core';\n\nconst formatName = (it: any): string => {\n const startsWithDigitPattern = /^-?\\d/;\n // 1. Handle numbers\n if (typeof it === 'number') {\n if (Math.sign(it) === -1) {\n return `$_${Math.abs(it)}`;\n }\n return `$${it}`;\n }\n\n // 2. Handle the specific string 'default'\n if (it === 'default') {\n return '$default';\n }\n\n // 3. Handle other strings\n if (typeof it === 'string') {\n // 3a. Check if the string starts with a digit FIRST\n if (startsWithDigitPattern.test(it)) {\n if (typeof it === 'number') {\n if (Math.sign(it) === -1) {\n return `$_${Math.abs(it)}`;\n }\n return `$${it}`;\n }\n }\n\n // 3b. If not starting with a digit, handle brackets and snake_case\n let nameToFormat = it;\n\n // Remove a single leading '[' if present\n if (nameToFormat.startsWith('[')) {\n nameToFormat = nameToFormat.slice(1);\n }\n\n // Remove a single trailing ']' if present\n if (nameToFormat.endsWith(']')) {\n nameToFormat = nameToFormat.slice(0, -1);\n }\n\n // Apply snakecase to the (potentially modified) string\n return snakecase(nameToFormat);\n }\n\n // 4. Fallback for any other types (e.g., null, undefined, objects)\n // Convert to string first, then apply snakecase\n return snakecase(String(it));\n};\n\ntype Context = Record<string, any>;\ntype Serialized = {\n nullable?: boolean;\n encode?: string;\n use: string;\n toJson: string;\n matches?: string;\n fromJson: string;\n type?: string;\n content: string;\n simple?: boolean;\n};\ntype Emit = (name: string, content: string) => void;\n/**\n * Convert an OpenAPI (JSON Schema style) object into Dart classes\n */\nexport class DartSerializer {\n #spec: OpenAPIObject;\n #emit: Emit;\n\n constructor(spec: OpenAPIObject, emit: Emit) {\n this.#spec = spec;\n this.#emit = emit;\n }\n\n #getRefUsage(schemaName: string, list: string[] = []): string[] {\n this.#spec.components ??= {};\n this.#spec.components.schemas ??= {};\n this.#spec.components.responses ??= {};\n\n const checkSchema = (schema: SchemaObject | ReferenceObject): boolean => {\n if (isRef(schema)) {\n const { model } = parseRef(schema.$ref);\n return model === schemaName;\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return (schema.oneOf as Array<SchemaObject | ReferenceObject>).some(\n (subSchema) => checkSchema(subSchema),\n );\n }\n if (\n schema.type === 'array' &&\n schema.items &&\n notRef(schema.items) &&\n schema.items.oneOf\n ) {\n return checkSchema(schema.items);\n }\n return false;\n };\n\n for (const [key, value] of Object.entries(this.#spec.components.schemas)) {\n if (checkSchema(value)) {\n list.push(key);\n }\n }\n\n return list;\n }\n\n #object(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n if (schema.additionalProperties) {\n this.#emit(className, `typedef ${className} = Map<String, dynamic>;`);\n return {\n content: '',\n use: 'Map<String, dynamic>',\n encode: 'input',\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${camelcase(context.name)}']`,\n matches: `json['${camelcase(context.name)}'] is Map<String, dynamic>`,\n };\n }\n if (isEmpty(schema.properties)) {\n if (context.noEmit !== true) {\n this.#emit(\n className,\n `class ${className} {\n const ${className}(); // Add const constructor\n\n factory ${className}.fromJson(Map<String, dynamic> json) {\n return const ${className}();\n }\n\n Map<String, dynamic> toJson() => {};\n\n /// Determines if a given map can be parsed into an instance of this class.\n /// Returns true for any map since this class has no properties.\n static bool matches(Map<String, dynamic> json) {\n return true; // Any map is fine for an empty object\n }\n}`,\n );\n }\n return {\n content: '',\n encode: 'input.toJson()',\n use: className,\n toJson: `${this.#safe(context.name as string, context.required)}`,\n fromJson: `${className}.fromJson(json['${context.name}'])`,\n matches: `${className}.matches(json['${context.name}'])`,\n };\n }\n\n const props: string[] = [];\n const toJsonProperties: string[] = [];\n const constructorParams: string[] = [];\n const fromJsonParams: string[] = [];\n const matches: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propName = key.replace('[]', '');\n const required = (schema.required ?? []).includes(key);\n const typeStr = this.handle(className, propSchema, required, {\n name: propName,\n required,\n propName: [className, propName].filter(Boolean).join('_'),\n });\n const nullable = typeStr.nullable || !required;\n const nullableSuffix = nullable ? '?' : '';\n props.push(\n `final ${typeStr.use}${nullableSuffix} ${camelcase(propName)};`,\n );\n fromJsonParams.push(`${camelcase(propName)}: ${typeStr.fromJson}`);\n toJsonProperties.push(`'${propName}': ${typeStr.toJson}`);\n constructorParams.push(\n `${required ? 'required ' : ''}this.${camelcase(propName)},`,\n );\n if (required) {\n matches.push(`(\n json.containsKey('${camelcase(propName)}')\n ? ${nullable ? `json['${propName}'] == null` : `json['${propName}'] != null`} ${typeStr.matches ? `&& ${typeStr.matches}` : ''}\n : false)`);\n } else {\n matches.push(`(\n json.containsKey('${camelcase(propName)}')\n ? ${nullable ? `json['${propName}'] == null` : `json['${propName}'] != null`} ${typeStr.matches ? `|| ${typeStr.matches}` : ''}\n : true)`);\n }\n }\n\n const { mixins, withMixins } = this.#mixinise(className, context);\n const content = `class ${className} ${withMixins} {\n ${props.join('\\n')}\n ${!mixins.length ? 'const' : ''} ${className}({\n ${constructorParams.join('\\n')}})${mixins.length > 1 ? '' : `:super()`};\n factory ${className}.fromJson(Map<String, dynamic> json) {\nreturn ${className}(\\n${fromJsonParams.join(',\\n')});\n }\n Map<String, dynamic> toJson() => {\n${toJsonProperties.join(',\\n')}\n };\n static bool matches(Map<String, dynamic> json) {\nreturn ${matches.join(' && ')};\n }\n }`;\n if (context.noEmit !== true) {\n this.#emit(className, content);\n }\n const nullable = !context.required || context.nullable === true;\n return {\n use: className,\n content,\n encode: 'input.toJson()',\n toJson: `${this.#safe(context.name, context.required)}`,\n fromJson: context.name\n ? `${context.forJson || className}.fromJson(json['${context.name}'])`\n : `${context.forJson || className}.fromJson(json)`,\n matches: `${className}.matches(json['${context.name}'])`,\n };\n }\n\n #safe(accces: string, required: boolean) {\n return required\n ? `this.${camelcase(accces)}.toJson()`\n : `this.${camelcase(accces)} != null ? this.${camelcase(accces)}!.toJson() : null`;\n }\n\n #array(\n className: string,\n schema: SchemaObject,\n required = false,\n context: Context,\n ): Serialized {\n if (!schema.items) {\n return {\n content: '',\n use: 'List<dynamic>',\n toJson: '',\n fromJson: `List<dynamic>.from(${context.name ? `json['${context.name}']` : `json`})})`,\n matches: '',\n };\n }\n const itemsType = this.handle(className, schema.items, true, context);\n const fromJson = required\n ? context.name\n ? `(json['${context.name}'] as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()`\n : `(json as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()`\n : context.name\n ? `json['${context.name}'] != null\n ? (json['${context.name}'] as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()\n : null`\n : `json != null\n ? (json as List<${itemsType.simple ? itemsType.use : 'dynamic'}>)\n .map((it) => ${itemsType.simple ? 'it' : `${itemsType.use}.fromJson(it)`})\n .toList()\n : null`;\n\n return {\n encode: `input.map((it) => ${itemsType.simple ? 'it' : `it.toJson()`}).toList()`,\n content: '',\n use: `List<${itemsType.use}>`,\n fromJson,\n toJson: `${context.required ? `this.${camelcase(context.name)}${itemsType.simple ? '' : '.map((it) => it.toJson()).toList()'}` : `this.${camelcase(context.name)}!= null? this.${camelcase(context.name)}${itemsType.simple ? '' : '!.map((it) => it.toJson()).toList()'} : null`}`,\n matches: `json['${camelcase(context.name)}'].every((it) => ${itemsType.matches})`,\n };\n }\n\n /**\n * Convert a basic type to Dart\n */\n #primitive(\n className: string,\n type: string,\n schema: SchemaObject,\n context: Record<string, unknown>,\n required = false,\n ): Serialized {\n switch (type) {\n case 'string':\n return this.#string(schema, context);\n case 'number':\n case 'integer':\n return this.number(schema, context);\n case 'boolean':\n return {\n content: '',\n use: 'bool',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is bool`,\n };\n case 'object':\n return this.#object(className, schema, context);\n case 'array':\n return this.#array(className, schema, required, context);\n case 'null':\n return {\n content: '',\n use: 'Null',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n default:\n // Unknown type -> fallback\n return {\n content: '',\n use: 'dynamic',\n nullable: false,\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n }\n\n #ref(\n className: string,\n $ref: string,\n required: boolean,\n context: Context,\n ): Serialized {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n const serialized = this.handle(\n schemaName,\n followRef<SchemaObject>(this.#spec, $ref),\n required,\n {\n ...context,\n propName: schemaName,\n noEmit: !!context.alias || !!className || !context.forceEmit,\n },\n );\n return serialized;\n }\n\n // fixme: this method should no longer be needed because the logic in it is being preprocessed before emitting begins\n #allOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Context,\n ): Serialized {\n const name = pascalcase(context.propName || className); // className in case is top level\n\n const refs = schemas.filter(isRef);\n const nonRefs = schemas.filter(notRef);\n if (nonRefs.some((it) => it.type && it.type !== 'object')) {\n assert(false, `allOf ${name} must be an object`);\n }\n const objectSchema = merge(\n {},\n ...nonRefs,\n ...refs.map((ref) => followRef(this.#spec, ref.$ref)),\n );\n delete objectSchema.allOf;\n return this.handle(name, objectSchema, true, context);\n }\n\n #anyOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Record<string, unknown>,\n ): Serialized {\n // fixme: handle\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n const nullSchemaIndex = schemas.findIndex((schema) => {\n if (isRef(schema)) {\n const refSchema = followRef(this.#spec, schema.$ref);\n return refSchema.type === 'null';\n }\n return schema.type === 'null';\n });\n const anyOfSchemas = schemas.slice(0);\n if (nullSchemaIndex >= 0) {\n anyOfSchemas.splice(nullSchemaIndex, 1); // remove null schema\n }\n\n return this.handle(className, anyOfSchemas[0], true, {\n ...context,\n nullable: nullSchemaIndex >= 0,\n });\n }\n\n #mixinise(name: string, context: Context) {\n const mixins = this.#getRefUsage(name);\n if (context.mixin) {\n mixins.unshift(context.mixin);\n }\n const withMixins =\n mixins.length > 1\n ? ` with ${mixins.join(', ')}`\n : mixins.length === 1\n ? `extends ${mixins[0]}`\n : '';\n return {\n withMixins,\n mixins,\n };\n }\n\n #oneOf(\n className: string,\n schemas: (SchemaObject | ReferenceObject)[],\n context: Context,\n ): Serialized {\n const name = pascalcase(context.propName || className); // className in case is top level\n\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n };\n }\n const content: string[] = [];\n const patterns: { pattern: string; name: string }[] = [];\n // FIXME: if there is just one type then no need to add the discriminator\n const objects = schemas.filter(notRef).filter((it) => it.type === 'object');\n for (const schema of schemas) {\n if (isRef(schema)) {\n const refType = this.#ref(className, schema.$ref, true, context);\n patterns.push({\n pattern: `case ${refType.type || 'Map<String, dynamic>'} map when ${refType.use}.matches(map): return ${refType.use}.fromJson(map);`,\n name: refType.use,\n });\n } else if (schema.type === 'string') {\n // todo: make this into a schema with ref (preproccesing)\n content.push(`class ${name}Text with ${name} {\n final String value;\n ${name}Text(this.value);\n @override\n dynamic toJson() => value;\n static bool matches(dynamic value) {\n return value is String;\n }}\n `);\n patterns.push({\n pattern: `case String(): return ${name}Text(json);`,\n name: `${name}Text`,\n });\n } else if (schema.type === 'array') {\n // todo: make this into a schema with ref (preproccesing) with all varients types (integer, string)\n // todo: this can be abstracted so the varients somehow dynamic without having to replicate the same classes all the time\n const itemsType = this.handle(name, schema.items!, true, {\n ...context,\n noEmit: true,\n });\n content.push(`class ${name}List with ${name} {\n final List<${itemsType.use}> value;\n ${name}List(this.value);\n @override\n dynamic toJson() => value;\n static bool matches(dynamic value) {\n return value is List;\n }}`);\n patterns.push({\n pattern: `case List(): return ${name}List(List<${itemsType.use}>.from(json));`,\n name: `${name}List`,\n });\n }\n }\n if (objects.length) {\n // todo: take a look at CompoundFilterFilters at the end\n const candidates: Record<string, Set<string>> = {};\n for (const schema of objects) {\n if (schema.additionalProperties === true) {\n continue;\n }\n assert(\n schema.properties,\n `Schema ${name} has no properties which are required in oneOf in order to determine the discriminator.`,\n );\n for (const [propName, propSchema] of Object.entries(\n schema.properties,\n )) {\n if (\n notRef(propSchema) &&\n propSchema.enum &&\n // fixme: the enum can have more than one value as long as it is not duplicated else where on the other schemas\n propSchema.enum.length === 1\n ) {\n candidates[propName] ??= new Set();\n candidates[propName].add(String(propSchema.enum[0]));\n }\n }\n }\n\n let discriminatorProp: string | undefined;\n\n for (const [name, values] of Object.entries(candidates)) {\n if (\n // make sure we pick the prop that exists on all objects\n values.size === objects.filter((it) => it.properties?.[name]).length\n ) {\n discriminatorProp = name;\n break;\n }\n }\n\n // if (objects.filter((it) => it.additionalProperties !== true).length) {\n // }\n // assert(discriminatorProp, `No discriminator property found in ${name}`);\n\n if (discriminatorProp) {\n for (const schema of objects) {\n const discriminatorValue: string = (\n (schema as SchemaObject).properties![\n discriminatorProp!\n ] as SchemaObject\n ).enum?.[0];\n\n const varientName = `${name}${pascalcase(discriminatorValue)}`;\n patterns.push({\n pattern: `case Map<String, dynamic> map when ${varientName}.matches(json): return ${varientName}.fromJson(map);`,\n name: varientName,\n });\n\n const objResult = this.#object(varientName, schema, {\n ...context,\n noEmit: true,\n mixin: name,\n });\n content.push(objResult.content);\n }\n }\n }\n\n const { mixins, withMixins } = this.#mixinise(name, context);\n content.unshift(`abstract ${mixins.length ? '' : 'mixin'} class ${name} ${withMixins} {\n dynamic toJson();\n ${\n patterns.length\n ? `static ${name} fromJson(dynamic json) {\n switch (json){\n ${patterns.map((it) => it.pattern).join('\\n')}\n default:\n throw ArgumentError(\"Invalid type for query property: \\${json}\");\n }\n }\n\n\n ${\n patterns.length\n ? ` static bool matches(dynamic value) {\n return ${patterns.map((it) => `value is ${it.name}`).join(' || ')};\n }`\n : ''\n }\n\n `\n : ''\n }\n }`);\n this.#emit(name, content.join('\\n'));\n\n return {\n content: content.join('\\n'),\n use: name,\n toJson: `${this.#safe(context.name as string, context.required)}`,\n fromJson: `${name}.fromJson(json['${context.name}'])`,\n matches: `${name}.matches(json['${context.name}'])`,\n };\n }\n\n #simple(type: string) {\n switch (type) {\n case 'string':\n return 'String';\n case 'number':\n return 'double';\n case 'integer':\n return 'int';\n case 'boolean':\n return 'bool';\n default:\n return 'dynamic';\n }\n }\n\n #enum(className: string, schema: SchemaObject, context: Context): Serialized {\n const name = context.propName || className; // className in case enum is top level\n const values = schema.enum as string[];\n const valType = this.#simple((schema.type as string) || 'string');\n // fixme: if enum have one value and cannot be null then use it as default value\n\n const { mixins, withMixins } = this.#mixinise(className, context);\n\n const content = `\n class _EnumValue implements ${pascalcase(name)} {\n final ${valType} value;\n const _EnumValue(this.value);\n @override\n toJson() {return this.value;}\n}\n abstract ${mixins.length ? '' : 'mixin'} class ${pascalcase(name)} ${withMixins} {\n ${values.map((it) => `static const _EnumValue ${formatName(it)} = _EnumValue(${typeof it === 'number' ? it : `'${it}'`});`).join('\\n')}\n dynamic toJson();\n\n ${valType} get value;\n\n static _EnumValue fromJson(${valType} value) {\n switch (value) {\n${values\n .map(\n (it) =>\n `case ${typeof it === 'number' ? it : `'${it}'`}: return ${formatName(it)};`,\n )\n .join('\\n')}\ndefault:\n throw ArgumentError.value(value, \"value\", \"No enum value with that name\");\n }\n }\n\n static bool matches(${valType} value) {\n try {\nfromJson(value);\nreturn true;\n } catch (error) {\nreturn false;\n }\n }\n\n }`;\n if (context.noEmit !== true) {\n this.#emit(name, content);\n }\n return {\n type: Array.isArray(schema.type)\n ? this.#simple(schema.type[0])\n : schema.type\n ? this.#simple(schema.type)\n : undefined,\n content: content,\n use: pascalcase(name),\n toJson: `${context.required ? `this.${camelcase(context.name)}.toJson()` : `this.${camelcase(context.name)} != null ? this.${camelcase(context.name)}!.toJson() : null`}`,\n fromJson: `${pascalcase(name)}.fromJson(json['${context.name}'])`,\n matches: `${pascalcase(name)}.matches(json['${context.name}'])`,\n };\n }\n\n /**\n * Handle string type with formats\n */\n #string(schema: SchemaObject, context: Context): Serialized {\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n case 'date':\n return {\n content: '',\n use: 'DateTime',\n simple: true,\n toJson: context.required\n ? `this.${camelcase(context.name)}.toIso8601String()`\n : `this.${camelcase(context.name)} != null ? this.${camelcase(\n context.name,\n )}!.toIso8601String() : null`,\n fromJson: context.name\n ? `json['${context.name}'] != null ? DateTime.parse(json['${context.name}']) : null`\n : 'json',\n matches: `json['${context.name}'] is String`,\n };\n case 'binary':\n case 'byte':\n return {\n content: '',\n use: 'File',\n toJson: `this.${camelcase(context.name)}`,\n simple: true,\n fromJson: context.name ? `json['${context.name}']` : 'json',\n matches: `json['${context.name}'] is Uint8List`,\n };\n default:\n return {\n encode: 'input',\n use: `String`,\n content: '',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: context.name ? `json['${context.name}'] as String` : 'json',\n matches: `json['${context.name}'] is String`,\n };\n }\n }\n\n /**\n * Handle number/integer types with formats\n */\n number(schema: SchemaObject, context: Context): Serialized {\n if (schema.type === 'integer') {\n return {\n content: '',\n use: 'int',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is int`,\n };\n }\n if (['float', 'double'].includes(schema.format as string)) {\n return {\n content: '',\n use: 'double',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is double`,\n };\n }\n return {\n content: '',\n use: 'num',\n simple: true,\n toJson: `this.${camelcase(context.name)}`,\n fromJson: `json['${context.name}']`,\n matches: `json['${context.name}'] is double`,\n };\n }\n\n #serialize(\n className: string,\n schema: SchemaObject | ReferenceObject,\n required = true,\n context: Context = {},\n ): Serialized {\n if (isRef(schema)) {\n return this.#ref(className, schema.$ref, required, context);\n }\n // some schemas have decalres allof, oneof, anyOf at once or combinations of them\n // so we need to process them in order\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.#allOf(className, schema.allOf, context);\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.#oneOf(className, schema.oneOf, context);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#anyOf(className, schema.anyOf, context);\n }\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(className, schema, context);\n }\n // Handle types\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n let nullable = false;\n if ('nullable' in schema && schema.nullable) {\n nullable = true;\n } else if (schema.default === null) {\n nullable = true;\n } else if (types.includes('null')) {\n nullable = true;\n }\n\n // If no explicit \"type\", fallback to dynamic\n if (!types.length) {\n // unless properties are defined then assume object\n if ('properties' in schema) {\n return this.#object(className, schema, context);\n }\n if ('items' in schema) {\n return this.#array(className, schema, true, context);\n }\n return {\n content: '',\n use: 'dynamic',\n toJson: `${camelcase(context.name as string)}`,\n fromJson: `json['${context.name}']`,\n nullable: false,\n matches: '', // keep it empty as 'type is dynamic' is always true\n };\n }\n return this.#primitive(\n className,\n types[0],\n schema,\n { ...context, nullable },\n required,\n );\n }\n\n handle(\n className: string,\n schema: SchemaObject | ReferenceObject,\n required = true,\n context: Context = {},\n ): Serialized {\n const alias = context.alias;\n context.alias = undefined;\n const serialized = this.#serialize(className, schema, required, {\n ...context,\n forJson: alias,\n });\n\n if (alias) {\n this.#emit(className, `typedef ${alias} = ${serialized.use};`);\n return serialized;\n }\n return serialized;\n }\n}\n\nexport function isObjectSchema(\n schema: SchemaObject | ReferenceObject,\n): schema is SchemaObject {\n return !isRef(schema) && (schema.type === 'object' || !!schema.properties);\n}\n", "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:http/http.dart' as http;\nimport 'package:http_parser/http_parser.dart';\nimport 'package:mime/mime.dart' as mime;\n\nimport './interceptors.dart';\nimport './responses.dart';\n\nclass Dispatcher {\n final List<Interceptor> interceptors;\n\n Dispatcher(this.interceptors);\n\n Future<http.StreamedResponse> multipart(\n RequestConfig config,\n Map<String, dynamic> body,\n ) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.MultipartRequest(\n modifiedConfig.method,\n modifiedConfig.url,\n );\n request.headers.addAll(modifiedConfig.headers);\n for (var entry in body.entries) {\n final key = entry.key;\n final value = entry.value;\n if (value is File) {\n final mimeType = mime.lookupMimeType(value.path);\n request.files.add(\n http.MultipartFile(\n key,\n value.openRead(),\n await value.length(),\n filename: value.uri.pathSegments.last,\n contentType: mimeType != null ? MediaType.parse(mimeType) : null,\n ),\n );\n } else {\n request.fields[key] = value.toString();\n }\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> empty(RequestConfig config) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n request.headers.addAll(modifiedConfig.headers);\n return request.send();\n }\n\n Future<http.StreamedResponse> json(RequestConfig config, dynamic body) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n request.headers.addAll(modifiedConfig.headers);\n\n request.headers['Content-Type'] = 'application/json';\n if ((body is Map || body is List)) {\n request.body = jsonEncode(body);\n } else if (body is String) {\n request.body = body;\n } else {\n throw ArgumentError('Unsupported body type: ${body.runtimeType}');\n }\n\n return request.send();\n }\n}\n\nclass Receiver {\n final List<Interceptor> interceptors;\n Receiver(this.interceptors);\n\n dynamic _parse(http.Response response) {\n final contentTypeHeader = response.headers['content-type'];\n final parsed = parseContentType(contentTypeHeader);\n if (parsed.type == 'application/json') {\n return jsonDecode(response.body);\n } else if (parsed.type == 'text/plain') {\n return response.body;\n } else if (parsed.type == 'application/octet-stream') {\n return response.bodyBytes;\n } else {\n throw UnsupportedError('Unsupported content type: ${parsed.type}');\n }\n }\n\n dynamic json(http.StreamedResponse stream) async {\n if (stream.statusCode >= 200 && stream.statusCode < 300) {\n final response = await http.Response.fromStream(stream);\n return _parse(response);\n }\n switch (stream.statusCode) {\n case 400:\n throw BadRequestError('');\n case 401:\n throw UnauthorizedError('');\n case 403:\n throw ForbiddenError('');\n case 404:\n throw NotFoundError('');\n case 500:\n throw InternalServerError('');\n case 402:\n throw PaymentRequiredError('');\n case 405:\n throw MethodNotAllowedError('');\n case 406:\n throw NotAcceptableError('');\n case 409:\n throw ConflictError('');\n case 410:\n throw GoneError('');\n case 422:\n throw UnprocessableEntityError('');\n case 429:\n throw TooManyRequestsError('');\n case 413:\n throw PayloadTooLargeError('');\n case 415:\n throw UnsupportedMediaTypeError('');\n case 501:\n throw NotImplementedError('');\n case 502:\n throw BadGatewayError('');\n case 503:\n throw ServiceUnavailableError('');\n case 504:\n throw GatewayTimeoutError('');\n default:\n throw UnknownApiError('', stream.statusCode);\n }\n }\n}\n\n({String type, Map<String, String> parameters}) parseContentType(\n String? contentTypeHeader,\n) {\n if (contentTypeHeader == null || contentTypeHeader.isEmpty) {\n return (type: '', parameters: {});\n }\n final parts = contentTypeHeader.split(';');\n final type = parts[0].trim();\n final parameters = <String, String>{};\n for (var i = 1; i < parts.length; i++) {\n final param = parts[i].split('=');\n if (param.length == 2) {\n parameters[param[0].trim()] = param[1].trim();\n }\n }\n\n return (type: type, parameters: parameters);\n}\n", "abstract class Interceptor {\n RequestConfig before(RequestConfig config);\n void after();\n}\n\nclass BaseUrlInterceptor extends Interceptor {\n final String Function() getBaseUrl;\n BaseUrlInterceptor(this.getBaseUrl);\n\n @override\n RequestConfig before(RequestConfig config) {\n final baseUrl = getBaseUrl();\n if (config.url.scheme.isEmpty) {\n config.url = Uri.parse(baseUrl + config.url.toString());\n }\n return config;\n }\n\n @override\n void after() {\n //\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n RequestConfig({required this.method, required this.url, required this.headers});\n}\n", "sealed class ApiError {\n final String message;\n final int? statusCode;\n final String status;\n const ApiError(this.message, {this.statusCode, this.status = ''});\n\n @override\n String toString() =>\n 'ApiError(status: $status, statusCode: $statusCode, message: $message)';\n}\n\nbase class BadRequestError extends ApiError {\n const BadRequestError(String message)\n : super(message, statusCode: 400, status: 'BadRequest');\n}\n\nbase class UnauthorizedError extends ApiError {\n const UnauthorizedError(String message)\n : super(message, statusCode: 401, status: 'Unauthorized');\n}\n\nbase class ForbiddenError extends ApiError {\n const ForbiddenError(String message)\n : super(message, statusCode: 403, status: 'Forbidden');\n}\n\nbase class NotFoundError extends ApiError {\n const NotFoundError(String message)\n : super(message, statusCode: 404, status: 'NotFound');\n}\n\nbase class InternalServerError extends ApiError {\n const InternalServerError(String message)\n : super(message, statusCode: 500, status: 'InternalServerError');\n}\n\nbase class UnknownApiError extends ApiError {\n const UnknownApiError(String message, int statusCode)\n : super(message, statusCode: statusCode, status: 'UnknownApiError');\n}\n\nbase class PaymentRequiredError extends ApiError {\n const PaymentRequiredError(String message)\n : super(message, statusCode: 402, status: 'PaymentRequired');\n}\n\nbase class MethodNotAllowedError extends ApiError {\n const MethodNotAllowedError(String message)\n : super(message, statusCode: 405, status: 'MethodNotAllowed');\n}\n\nbase class NotAcceptableError extends ApiError {\n const NotAcceptableError(String message)\n : super(message, statusCode: 406, status: 'NotAcceptable');\n}\n\nbase class ConflictError extends ApiError {\n const ConflictError(String message)\n : super(message, statusCode: 409, status: 'Conflict');\n}\n\nbase class GoneError extends ApiError {\n const GoneError(String message)\n : super(message, statusCode: 410, status: 'Gone');\n}\n\nbase class UnprocessableEntityError extends ApiError {\n const UnprocessableEntityError(String message)\n : super(message, statusCode: 422, status: 'UnprocessableEntity');\n}\n\nbase class TooManyRequestsError extends ApiError {\n const TooManyRequestsError(String message)\n : super(message, statusCode: 429, status: 'TooManyRequests');\n}\n\nbase class PayloadTooLargeError extends ApiError {\n const PayloadTooLargeError(String message)\n : super(message, statusCode: 413, status: 'PayloadTooLarge');\n}\n\nbase class UnsupportedMediaTypeError extends ApiError {\n const UnsupportedMediaTypeError(String message)\n : super(message, statusCode: 415, status: 'UnsupportedMediaType');\n}\n\nbase class NotImplementedError extends ApiError {\n const NotImplementedError(String message)\n : super(message, statusCode: 501, status: 'NotImplemented');\n}\n\nbase class BadGatewayError extends ApiError {\n const BadGatewayError(String message)\n : super(message, statusCode: 502, status: 'BadGateway');\n}\n\nbase class ServiceUnavailableError extends ApiError {\n const ServiceUnavailableError(String message)\n : super(message, statusCode: 503, status: 'ServiceUnavailable');\n}\n\nbase class GatewayTimeoutError extends ApiError {\n const GatewayTimeoutError(String message)\n : super(message, statusCode: 504, status: 'GatewayTimeout');\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["merge", "assert", "camelcase", "followRef", "isEmpty", "isRef", "notRef", "pascalcase", "snakecase", "parse", "camelcase", "followRef", "isRef", "nullable", "name", "isRef", "isEmpty", "schemas", "refs", "notRef", "assert", "merge", "followRef", "pascalcase", "value", "response", "camelcase", "name", "snakecase"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EAOd,MAAM,mBAAmB,CAAC;AA6G3B,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE,iBAyNF"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,mBAAmB,CAAC;AA4G3B,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE,iBAwNF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdk-it/dart",
3
- "version": "0.19.1",
3
+ "version": "0.20.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -22,10 +22,10 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "openapi3-ts": "4.4.0",
25
- "@sdk-it/core": "0.19.0",
25
+ "@sdk-it/core": "0.20.0",
26
26
  "lodash-es": "^4.17.21",
27
27
  "stringcase": "^4.3.1",
28
- "@sdk-it/spec": "0.19.0",
28
+ "@sdk-it/spec": "0.20.0",
29
29
  "fast-content-type-parse": "^3.0.0",
30
30
  "yaml": "^2.7.0"
31
31
  }