@sdk-it/dart 0.46.0 → 0.46.2

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/README.md CHANGED
@@ -17,22 +17,14 @@ Add the generated SDK to your Dart or Flutter project. The generator will create
17
17
 
18
18
  ## Usage
19
19
 
20
- <details>
21
- <summary>Generate a Dart SDK (OpenStatus Example)</summary>
22
-
23
- > **Note:** This uses the [OpenStatus](https://www.openstatus.dev/) public OpenAPI spec as an example.
24
-
25
20
  ```bash
26
- npx @sdk-it/cli@latest dart \
27
- --spec https://api.openstatus.dev/v1/openapi \
28
- --output ./openstatus \
29
- --name OpenStatus \
30
- --mode full
21
+ npx @sdk-it/cli@latest generate dart \
22
+ --spec ./openapi.json \
23
+ --output ./client_sdk \
24
+ --name Client
31
25
  ```
32
26
 
33
- This command creates a Dart package in the `./openstatus` directory.
34
-
35
- </details>
27
+ This creates a Dart package in `./client_sdk`. The CLI runs `dart format`, so the Dart SDK must be installed.
36
28
 
37
29
  ### Add the SDK to Your Project
38
30
 
@@ -40,8 +32,8 @@ Add the generated SDK as a dependency in your `pubspec.yaml`:
40
32
 
41
33
  ```yaml
42
34
  dependencies:
43
- openstatus_sdk:
44
- path: ./openstatus
35
+ client_sdk:
36
+ path: ./client_sdk
45
37
  ```
46
38
 
47
39
  Run `dart pub get` or `flutter pub get` to install dependencies.
@@ -49,28 +41,21 @@ Run `dart pub get` or `flutter pub get` to install dependencies.
49
41
  ### Create and Configure the Client
50
42
 
51
43
  ```dart
52
- import 'package:openstatus_sdk/package.dart';
44
+ import 'package:client_sdk/package.dart';
53
45
 
54
- final openstatus = OpenStatus(Options(baseUrl: 'https://api.openstatus.dev/v1/'));
46
+ final client = Client(Options(baseUrl: 'https://api.example.com'));
55
47
  ```
56
48
 
57
49
  ### Make an API Request
58
50
 
59
- ```dart
60
- final status = await openstatus.statusReport.getStatusReport();
61
- if (status != null) {
62
- print('Status: \\${status.summary}');
63
- } else {
64
- print('Request failed');
65
- }
66
- ```
51
+ Generated operations are grouped by their first OpenAPI tag and named from their `operationId`. Use the emitted signatures in `lib/api/`; methods return their generated `Future<T>` type and throw `ApiError` subclasses for non-successful responses.
67
52
 
68
53
  ### Format Generated Code
69
54
 
70
55
  The generator can format the output using `dart format` automatically. You can also run it manually:
71
56
 
72
57
  ```bash
73
- dart format ./openstatus
58
+ dart format ./client_sdk
74
59
  ```
75
60
 
76
61
  ## Notes
package/dist/index.js CHANGED
@@ -144,20 +144,28 @@ var DartSerializer = class {
144
144
  });
145
145
  const nullable = serializedType.nullable || !requiredProp;
146
146
  const nullableSuffix = serializedType.use === "dynamic" ? "" : nullable ? "?" : "";
147
+ const omitWhenNull = serializedType.impossible && !requiredProp;
148
+ const includeIfPresent = omitWhenNull ? `if (${safePropName} != null) ` : "";
147
149
  const withValue = serializedType.literal !== void 0 ? ` = ${serializedType.literal}` : "";
148
150
  props.push(
149
151
  `final ${serializedType.use}${nullableSuffix} ${safePropName} ${withValue};`
150
152
  );
151
153
  toJsonProperties.push(
152
- `'${jsonKey}': ${safePropName}${serializedType.encodeV2}`
154
+ `${includeIfPresent}'${jsonKey}': ${safePropName}${serializedType.encodeV2}`
153
155
  );
154
156
  if (!withValue) {
155
- fromJsonParams.push(`${safePropName}: ${serializedType.fromJson}`);
157
+ fromJsonParams.push(
158
+ `${safePropName}: ${omitWhenNull ? `json.containsKey('${jsonKey}') ? ${serializedType.fromJson} : null` : serializedType.fromJson}`
159
+ );
156
160
  constructorParams.push(
157
161
  `${requiredProp ? "required " : ""}this.${safePropName},`
158
162
  );
159
163
  }
160
- if (requiredProp) {
164
+ if (serializedType.impossible) {
165
+ matches.push(
166
+ requiredProp ? "false" : `!json.containsKey('${jsonKey}')`
167
+ );
168
+ } else if (requiredProp) {
161
169
  matches.push(`(
162
170
  json.containsKey('${jsonKey}')
163
171
  ? ${nullable ? `json['${jsonKey}'] == null` : `json['${jsonKey}'] != null`} ${serializedType.matches ? `&& ${serializedType.matches}` : ""}
@@ -172,23 +180,25 @@ var DartSerializer = class {
172
180
  if (source) {
173
181
  switch (source) {
174
182
  case "header":
175
- headers.push(`'${jsonKey}': ${safePropName}`);
183
+ headers.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);
176
184
  break;
177
185
  case "path":
178
- params.push(`'${jsonKey}': ${safePropName}`);
186
+ params.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);
179
187
  break;
180
188
  case "query":
181
- queryParams.push(`'${jsonKey}': ${safePropName}`);
189
+ queryParams.push(
190
+ `${includeIfPresent}'${jsonKey}': ${safePropName}`
191
+ );
182
192
  break;
183
193
  default:
184
- bodyParams.push(`'${jsonKey}': ${safePropName}`);
194
+ bodyParams.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);
185
195
  }
186
196
  } else {
187
197
  if (special) {
188
198
  bodyParams.push(`$body${serializedType.encodeV2}`);
189
199
  } else {
190
200
  bodyParams.push(
191
- `'${jsonKey}': ${safePropName}${serializedType.encodeV2}`
201
+ `${includeIfPresent}'${jsonKey}': ${safePropName}${serializedType.encodeV2}`
192
202
  );
193
203
  }
194
204
  }
@@ -351,7 +361,7 @@ ${toJsonProperties.join(",\n")}
351
361
  #ref(className, $ref, required, context) {
352
362
  const schemaName = pascalcase(sanitizeTag(parseRef($ref).model));
353
363
  const schema = followRef(this.#spec, $ref);
354
- if (isPrimitiveSchema(schema)) {
364
+ if (isPrimitiveSchema(schema) || schema.not !== void 0 && isEmpty(schema.not)) {
355
365
  return this.handle(schemaName, schema, required, {
356
366
  ...context,
357
367
  propName: schemaName,
@@ -706,6 +716,18 @@ return false;
706
716
  if (isRef(schema)) {
707
717
  return this.#ref(className, schema.$ref, required, context);
708
718
  }
719
+ if (schema.not && isEmpty(schema.not)) {
720
+ return {
721
+ content: "",
722
+ use: "Never",
723
+ encodeV2: "",
724
+ simple: true,
725
+ fromJson: `${context.parsable || "json"} as Never`,
726
+ matches: "false",
727
+ nullable: false,
728
+ impossible: true
729
+ };
730
+ }
709
731
  if (schema.const !== void 0) {
710
732
  return this.#const(className, schema, context);
711
733
  }
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/generate.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 { readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n OpenAPIObject,\n OperationObject,\n ReferenceObject,\n ResponseObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\nimport yaml from 'yaml';\n\nimport {\n isEmpty,\n isRef,\n pascalcase,\n resolveRef,\n snakecase,\n} from '@sdk-it/core';\nimport {\n type ReadFolderFn,\n type Writer,\n createWriterProxy,\n getFolderExportsV2,\n writeFiles,\n} from '@sdk-it/core/file-system.js';\nimport {\n type IR,\n type Operation,\n type PaginationConfig,\n cleanFiles,\n forEachOperation,\n isSseContentType,\n isStreamingContentType,\n isSuccessStatusCode,\n parseJsonContentType,\n readWriteMetadata,\n toIR,\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\nexport async function generate(\n openapi: OpenAPIObject,\n settings: {\n output: string;\n cleanup?: boolean;\n name?: string;\n pagination?: PaginationConfig | false;\n writer?: Writer;\n readFolder?: ReadFolderFn;\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 spec = await toIR(\n {\n spec: openapi,\n pagination: settings.pagination ?? false,\n responses: { flattenErrorResponses: false },\n },\n true,\n );\n\n const clientName = settings.name || 'Client';\n const output = join(settings.output, 'lib');\n const { writer, files: writtenFiles } = createWriterProxy(\n settings.writer ?? writeFiles,\n settings.output,\n );\n settings.writer = writer;\n settings.readFolder ??= async (folder: string) => {\n const files = await readdir(folder, { withFileTypes: true });\n return files.map((file) => ({\n fileName: file.name,\n filePath: join(file.parentPath, file.name),\n isFolder: file.isDirectory(),\n }));\n };\n const groups: Record<\n string,\n {\n use: string;\n methods: string[];\n }\n > = {};\n forEachOperation(spec, (entry, operation) => {\n // if (entry.path !== '/assistants' || entry.method !== 'post') {\n // return;\n // }\n\n console.log(`Processing ${entry.method} ${entry.path}`);\n const group = (groups[entry.tag] ??= {\n methods: [],\n use: `final ${entry.tag} = new ${pascalcase(entry.tag)}();`,\n });\n\n const input = toInputs(spec, { entry, operation });\n\n const response = toOutput(spec, operation);\n group.methods.push(`\n Future<${response ? response.returnType : 'http.StreamedResponse'}> ${camelcase(operation.operationId)}(\n ${input.haveInput ? `${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 ${input.haveInput ? 'input: input.toRequest()' : ''}));\n ${response ? `${response.decode};` : 'return stream;'}\n }\n `);\n });\n\n const models = serializeModels(spec);\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), LoggingInterceptor()];\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 settings.writer(output, models);\n\n const metadata = await readWriteMetadata(\n settings.output,\n Array.from(writtenFiles),\n );\n\n if (settings.cleanup !== false && writtenFiles.size > 0) {\n await cleanFiles(metadata.content, settings.output, [\n '/package.dart',\n '/**/index.dart',\n 'pubspec.yaml',\n '/metadata.json',\n ]);\n }\n\n await settings.writer(output, {\n 'models/index.dart': await getFolderExportsV2(\n join(output, 'models'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'inputs/index.dart': await getFolderExportsV2(\n join(output, 'inputs'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'outputs/index.dart': await getFolderExportsV2(\n join(output, 'outputs'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'interceptors.dart': interceptorsTxt,\n 'http.dart': dispatcherTxt,\n 'responses.dart': responsesTxt,\n ...clazzez,\n });\n\n await settings.writer(output, {\n 'package.dart': `${await getFolderExportsV2(\n join(output),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n ignore(dirent) {\n return !dirent.isFolder && dirent.fileName === 'package.dart';\n },\n },\n )}${client}`,\n });\n\n await settings.writer(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 writeFile(\n join(settings.output, 'openapi.json'),\n JSON.stringify(spec, null, 2),\n );\n\n await settings.formatCode?.({\n output: output,\n });\n}\n\nfunction toInputs(spec: IR, { entry, operation }: Operation) {\n let inputName: string | undefined;\n let contentType = 'empty';\n let encode = '';\n let haveInput = false;\n for (const type in operation.requestBody.content) {\n const objectSchema = resolveRef(\n spec,\n operation.requestBody.content[type].schema,\n );\n const serializer = new DartSerializer(spec);\n inputName = objectSchema['x-inputname'] as string;\n const serialized = serializer.handle(inputName, objectSchema, true, {\n alias: isObjectSchema(objectSchema) ? undefined : inputName,\n requestize: objectSchema['x-requestbody'] === true,\n noEmit: true,\n });\n encode = serialized.encode as string;\n const [mediaType, mediaSubType] = partContentType(type).type.split('/');\n if (mediaSubType === 'empty') {\n contentType = 'empty';\n } else if (mediaSubType === 'x-www-form-urlencoded') {\n contentType = 'urlencoded';\n } else if (mediaSubType === 'octet-stream') {\n contentType = 'binary';\n } else if (mediaType === 'application') {\n contentType = parseJsonContentType(type) as string;\n } else if (mediaType === 'multipart') {\n contentType = 'formdata';\n } else {\n contentType = 'binary';\n }\n if (\n !isEmpty({ ...objectSchema.properties, ...objectSchema['x-properties'] })\n ) {\n haveInput = true;\n }\n }\n if (!inputName) {\n throw new Error(\n `No input name found for operation ${operation.operationId} in ${entry.path}`,\n );\n }\n\n return { inputName, contentType, encode, haveInput };\n}\n\nfunction toOutput(spec: IR, operation: OperationObject) {\n operation.responses ??= {};\n for (const status in operation.responses) {\n if (!isSuccessStatusCode(status)) continue;\n // if (isEmpty(response.content)) continue;\n const response = operation.responses[status] as ResponseObject;\n const outputName = response['x-response-name'];\n\n if ((response.headers ?? {})['Transfer-Encoding']) {\n return streamedOutput();\n }\n\n for (const type in response.content) {\n const schema = response.content[type].schema as ReferenceObject;\n if (isStreamingContentType(type)) {\n return streamedOutput();\n }\n if (isSseContentType(type)) {\n continue;\n }\n if (parseJsonContentType(type)) {\n if (!schema) {\n return streamedOutput();\n }\n const serializer = new DartSerializer(spec);\n // if (isRef(schema)) {\n // if (!isPrimitiveSchema(resolveRef(spec, schema))) {\n // const referenced = tapRef<ReferenceObject | SchemaObject>(\n // spec,\n // schema,\n // );\n // if (isRef(referenced)) {\n // const { model } = parseRef(referenced.$ref);\n // return {\n // type: 'json',\n // decode: `final json = await this.receiver.json(stream); return ${model}.fromJson(json)`,\n // returnType: model,\n // };\n // }\n // }\n // }\n const serialized = serializer.handle(outputName, schema, true, {\n // alias: outputName,\n noEmit: true,\n });\n\n return {\n type: 'json',\n decode: `final json = await this.receiver.json(stream); return ${serialized.fromJson}`,\n returnType: serialized.use,\n };\n }\n }\n }\n return streamedOutput();\n}\n\nfunction streamedOutput() {\n return {\n type: 'stream',\n decode: `return stream`,\n returnType: `http.StreamedResponse`,\n };\n}\n\nfunction serializeModels(spec: IR) {\n const serializer = new DartSerializer(spec);\n return Object.entries(spec.components.schemas).reduce<Record<string, string>>(\n (acc, [name, schema]) => {\n serializer.onEmit((name, content, schema) => {\n const isResponseBody = (schema as any)['x-responsebody'];\n const isRequestBody = (schema as any)['x-requestbody'];\n const folder = isRequestBody\n ? 'inputs'\n : isResponseBody\n ? 'outputs'\n : 'models';\n acc[join(folder, `${snakecase(name)}.dart`)] = [\n `import 'dart:io';`,\n `import 'dart:typed_data';`,\n // `import './index.dart';`,\n // `import '../interceptors.dart';`,\n `import '../package.dart';`,\n // folder === 'inputs' || folder === 'outputs'\n // ? `import '../models/index.dart';`\n // : `import '../inputs/index.dart';`,\n content,\n ].join('\\n');\n });\n\n if (isRef(schema)) {\n // what if the schema is a request body?\n serializer.handle(pascalcase(name), schema, true, {\n alias: isRef(schema) ? name : undefined,\n });\n return acc;\n }\n\n if ((schema as any)['x-requestbody']) {\n serializer.handle(\n pascalcase(name),\n schema.type !== 'object'\n ? {\n type: 'object',\n required: ['$body'],\n properties: {\n $body: {\n ...schema,\n 'x-special': true,\n },\n },\n }\n : schema,\n true,\n {\n requestize: true,\n },\n );\n } else {\n serializer.handle(pascalcase(name), schema, true, {});\n }\n\n return acc;\n },\n {},\n );\n}\n", "import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport type {\n ReferenceObject,\n SchemaObject,\n SchemaObjectType,\n} from 'openapi3-ts/oas31';\nimport { camelcase, snakecase } from 'stringcase';\n\nimport {\n followRef,\n isEmpty,\n isRef,\n joinSkipDigits,\n notRef,\n parseRef,\n pascalcase,\n resolveRef,\n} from '@sdk-it/core';\nimport {\n type IR,\n type Varient,\n coerceTypes,\n formatName,\n getRefUsage,\n isPrimitiveSchema,\n sanitizeTag,\n} from '@sdk-it/spec';\n\nexport function coearceObject(schema: SchemaObject): SchemaObject {\n schema = structuredClone(schema);\n if (schema['x-properties']) {\n schema.properties = {\n ...(schema.properties ?? {}),\n ...(schema['x-properties'] ?? {}),\n };\n }\n if (schema['x-required']) {\n schema.required = Array.from(\n new Set([\n ...(Array.isArray(schema.required) ? schema.required : []),\n ...(schema['x-required'] || []),\n ]),\n );\n }\n return schema;\n}\n\ntype Context = Record<string, any>;\ntype Serialized = {\n nullable?: boolean;\n encode?: string;\n encodeV2?: string;\n use: string;\n matches?: string;\n fromJson: any;\n type?: string;\n literal?: unknown;\n content: string;\n simple?: boolean;\n};\ntype Emit = (name: string, content: string, schema: SchemaObject) => void;\n/**\n * Convert an OpenAPI (JSON Schema style) object into Dart classes\n */\nexport class DartSerializer {\n #spec: IR;\n #emitHandler?: Emit;\n #emitHistory = new Set<string>();\n\n #emit(name: string, content: string, schema: SchemaObject): void {\n if (this.#emitHistory.has(content)) {\n return;\n }\n this.#emitHistory.add(content);\n this.#emitHandler?.(name, content, schema);\n }\n\n constructor(spec: IR) {\n this.#spec = spec;\n }\n\n onEmit(emit: Emit): void {\n this.#emitHandler = emit;\n }\n\n #formatKeyName(name: string): string {\n if (name.startsWith('$')) {\n return `\\\\${name}`;\n }\n return name;\n }\n\n #object(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const { properties = {}, required = [] } = coearceObject(schema);\n\n if (schema.additionalProperties || isEmpty(properties)) {\n if (context.requestize) {\n return this.#object(\n className,\n {\n type: 'object',\n properties: {\n $body: { 'x-special': true },\n },\n },\n context,\n );\n }\n\n if (context.noEmit !== true && !context.propName) {\n // only emit if root level not for individual properties\n this.#emit(\n pascalcase(formatName(className)),\n `typedef ${pascalcase(className)} = Map<String, dynamic>;`,\n schema,\n );\n }\n\n return {\n content: '',\n use: `Map<String, dynamic>`,\n encode: 'input',\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is Map<String, dynamic>`,\n };\n }\n\n let requestContent = '';\n const props: string[] = [];\n const toJsonProperties: string[] = [];\n const constructorParams: string[] = [];\n const fromJsonParams: string[] = [];\n const matches: string[] = [];\n\n const headers: string[] = [];\n const params: string[] = [];\n const queryParams: string[] = [];\n const bodyParams: string[] = [];\n\n for (const [key, propSchema] of Object.entries(properties)) {\n const propName = key.replace('[]', '');\n const safePropName = camelcase(formatName(propName));\n const requiredProp = required.includes(key);\n const jsonKey = this.#formatKeyName(propName);\n\n const serializedType = this.handle(className, propSchema, requiredProp, {\n name: propName,\n safeName: safePropName,\n required: requiredProp,\n propName: isRef(propSchema)\n ? pascalcase(propName)\n : joinSkipDigits([className, propName], '_'),\n parsable: `json['${jsonKey}']`,\n });\n const nullable = serializedType.nullable || !requiredProp;\n const nullableSuffix =\n serializedType.use === 'dynamic' ? '' : nullable ? '?' : ''; // dynamic types requires no suffix\n const withValue =\n serializedType.literal !== undefined\n ? ` = ${serializedType.literal}`\n : '';\n props.push(\n `final ${serializedType.use}${nullableSuffix} ${safePropName} ${withValue};`,\n );\n toJsonProperties.push(\n `'${jsonKey}': ${safePropName}${serializedType.encodeV2}`,\n );\n if (!withValue) {\n fromJsonParams.push(`${safePropName}: ${serializedType.fromJson}`);\n constructorParams.push(\n `${requiredProp ? 'required ' : ''}this.${safePropName},`,\n );\n }\n if (requiredProp) {\n matches.push(`(\n json.containsKey('${jsonKey}')\n ? ${nullable ? `json['${jsonKey}'] == null` : `json['${jsonKey}'] != null`} ${serializedType.matches ? `&& ${serializedType.matches}` : ''}\n : false)`);\n } else {\n matches.push(`(\n json.containsKey('${jsonKey}')\n ? ${nullable ? `json['${jsonKey}'] == null` : `json['${jsonKey}'] != null`} ${serializedType.matches ? `|| ${serializedType.matches}` : ''}\n : true)`);\n }\n\n const { 'x-in': source, 'x-special': special } =\n propSchema as SchemaObject;\n if (source) {\n switch (source) {\n case 'header':\n headers.push(`'${jsonKey}': ${safePropName}`);\n break;\n case 'path':\n params.push(`'${jsonKey}': ${safePropName}`);\n break;\n case 'query':\n queryParams.push(`'${jsonKey}': ${safePropName}`);\n break;\n default:\n bodyParams.push(`'${jsonKey}': ${safePropName}`);\n }\n } else {\n if (special) {\n bodyParams.push(`$body${serializedType.encodeV2!}`);\n } else {\n bodyParams.push(\n `'${jsonKey}': ${safePropName}${serializedType.encodeV2}`,\n );\n }\n }\n }\n\n if (context.requestize) {\n const body =\n bodyParams.length === 1 && bodyParams[0].startsWith('$body')\n ? bodyParams[0]\n : `${bodyParams.length ? `{${bodyParams.join(', ')}}` : '{}'}`;\n\n requestContent = `\n RequestInput toRequest() =>\n RequestInput(\n headers: ${headers.length ? `{${headers.join(', ')}}` : '{}'},\n query: ${queryParams.length ? `{${queryParams.join(', ')}}` : '{}'},\n params: ${params.length ? `{${params.join(', ')}}` : '{}'},\n body: ${body}\n );`;\n }\n\n const constructorP = constructorParams.length\n ? `{${constructorParams.join('\\n')}}`\n : '';\n\n // const { mixins, withMixins } = this.#mixinise(className, context);\n const fixedClassName = pascalcase(sanitizeTag(className));\n\n // ${!mixins.length ? 'const' : ''} ${fixedClassName}(${constructorP})${mixins.length > 1 ? '' : `:super()`};\n\n const content = `class ${fixedClassName} {\n ${props.join('\\n')}\n const ${fixedClassName}(${constructorP}): super();\n factory ${fixedClassName}.fromJson(Map<String, dynamic> json) {\nreturn ${fixedClassName}(\\n${fromJsonParams.join(',\\n')});\n }\n Map<String, dynamic> toJson() => {\n${toJsonProperties.join(',\\n')}\n };\n static bool matches(Map<String, dynamic> json) {return ${matches.join(' && ')};}\n\n ${requestContent}\n\n }`;\n if (context.noEmit !== true && !context.propName) {\n this.#emit(fixedClassName, content, schema);\n }\n const generatedClassName = context.forJson || className;\n return {\n use: fixedClassName,\n content,\n encode: 'input.toJson()',\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${generatedClassName}.fromJson(${context.parsable})`,\n matches: `${generatedClassName}.matches(${context.parsable})`,\n };\n }\n\n #oneOfObject(\n className: string,\n varientName: string,\n schemaOrRef: SchemaObject | ReferenceObject,\n context: Context,\n ) {\n const schema = resolveRef(this.#spec, schemaOrRef);\n const entries = Object.entries(schema.properties || {});\n if (entries.length === 1) {\n const [key, prop] = entries[0];\n const serializedType = this.handle(\n pascalcase(`${className} ${varientName}`),\n prop,\n true,\n {\n ...context,\n propName: joinSkipDigits([varientName, key], '_'),\n safeName: varientName,\n parsable: `json['${varientName}']`,\n },\n );\n return {\n typeStr: `${serializedType.use}${serializedType.nullable ? '?' : ''} ${key}`,\n returnValue: `_Value({'${key}': ${key}${serializedType.encodeV2}});`,\n fromJson: serializedType.fromJson,\n };\n }\n const serializedType = this.handle(className, schemaOrRef, true, {\n ...context,\n propName: joinSkipDigits([className, varientName], '_'),\n safeName: varientName,\n parsable: `json['${varientName}']`,\n });\n return {\n typeStr: `${serializedType.use} value`,\n returnValue: `_Value(value.toJson());`,\n fromJson: serializedType.fromJson,\n };\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 encodeV2: '',\n fromJson: `List<dynamic>.from(${context.parsable})`,\n matches: '',\n };\n }\n const itemsType = this.handle(className, schema.items, true, {\n ...context,\n parsable: 'it',\n });\n const fromJson = required\n ? context.name\n ? `(${context.parsable} as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()`\n : `(json as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()`\n : context.name\n ? `${context.parsable} != null\n ? (${context.parsable} as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()\n : null`\n : `json != null\n ? (json as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\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 simple: true,\n encodeV2: `${itemsType.simple ? '' : `${context.required ? '' : '?'}.map((it) => ${itemsType.simple ? 'it' : `it.toJson()`}).toList()`}`,\n matches: context.parsable\n ? `(${context.parsable} as List).every((it) => ${itemsType.matches})`\n : `${context.parsable} is List && ${context.parsable}.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 encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: `${context.parsable} 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 encodeV2: '',\n simple: true,\n use: 'Null',\n fromJson: context.parsable,\n };\n default:\n // Unknown type -> fallback\n return {\n content: '',\n use: 'dynamic',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: '',\n nullable: false,\n };\n }\n }\n\n #ref(\n className: string,\n $ref: string,\n required: boolean,\n context: Context,\n ): Serialized {\n const schemaName = pascalcase(sanitizeTag(parseRef($ref).model));\n const schema = followRef(this.#spec, $ref);\n if (isPrimitiveSchema(schema)) {\n return this.handle(schemaName, schema, required, {\n ...context,\n propName: schemaName,\n noEmit: true,\n // default to json in case this method is root level\n parsable: context.parsable || 'json',\n });\n }\n const generatedClassName = context.forJson || schemaName;\n\n const isDynamicObject =\n schema.type === 'object'\n ? !!schema.additionalProperties || isEmpty(schema.properties)\n : schema.anyOf\n ? false\n : !schema.oneOf;\n return {\n use: pascalcase(schemaName),\n content: '',\n encode: 'input.toJson()',\n encodeV2: isDynamicObject\n ? ''\n : `${context.required ? '' : '?'}.toJson()`,\n fromJson: isDynamicObject\n ? `${generatedClassName}.from(json)`\n : `${generatedClassName}.fromJson(${context.parsable || 'json'})`,\n matches: isDynamicObject\n ? `${context.parsable} is ${generatedClassName}`\n : `${generatedClassName}.matches(${context.parsable})`,\n simple: isDynamicObject,\n };\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 #mixinise(name: string, context: Context) {\n const mixins = getRefUsage(this.#spec, name);\n if (context.mixin) {\n mixins.unshift(context.mixin);\n }\n const withMixins =\n mixins.length > 1\n ? ` implements ${mixins.join(', ')}`\n : mixins.length === 1\n ? `extends ${mixins[0]}`\n : '';\n return {\n withMixins,\n mixins,\n };\n }\n\n #buildClass(options: {\n name: string;\n abstract?: boolean;\n mixins?: string[];\n withMixins?: string;\n content: string[];\n implements?: string[];\n }) {\n return [\n options.abstract ? 'abstract' : '',\n options.mixins?.length ? '' : 'mixin',\n `class ${options.name} ${options.withMixins} ${options.implements?.length ? `implements ${options.implements.join(', ')}` : ''}`,\n '{',\n options.content.join('\\n'),\n '}',\n ]\n .filter(Boolean)\n .join('\\n');\n }\n\n #oneOf(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const varients: Varient[] = schema['x-varients'];\n const schemas = schema.oneOf || schema.anyOf || [];\n const name = pascalcase(sanitizeTag(context.propName || className)); // className in case is top level\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n encodeV2: '',\n fromJson: context.parsable,\n };\n }\n\n const content: string[] = [];\n const patterns: { pattern: string; name: string }[] = [];\n\n content.push(`class _Value implements ${name} {\n final dynamic value;\n const _Value(this.value);\n @override\n toJson() => value;\n}`);\n\n for (const { name: varientName, ...varient } of varients) {\n switch (varientName) {\n case 'empty':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}() => _Value(\"\");`,\n pattern: `case '': return ${name}.${formatName(varientName)}();`,\n });\n continue;\n case 'uri':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(Uri value) => _Value(value);`,\n pattern: `case String: return ${name}.${formatName(varientName)}(Uri.parse(json));`,\n });\n continue;\n case 'number':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(num value) => _Value(value);`,\n pattern: `case num: return ${name}.${formatName(varientName)}(json);`,\n });\n continue;\n case 'object': {\n // const objectSchema = resolveRef(\n // this.#spec,\n // schemas[varient.position],\n // );\n // const result = this.#object(\n // pascalcase(`${name} ${formatName(varientName)}`),\n // objectSchema,\n // { ...context, noEmit: false },\n // );\n const result = this.handle(className, schemas[varient.position]);\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${result.use} value) => _Value(value);`,\n pattern: `case Map<String, dynamic> map: return ${name}.${formatName(varientName)}(${pascalcase(\n `${name} ${formatName(varientName)}`,\n )}.fromJson(map));`,\n });\n continue;\n }\n }\n switch (varient.type) {\n case 'string':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(String value) => _Value(value);`,\n pattern: `case String: return ${name}.${formatName(varientName)}(json);`,\n });\n break;\n case 'object': {\n const { typeStr, returnValue, fromJson } = this.#oneOfObject(\n name,\n varientName,\n schemas[varient.position],\n context,\n );\n const staticStr = varient.static\n ? `&& json['${varient.source}'] == '${formatName(varientName)}'`\n : '';\n const caseStr = `case Map<String, dynamic> json when json.containsKey('${varient.source}') ${staticStr}`;\n\n const returnStr = `return ${name}.${formatName(varientName)}(${fromJson})`;\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${typeStr}) => ${returnValue}`,\n pattern: `${caseStr}: ${returnStr};`,\n });\n break;\n }\n case 'array': {\n const serializedType = this.handle(\n className,\n schemas[varient.position],\n true,\n {\n ...context,\n noEmit: true,\n parsable: 'json',\n },\n );\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${serializedType.use} value) => _Value(value);`,\n pattern: `case ${serializedType.use} json: return ${name}.${formatName(varientName)}(${serializedType.fromJson});`,\n });\n break;\n }\n default: {\n //\n }\n }\n }\n const { mixins, withMixins } = this.#mixinise(name, context);\n content.push(\n this.#buildClass({\n name,\n abstract: true,\n mixins,\n withMixins,\n content: [\n // 'dynamic get value;',\n 'dynamic toJson();',\n ...patterns.map((it) => it.name),\n `${name}();`,\n `factory ${name}.fromJson(dynamic json)`,\n `{`,\n `switch (json) {`,\n ...patterns.map((it) => it.pattern),\n `default: throw ArgumentError(\"Invalid type: \\${json}\");`,\n `}`,\n `}`,\n `static bool matches(dynamic value) {\n try {\n ${name}.fromJson(value);\n return true;\n } catch (error) {\n return false;\n }\n }`,\n ],\n }),\n );\n\n if (context.noEmit !== true) {\n this.#emit(name, content.join('\\n'), {\n oneOf: schemas,\n });\n }\n\n return {\n content: content.join('\\n'),\n use: name,\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${name}.fromJson(${context.parsable})`,\n matches: `${name}.matches(${context.parsable})`,\n };\n }\n\n #simple(type?: SchemaObjectType) {\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 case 'object':\n return 'Map<String, dynamic>';\n case 'array':\n return 'List<dynamic>';\n case 'null':\n return 'Null';\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(coerceTypes(schema)[0]);\n // fixme: if enum have one value and cannot be null then use it as default value\n\n const { mixins, withMixins } = this.#mixinise(name, context);\n\n // ${this.#buildClass({\n // name: '_EnumValue',\n // implements: [pascalcase(formatName(name))],\n // content: `final ${valType} value;\n // const _EnumValue(this.value);\n // @override\n // toJson() => value;`,\n // })}\n // formatName(snakecase(formatName(it))) => formatName('NEW') => NEW => snakecase(formatName('NEW')) => new => formatName(snakecase(formatName('NEW'))) => $new\n const content = `\n class _EnumValue implements ${pascalcase(formatName(name))} {\n final ${valType} value;\n const _EnumValue(this.value);\n @override\n toJson() => value;\n}\n abstract ${mixins.length ? '' : 'mixin'} class ${pascalcase(formatName(name))} ${withMixins} {\n ${values.map((it) => `static const _EnumValue ${formatName(snakecase(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(snakecase(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(pascalcase(formatName(name)), content, schema);\n }\n return {\n use: pascalcase(formatName(name)),\n type: this.#simple(coerceTypes(schema)[0]),\n content: content,\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${pascalcase(name)}.fromJson(${context.parsable})`,\n matches: `${pascalcase(name)}.matches(${context.parsable})`,\n };\n }\n\n #const(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const valType = this.#simple(coerceTypes(schema)[0]);\n return {\n content: '',\n literal: valType === 'String' ? `'${schema.const}'` : schema.const,\n use: valType,\n encode: 'input',\n encodeV2: '',\n fromJson: context.parsable,\n matches: context.parsable,\n simple: true,\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 encodeV2: `${context.required ? '' : '?'}.toIso8601String()`,\n fromJson: context.parsable\n ? context.required\n ? `DateTime.parse(${context.parsable})`\n : `${context.parsable} != null ? DateTime.parse(${context.parsable}) : null`\n : 'json',\n matches: `${context.parsable} is String`,\n };\n case 'binary':\n case 'byte':\n return {\n content: '',\n use: 'File',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: `${context.parsable} is Uint8List`,\n };\n default:\n return {\n encode: 'input',\n use: `String`,\n content: '',\n encodeV2: '',\n simple: true,\n fromJson: `${context.parsable} as String`,\n matches: `${context.parsable} 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 encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is int`,\n };\n }\n if (['float', 'double'].includes(schema.format as string)) {\n return {\n content: '',\n use: 'double',\n simple: true,\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is double`,\n };\n }\n return {\n content: '',\n use: 'num',\n simple: true,\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} 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\n if (schema.const !== undefined) {\n return this.#const(className, schema, context);\n }\n\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(className, schema, 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, context);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#oneOf(className, schema, context);\n }\n\n // Handle types\n const types = coerceTypes(schema, false);\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 // Unknown type -> fallback\n content: '',\n use: 'dynamic',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\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(\n pascalcase(formatName(className)),\n `typedef ${pascalcase(alias)} = ${serialized.use};`,\n resolveRef(this.#spec, schema),\n );\n return serialized;\n }\n return serialized;\n }\n}\n\nexport function isObjectSchema(\n schema: SchemaObject | ReferenceObject,\n): schema is SchemaObject {\n return (\n !isRef(schema) &&\n (schema.type === 'object' || !!coearceObject(schema).properties)\n );\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 void _setHeaders(\n http.BaseRequest request,\n RequestConfig config, [\n String? contentType,\n ]) {\n request.headers.addAll(config.headers);\n for (var entry in config.input.headers.entries) {\n final value = entry.value;\n if (value != null) {\n request.headers[entry.key] = value;\n }\n }\n if (contentType != null) {\n request.headers['Content-Type'] = contentType;\n }\n }\n\n void _setParams(RequestConfig config) {\n final params = config.input.params;\n if (params.isEmpty) return;\n\n String path = config.url.toString();\n for (var entry in params.entries) {\n path = path.replaceAll('{${entry.key}}', entry.value.toString());\n }\n config.url = Uri.parse(path);\n }\n\n void _setQuery(RequestConfig config) {\n final query = config.input.query;\n if (query.isEmpty) return;\n\n final uri = config.url;\n final queryParameters = Map<String, String>.from(uri.queryParameters);\n\n for (var entry in query.entries) {\n if (entry.value != null) {\n queryParameters[entry.key] = entry.value.toString();\n }\n }\n\n config.url = uri.replace(queryParameters: queryParameters);\n }\n\n Future<http.StreamedResponse> formdata(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.MultipartRequest(\n modifiedConfig.method,\n modifiedConfig.url,\n );\n _setHeaders(request, modifiedConfig);\n\n for (var entry in config.input.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 _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig);\n return request.send();\n }\n\n Future<http.StreamedResponse> json(RequestConfig config) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/json');\n\n if ((config.input.body is Map || config.input.body is List)) {\n request.body = jsonEncode(config.input.body);\n } else if (config.input.body is String) {\n request.body = config.input.body;\n } else {\n throw ArgumentError(\n 'Unsupported body type: ${config.input.body.runtimeType}',\n );\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> binary(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/octet-stream');\n\n switch (config.input.body) {\n case List<int> bytes:\n request.bodyBytes = bytes;\n case Stream<List<int>> stream:\n request.bodyBytes = await stream.expand((x) => x).toList();\n case String body:\n request.body = body;\n case File file:\n request.bodyBytes = await file.readAsBytes();\n default:\n throw ArgumentError(\n 'Unsupported body type for binary request: ${config.input.body.runtimeType}',\n );\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> urlencoded(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/x-www-form-urlencoded');\n\n // Convert body to URL-encoded string\n final bodyMap = config.input.body;\n request.body = bodyMap.entries\n .map(\n (entry) =>\n '${Uri.encodeComponent(entry.key)}=${Uri.encodeComponent(entry.value.toString())}',\n )\n .join('&');\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.startsWith('application/json')) {\n return jsonDecode(response.body);\n } else if (parsed.type.startsWith('text/')) {\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 Future<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 throw _handleError(stream);\n }\n\n Future<String> text(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 throw _handleError(stream);\n }\n\n _handleError(http.StreamedResponse stream) {\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 412:\n throw PreconditionFailedError('');\n case 415:\n throw UnsupportedMediaTypeError('');\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\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 LoggingInterceptor extends Interceptor {\n // ANSI color codes\n static const String _reset = '\\x1B[0m';\n static const String _green = '\\x1B[32m';\n static const String _yellow = '\\x1B[33m';\n static const String _blue = '\\x1B[34m';\n static const String _magenta = '\\x1B[35m';\n static const String _cyan = '\\x1B[36m';\n\n @override\n RequestConfig before(RequestConfig config) {\n print('${_cyan}[LOG] --- HTTP REQUEST ---$_reset');\n print('${_yellow}[LOG] Method: ${config.method.toUpperCase()}$_reset');\n print('${_green}[LOG] URL: ${config.url}$_reset');\n print('${_magenta}[ContentType] ${config.headers['content-type']}$_reset');\n if (config.headers.isNotEmpty) {\n print('${_blue}[LOG] Headers: ${config.headers}$_reset');\n } else {\n print('${_blue}[LOG] Headers: <none>$_reset');\n }\n print('${_cyan}[LOG] --------------$_reset');\n return config;\n }\n\n @override\n void after() {\n // Optionally log after the request\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n final RequestInput input;\n\n RequestConfig({\n required this.method,\n required this.url,\n required this.headers,\n this.input = const RequestInput.empty(),\n });\n}\n\nclass RequestInput {\n final Map<String, String?> headers;\n final Map<String, dynamic> query;\n final Map<String, dynamic> params;\n final dynamic body;\n RequestInput({\n this.headers = const {},\n this.query = const {},\n this.params = const {},\n required this.body,\n });\n\n const RequestInput.empty()\n : headers = const {},\n query = const {},\n params = const {},\n body = null;\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,SAAS,iBAAiB;AACnC,SAAS,YAAY;AAOrB,SAAS,aAAAA,kBAAiB;AAC1B,OAAO,UAAU;AAEjB;AAAA,EACE,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACtCP,SAAS,aAAa;AACtB,OAAO,YAAY;AAMnB,SAAS,WAAW,iBAAiB;AAErC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,cAAc,QAAoC;AAChE,WAAS,gBAAgB,MAAM;AAC/B,MAAI,OAAO,cAAc,GAAG;AAC1B,WAAO,aAAa;AAAA,MAClB,GAAI,OAAO,cAAc,CAAC;AAAA,MAC1B,GAAI,OAAO,cAAc,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,GAAG;AACxB,WAAO,WAAW,MAAM;AAAA,MACtB,oBAAI,IAAI;AAAA,QACN,GAAI,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAAA,QACxD,GAAI,OAAO,YAAY,KAAK,CAAC;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAmBO,IAAM,iBAAN,MAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,eAAe,oBAAI,IAAY;AAAA,EAE/B,MAAM,MAAc,SAAiB,QAA4B;AAC/D,QAAI,KAAK,aAAa,IAAI,OAAO,GAAG;AAClC;AAAA,IACF;AACA,SAAK,aAAa,IAAI,OAAO;AAC7B,SAAK,eAAe,MAAM,SAAS,MAAM;AAAA,EAC3C;AAAA,EAEA,YAAY,MAAU;AACpB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,MAAkB;AACvB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,eAAe,MAAsB;AACnC,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QACE,WACA,QACA,SACY;AACZ,UAAM,EAAE,aAAa,CAAC,GAAG,WAAW,CAAC,EAAE,IAAI,cAAc,MAAM;AAE/D,QAAI,OAAO,wBAAwB,QAAQ,UAAU,GAAG;AACtD,UAAI,QAAQ,YAAY;AACtB,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO,EAAE,aAAa,KAAK;AAAA,YAC7B;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,QAAQ,CAAC,QAAQ,UAAU;AAEhD,aAAK;AAAA,UACH,WAAW,WAAW,SAAS,CAAC;AAAA,UAChC,WAAW,WAAW,SAAS,CAAC;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,QAAQ;AAAA,QAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,iBAAiB;AACrB,UAAM,QAAkB,CAAC;AACzB,UAAM,mBAA6B,CAAC;AACpC,UAAM,oBAA8B,CAAC;AACrC,UAAM,iBAA2B,CAAC;AAClC,UAAM,UAAoB,CAAC;AAE3B,UAAM,UAAoB,CAAC;AAC3B,UAAM,SAAmB,CAAC;AAC1B,UAAM,cAAwB,CAAC;AAC/B,UAAM,aAAuB,CAAC;AAE9B,eAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC1D,YAAM,WAAW,IAAI,QAAQ,MAAM,EAAE;AACrC,YAAM,eAAe,UAAU,WAAW,QAAQ,CAAC;AACnD,YAAM,eAAe,SAAS,SAAS,GAAG;AAC1C,YAAM,UAAU,KAAK,eAAe,QAAQ;AAE5C,YAAM,iBAAiB,KAAK,OAAO,WAAW,YAAY,cAAc;AAAA,QACtE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU,MAAM,UAAU,IACtB,WAAW,QAAQ,IACnB,eAAe,CAAC,WAAW,QAAQ,GAAG,GAAG;AAAA,QAC7C,UAAU,SAAS,OAAO;AAAA,MAC5B,CAAC;AACD,YAAM,WAAW,eAAe,YAAY,CAAC;AAC7C,YAAM,iBACJ,eAAe,QAAQ,YAAY,KAAK,WAAW,MAAM;AAC3D,YAAM,YACJ,eAAe,YAAY,SACvB,MAAM,eAAe,OAAO,KAC5B;AACN,YAAM;AAAA,QACJ,SAAS,eAAe,GAAG,GAAG,cAAc,IAAI,YAAY,IAAI,SAAS;AAAA,MAC3E;AACA,uBAAiB;AAAA,QACf,IAAI,OAAO,MAAM,YAAY,GAAG,eAAe,QAAQ;AAAA,MACzD;AACA,UAAI,CAAC,WAAW;AACd,uBAAe,KAAK,GAAG,YAAY,KAAK,eAAe,QAAQ,EAAE;AACjE,0BAAkB;AAAA,UAChB,GAAG,eAAe,cAAc,EAAE,QAAQ,YAAY;AAAA,QACxD;AAAA,MACF;AACA,UAAI,cAAc;AAChB,gBAAQ,KAAK;AAAA,sBACC,OAAO;AAAA,MACvB,WAAW,SAAS,OAAO,eAAe,SAAS,OAAO,YAAY,IAAI,eAAe,UAAU,MAAM,eAAe,OAAO,KAAK,EAAE;AAAA,WACjI;AAAA,MACL,OAAO;AACL,gBAAQ,KAAK;AAAA,sBACC,OAAO;AAAA,MACvB,WAAW,SAAS,OAAO,eAAe,SAAS,OAAO,YAAY,IAAI,eAAe,UAAU,MAAM,eAAe,OAAO,KAAK,EAAE;AAAA,UAClI;AAAA,MACJ;AAEA,YAAM,EAAE,QAAQ,QAAQ,aAAa,QAAQ,IAC3C;AACF,UAAI,QAAQ;AACV,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,oBAAQ,KAAK,IAAI,OAAO,MAAM,YAAY,EAAE;AAC5C;AAAA,UACF,KAAK;AACH,mBAAO,KAAK,IAAI,OAAO,MAAM,YAAY,EAAE;AAC3C;AAAA,UACF,KAAK;AACH,wBAAY,KAAK,IAAI,OAAO,MAAM,YAAY,EAAE;AAChD;AAAA,UACF;AACE,uBAAW,KAAK,IAAI,OAAO,MAAM,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,OAAO;AACL,YAAI,SAAS;AACX,qBAAW,KAAK,QAAQ,eAAe,QAAS,EAAE;AAAA,QACpD,OAAO;AACL,qBAAW;AAAA,YACT,IAAI,OAAO,MAAM,YAAY,GAAG,eAAe,QAAQ;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,OACJ,WAAW,WAAW,KAAK,WAAW,CAAC,EAAE,WAAW,OAAO,IACvD,WAAW,CAAC,IACZ,GAAG,WAAW,SAAS,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,IAAI;AAEhE,uBAAiB;AAAA;AAAA;AAAA,qBAGF,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAI;AAAA,mBACnD,YAAY,SAAS,IAAI,YAAY,KAAK,IAAI,CAAC,MAAM,IAAI;AAAA,oBACxD,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI;AAAA,kBACjD,IAAI;AAAA;AAAA,IAElB;AAEA,UAAM,eAAe,kBAAkB,SACnC,IAAI,kBAAkB,KAAK,IAAI,CAAC,MAChC;AAGJ,UAAM,iBAAiB,WAAW,YAAY,SAAS,CAAC;AAIxD,UAAM,UAAU,SAAS,cAAc;AAAA,QACnC,MAAM,KAAK,IAAI,CAAC;AAAA,cACV,cAAc,IAAI,YAAY;AAAA,iBAC3B,cAAc;AAAA,SACtB,cAAc;AAAA,EAAM,eAAe,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA,EAGrD,iBAAiB,KAAK,KAAK,CAAC;AAAA;AAAA,+DAEiC,QAAQ,KAAK,MAAM,CAAC;AAAA;AAAA,QAE3E,cAAc;AAAA;AAAA;AAGlB,QAAI,QAAQ,WAAW,QAAQ,CAAC,QAAQ,UAAU;AAChD,WAAK,MAAM,gBAAgB,SAAS,MAAM;AAAA,IAC5C;AACA,UAAM,qBAAqB,QAAQ,WAAW;AAC9C,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,GAAG,QAAQ,WAAW,KAAK,GAAG;AAAA,MACxC,UAAU,GAAG,kBAAkB,aAAa,QAAQ,QAAQ;AAAA,MAC5D,SAAS,GAAG,kBAAkB,YAAY,QAAQ,QAAQ;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,aACE,WACA,aACA,aACA,SACA;AACA,UAAM,SAAS,WAAW,KAAK,OAAO,WAAW;AACjD,UAAM,UAAU,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC;AACtD,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC;AAC7B,YAAMC,kBAAiB,KAAK;AAAA,QAC1B,WAAW,GAAG,SAAS,IAAI,WAAW,EAAE;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,UAAU,eAAe,CAAC,aAAa,GAAG,GAAG,GAAG;AAAA,UAChD,UAAU;AAAA,UACV,UAAU,SAAS,WAAW;AAAA,QAChC;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS,GAAGA,gBAAe,GAAG,GAAGA,gBAAe,WAAW,MAAM,EAAE,IAAI,GAAG;AAAA,QAC1E,aAAa,YAAY,GAAG,MAAM,GAAG,GAAGA,gBAAe,QAAQ;AAAA,QAC/D,UAAUA,gBAAe;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,OAAO,WAAW,aAAa,MAAM;AAAA,MAC/D,GAAG;AAAA,MACH,UAAU,eAAe,CAAC,WAAW,WAAW,GAAG,GAAG;AAAA,MACtD,UAAU;AAAA,MACV,UAAU,SAAS,WAAW;AAAA,IAChC,CAAC;AACD,WAAO;AAAA,MACL,SAAS,GAAG,eAAe,GAAG;AAAA,MAC9B,aAAa;AAAA,MACb,UAAU,eAAe;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,OACE,WACA,QACA,WAAW,OACX,SACY;AACZ,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU,sBAAsB,QAAQ,QAAQ;AAAA,QAChD,SAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,YAAY,KAAK,OAAO,WAAW,OAAO,OAAO,MAAM;AAAA,MAC3D,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,WAAW,WACb,QAAQ,OACN,IAAI,QAAQ,QAAQ;AAAA,2BACH,UAAU,SAAS,SAAS,UAAU,GAAG,KAAK,GAAG,UAAU,QAAQ,EAAE;AAAA,yBAEtF;AAAA,2BACiB,UAAU,SAAS,SAAS,UAAU,GAAG,KAAK,GAAG,UAAU,QAAQ,EAAE;AAAA,yBAExF,QAAQ,OACN,GAAG,QAAQ,QAAQ;AAAA,iBACZ,QAAQ,QAAQ;AAAA,+BACF,UAAU,SAAS,SAAS,UAAU,GAAG,KAAK,GAAG,UAAU,QAAQ,EAAE;AAAA;AAAA,sBAG1F;AAAA;AAAA,+BAEqB,UAAU,SAAS,SAAS,UAAU,GAAG,KAAK,GAAG,UAAU,QAAQ,EAAE;AAAA;AAAA;AAIhG,WAAO;AAAA,MACL,QAAQ,qBAAqB,UAAU,SAAS,OAAO,aAAa;AAAA,MACpE,SAAS;AAAA,MACT,KAAK,QAAQ,UAAU,GAAG;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,GAAG,UAAU,SAAS,KAAK,GAAG,QAAQ,WAAW,KAAK,GAAG,gBAAgB,UAAU,SAAS,OAAO,aAAa,YAAY;AAAA,MACtI,SAAS,QAAQ,WACb,IAAI,QAAQ,QAAQ,2BAA2B,UAAU,OAAO,MAChE,GAAG,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,kBAAkB,UAAU,OAAO;AAAA,IAC3F;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,QAAQ,QAAQ,OAAO;AAAA,MACrC,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,QAAQ;AAAA,UAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,QAC9B;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,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAEE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,QAAQ;AAAA,UAClB,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,KACE,WACA,MACA,UACA,SACY;AACZ,UAAM,aAAa,WAAW,YAAY,SAAS,IAAI,EAAE,KAAK,CAAC;AAC/D,UAAM,SAAS,UAAU,KAAK,OAAO,IAAI;AACzC,QAAI,kBAAkB,MAAM,GAAG;AAC7B,aAAO,KAAK,OAAO,YAAY,QAAQ,UAAU;AAAA,QAC/C,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ;AAAA;AAAA,QAER,UAAU,QAAQ,YAAY;AAAA,MAChC,CAAC;AAAA,IACH;AACA,UAAM,qBAAqB,QAAQ,WAAW;AAE9C,UAAM,kBACJ,OAAO,SAAS,WACZ,CAAC,CAAC,OAAO,wBAAwB,QAAQ,OAAO,UAAU,IAC1D,OAAO,QACL,QACA,CAAC,OAAO;AAChB,WAAO;AAAA,MACL,KAAK,WAAW,UAAU;AAAA,MAC1B,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU,kBACN,KACA,GAAG,QAAQ,WAAW,KAAK,GAAG;AAAA,MAClC,UAAU,kBACN,GAAG,kBAAkB,gBACrB,GAAG,kBAAkB,aAAa,QAAQ,YAAY,MAAM;AAAA,MAChE,SAAS,kBACL,GAAG,QAAQ,QAAQ,OAAO,kBAAkB,KAC5C,GAAG,kBAAkB,YAAY,QAAQ,QAAQ;AAAA,MACrD,QAAQ;AAAA,IACV;AAAA,EACF;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,UAAU,MAAc,SAAkB;AACxC,UAAM,SAAS,YAAY,KAAK,OAAO,IAAI;AAC3C,QAAI,QAAQ,OAAO;AACjB,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AACA,UAAM,aACJ,OAAO,SAAS,IACZ,eAAe,OAAO,KAAK,IAAI,CAAC,KAChC,OAAO,WAAW,IAChB,WAAW,OAAO,CAAC,CAAC,KACpB;AACR,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,SAOT;AACD,WAAO;AAAA,MACL,QAAQ,WAAW,aAAa;AAAA,MAChC,QAAQ,QAAQ,SAAS,KAAK;AAAA,MAC9B,SAAS,QAAQ,IAAI,IAAI,QAAQ,UAAU,IAAI,QAAQ,YAAY,SAAS,cAAc,QAAQ,WAAW,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,MAC9H;AAAA,MACA,QAAQ,QAAQ,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AAAA,EAEA,OACE,WACA,QACA,SACY;AACZ,UAAM,WAAsB,OAAO,YAAY;AAC/C,UAAM,UAAU,OAAO,SAAS,OAAO,SAAS,CAAC;AACjD,UAAM,OAAO,WAAW,YAAY,QAAQ,YAAY,SAAS,CAAC;AAClE,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAgD,CAAC;AAEvD,YAAQ,KAAK,2BAA2B,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9C;AAEE,eAAW,EAAE,MAAM,aAAa,GAAG,QAAQ,KAAK,UAAU;AACxD,cAAQ,aAAa;AAAA,QACnB,KAAK;AACH,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,YAC/C,SAAS,mBAAmB,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,UAC7D,CAAC;AACD;AAAA,QACF,KAAK;AACH,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,YAC/C,SAAS,uBAAuB,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,UACjE,CAAC;AACD;AAAA,QACF,KAAK;AACH,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,YAC/C,SAAS,oBAAoB,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,UAC9D,CAAC;AACD;AAAA,QACF,KAAK,UAAU;AAUb,gBAAM,SAAS,KAAK,OAAO,WAAW,QAAQ,QAAQ,QAAQ,CAAC;AAC/D,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI,OAAO,GAAG;AAAA,YAC7D,SAAS,yCAAyC,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI;AAAA,cACnF,GAAG,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,YACpC,CAAC;AAAA,UACH,CAAC;AACD;AAAA,QACF;AAAA,MACF;AACA,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,YAC/C,SAAS,uBAAuB,IAAI,IAAI,WAAW,WAAW,CAAC;AAAA,UACjE,CAAC;AACD;AAAA,QACF,KAAK,UAAU;AACb,gBAAM,EAAE,SAAS,aAAa,SAAS,IAAI,KAAK;AAAA,YAC9C;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ,QAAQ;AAAA,YACxB;AAAA,UACF;AACA,gBAAM,YAAY,QAAQ,SACtB,YAAY,QAAQ,MAAM,UAAU,WAAW,WAAW,CAAC,MAC3D;AACJ,gBAAM,UAAU,yDAAyD,QAAQ,MAAM,MAAM,SAAS;AAEtG,gBAAM,YAAY,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI,QAAQ;AACvE,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI,OAAO,QAAQ,WAAW;AAAA,YAC7E,SAAS,GAAG,OAAO,KAAK,SAAS;AAAA,UACnC,CAAC;AACD;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,iBAAiB,KAAK;AAAA,YAC1B;AAAA,YACA,QAAQ,QAAQ,QAAQ;AAAA,YACxB;AAAA,YACA;AAAA,cACE,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,UACF;AACA,mBAAS,KAAK;AAAA,YACZ,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI,eAAe,GAAG;AAAA,YACrE,SAAS,QAAQ,eAAe,GAAG,iBAAiB,IAAI,IAAI,WAAW,WAAW,CAAC,IAAI,eAAe,QAAQ;AAAA,UAChH,CAAC;AACD;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QAET;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,QAAQ,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;AAC3D,YAAQ;AAAA,MACN,KAAK,YAAY;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS;AAAA;AAAA,UAEP;AAAA,UACA,GAAG,SAAS,IAAI,CAAC,OAAO,GAAG,IAAI;AAAA,UAC/B,GAAG,IAAI;AAAA,UACP,WAAW,IAAI;AAAA,UACf;AAAA,UACA;AAAA,UACA,GAAG,SAAS,IAAI,CAAC,OAAO,GAAG,OAAO;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAEF,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMJ;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,WAAW,MAAM;AAC3B,WAAK,MAAM,MAAM,QAAQ,KAAK,IAAI,GAAG;AAAA,QACnC,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,SAAS,QAAQ,KAAK,IAAI;AAAA,MAC1B,KAAK;AAAA,MACL,UAAU,GAAG,QAAQ,WAAW,KAAK,GAAG;AAAA,MACxC,UAAU,GAAG,IAAI,aAAa,QAAQ,QAAQ;AAAA,MAC9C,SAAS,GAAG,IAAI,YAAY,QAAQ,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,QAAQ,MAAyB;AAC/B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,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,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAC;AAGnD,UAAM,EAAE,QAAQ,WAAW,IAAI,KAAK,UAAU,MAAM,OAAO;AAW3D,UAAM,UAAU;AAAA,gCACY,WAAW,WAAW,IAAI,CAAC,CAAC;AAAA,UAClD,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,eAKF,OAAO,SAAS,KAAK,OAAO,UAAU,WAAW,WAAW,IAAI,CAAC,CAAC,IAAI,UAAU;AAAA,QACvF,OAAO,IAAI,CAAC,OAAO,2BAA2B,WAAW,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC,iBAAiB,OAAO,OAAO,WAAW,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,QAG3J,OAAO;AAAA;AAAA,mCAEoB,OAAO;AAAA;AAAA,EAExC,OACC;AAAA,MACC,CAAC,OACC,QAAQ,OAAO,OAAO,WAAW,KAAK,IAAI,EAAE,GAAG,YAAY,WAAW,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC;AAAA,IACpG,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,WAAW,WAAW,IAAI,CAAC,GAAG,SAAS,MAAM;AAAA,IAC1D;AACA,WAAO;AAAA,MACL,KAAK,WAAW,WAAW,IAAI,CAAC;AAAA,MAChC,MAAM,KAAK,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAC;AAAA,MACzC;AAAA,MACA,UAAU,GAAG,QAAQ,WAAW,KAAK,GAAG;AAAA,MACxC,UAAU,GAAG,WAAW,IAAI,CAAC,aAAa,QAAQ,QAAQ;AAAA,MAC1D,SAAS,GAAG,WAAW,IAAI,CAAC,YAAY,QAAQ,QAAQ;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,OACE,WACA,QACA,SACY;AACZ,UAAM,UAAU,KAAK,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAC;AACnD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,YAAY,WAAW,IAAI,OAAO,KAAK,MAAM,OAAO;AAAA,MAC7D,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,QAAQ;AAAA,IACV;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,UAAU,GAAG,QAAQ,WAAW,KAAK,GAAG;AAAA,UACxC,UAAU,QAAQ,WACd,QAAQ,WACN,kBAAkB,QAAQ,QAAQ,MAClC,GAAG,QAAQ,QAAQ,6BAA6B,QAAQ,QAAQ,aAClE;AAAA,UACJ,SAAS,GAAG,QAAQ,QAAQ;AAAA,QAC9B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,QAAQ;AAAA,UAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,QAC9B;AAAA,MACF;AACE,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,GAAG,QAAQ,QAAQ;AAAA,UAC7B,SAAS,GAAG,QAAQ,QAAQ;AAAA,QAC9B;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAsB,SAA8B;AAC1D,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,QAAQ;AAAA,QAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,MAC9B;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,UAAU;AAAA,QACV,UAAU,QAAQ;AAAA,QAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,QAAQ;AAAA,MAClB,SAAS,GAAG,QAAQ,QAAQ;AAAA,IAC9B;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;AAEA,QAAI,OAAO,UAAU,QAAW;AAC9B,aAAO,KAAK,OAAO,WAAW,QAAQ,OAAO;AAAA,IAC/C;AAEA,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,aAAO,KAAK,MAAM,WAAW,QAAQ,OAAO;AAAA,IAC9C;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,QAAQ,OAAO;AAAA,IAC/C;AACA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,WAAW,QAAQ,OAAO;AAAA,IAC/C;AAGA,UAAM,QAAQ,YAAY,QAAQ,KAAK;AAEvC,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;AAAA,QAEL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,QAAQ;AAAA,QAClB,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;AAAA,QACH,WAAW,WAAW,SAAS,CAAC;AAAA,QAChC,WAAW,WAAW,KAAK,CAAC,MAAM,WAAW,GAAG;AAAA,QAChD,WAAW,KAAK,OAAO,MAAM;AAAA,MAC/B;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eACd,QACwB;AACxB,SACE,CAAC,MAAM,MAAM,MACZ,OAAO,SAAS,YAAY,CAAC,CAAC,cAAc,MAAM,EAAE;AAEzD;;;ACj8BA;;;ACAA;;;ACAA;;;AJ6CA,eAAsB,SACpB,SACA,UAcA;AACA,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,YAAY,SAAS,cAAc;AAAA,MACnC,WAAW,EAAE,uBAAuB,MAAM;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,QAAQ;AACpC,QAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAC1C,QAAM,EAAE,QAAQ,OAAO,aAAa,IAAI;AAAA,IACtC,SAAS,UAAU;AAAA,IACnB,SAAS;AAAA,EACX;AACA,WAAS,SAAS;AAClB,WAAS,eAAe,OAAO,WAAmB;AAChD,UAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAE,eAAe,KAAK,CAAC;AAC3D,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,UAAU,KAAK;AAAA,MACf,UAAU,KAAK,KAAK,YAAY,KAAK,IAAI;AAAA,MACzC,UAAU,KAAK,YAAY;AAAA,IAC7B,EAAE;AAAA,EACJ;AACA,QAAM,SAMF,CAAC;AACL,mBAAiB,MAAM,CAAC,OAAO,cAAc;AAK3C,YAAQ,IAAI,cAAc,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE;AACtD,UAAM,QAAS,OAAO,MAAM,GAAG,MAAM;AAAA,MACnC,SAAS,CAAC;AAAA,MACV,KAAK,SAAS,MAAM,GAAG,UAAUC,YAAW,MAAM,GAAG,CAAC;AAAA,IACxD;AAEA,UAAM,QAAQ,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AAEjD,UAAM,WAAW,SAAS,MAAM,SAAS;AACzC,UAAM,QAAQ,KAAK;AAAA,iBACN,WAAW,SAAS,aAAa,uBAAuB,KAAKC,WAAU,UAAU,WAAW,CAAC;AAAA,SACrG,MAAM,YAAY,GAAG,MAAM,SAAS,WAAW,EAAE;AAAA;AAAA,iDAET,MAAM,WAAW;AAAA,uBAC3C,MAAM,MAAM;AAAA,8BACL,MAAM,IAAI;AAAA;AAAA,aAE3B,MAAM,YAAY,6BAA6B,EAAE;AAAA,cAChD,WAAW,GAAG,SAAS,MAAM,MAAM,gBAAgB;AAAA;AAAA,aAEpD;AAAA,EACX,CAAC;AAED,QAAM,SAAS,gBAAgB,IAAI;AAEnC,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AAAA,IACrC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,OAAOC,WAAU,IAAI,CAAC,OAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAW7BF,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,iBAAiBE,WAAU,IAAI,CAAC,SAAS,EACvD,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,UAIL,UAAU;AAAA;AAAA,EAElB,OAAO,KAAK,MAAM,EACjB,IAAI,CAAC,SAAS,cAAcF,YAAW,IAAI,CAAC,UAAUC,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,MAAMD,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,SAAS,OAAO,QAAQ,MAAM;AAEpC,QAAM,WAAW,MAAM;AAAA,IACrB,SAAS;AAAA,IACT,MAAM,KAAK,YAAY;AAAA,EACzB;AAEA,MAAI,SAAS,YAAY,SAAS,aAAa,OAAO,GAAG;AACvD,UAAM,WAAW,SAAS,SAAS,SAAS,QAAQ;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,OAAO,QAAQ;AAAA,IAC5B,qBAAqB,MAAM;AAAA,MACzB,KAAK,QAAQ,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,qBAAqB,MAAM;AAAA,MACzB,KAAK,QAAQ,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,sBAAsB,MAAM;AAAA,MAC1B,KAAK,QAAQ,SAAS;AAAA,MACtB,SAAS;AAAA,MACT;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,CAAC;AAED,QAAM,SAAS,OAAO,QAAQ;AAAA,IAC5B,gBAAgB,GAAG,MAAM;AAAA,MACvB,KAAK,MAAM;AAAA,MACX,SAAS;AAAA,MACT;AAAA,QACE,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,QAAQ;AACb,iBAAO,CAAC,OAAO,YAAY,OAAO,aAAa;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC,GAAG,MAAM;AAAA,EACZ,CAAC;AAED,QAAM,SAAS,OAAO,SAAS,QAAQ;AAAA,IACrC,gBAAgB;AAAA,MACd,gBAAgB;AAAA,MAChB,SAAS,KAAK,UAAU;AAAA,QACtB,MAAM,SAAS,OACX,GAAGE,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;AAAA,IACJ,KAAK,SAAS,QAAQ,cAAc;AAAA,IACpC,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EAC9B;AAEA,QAAM,SAAS,aAAa;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,SAAS,MAAU,EAAE,OAAO,UAAU,GAAc;AAC3D,MAAI;AACJ,MAAI,cAAc;AAClB,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,aAAW,QAAQ,UAAU,YAAY,SAAS;AAChD,UAAM,eAAeC;AAAA,MACnB;AAAA,MACA,UAAU,YAAY,QAAQ,IAAI,EAAE;AAAA,IACtC;AACA,UAAM,aAAa,IAAI,eAAe,IAAI;AAC1C,gBAAY,aAAa,aAAa;AACtC,UAAM,aAAa,WAAW,OAAO,WAAW,cAAc,MAAM;AAAA,MAClE,OAAO,eAAe,YAAY,IAAI,SAAY;AAAA,MAClD,YAAY,aAAa,eAAe,MAAM;AAAA,MAC9C,QAAQ;AAAA,IACV,CAAC;AACD,aAAS,WAAW;AACpB,UAAM,CAAC,WAAW,YAAY,IAAI,gBAAgB,IAAI,EAAE,KAAK,MAAM,GAAG;AACtE,QAAI,iBAAiB,SAAS;AAC5B,oBAAc;AAAA,IAChB,WAAW,iBAAiB,yBAAyB;AACnD,oBAAc;AAAA,IAChB,WAAW,iBAAiB,gBAAgB;AAC1C,oBAAc;AAAA,IAChB,WAAW,cAAc,eAAe;AACtC,oBAAc,qBAAqB,IAAI;AAAA,IACzC,WAAW,cAAc,aAAa;AACpC,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc;AAAA,IAChB;AACA,QACE,CAACC,SAAQ,EAAE,GAAG,aAAa,YAAY,GAAG,aAAa,cAAc,EAAE,CAAC,GACxE;AACA,kBAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,qCAAqC,UAAU,WAAW,OAAO,MAAM,IAAI;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,aAAa,QAAQ,UAAU;AACrD;AAEA,SAAS,SAAS,MAAU,WAA4B;AACtD,YAAU,cAAc,CAAC;AACzB,aAAW,UAAU,UAAU,WAAW;AACxC,QAAI,CAAC,oBAAoB,MAAM,EAAG;AAElC,UAAM,WAAW,UAAU,UAAU,MAAM;AAC3C,UAAM,aAAa,SAAS,iBAAiB;AAE7C,SAAK,SAAS,WAAW,CAAC,GAAG,mBAAmB,GAAG;AACjD,aAAO,eAAe;AAAA,IACxB;AAEA,eAAW,QAAQ,SAAS,SAAS;AACnC,YAAM,SAAS,SAAS,QAAQ,IAAI,EAAE;AACtC,UAAI,uBAAuB,IAAI,GAAG;AAChC,eAAO,eAAe;AAAA,MACxB;AACA,UAAI,iBAAiB,IAAI,GAAG;AAC1B;AAAA,MACF;AACA,UAAI,qBAAqB,IAAI,GAAG;AAC9B,YAAI,CAAC,QAAQ;AACX,iBAAO,eAAe;AAAA,QACxB;AACA,cAAM,aAAa,IAAI,eAAe,IAAI;AAiB1C,cAAM,aAAa,WAAW,OAAO,YAAY,QAAQ,MAAM;AAAA;AAAA,UAE7D,QAAQ;AAAA,QACV,CAAC;AAED,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,yDAAyD,WAAW,QAAQ;AAAA,UACpF,YAAY,WAAW;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,eAAe;AACxB;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAEA,SAAS,gBAAgB,MAAU;AACjC,QAAM,aAAa,IAAI,eAAe,IAAI;AAC1C,SAAO,OAAO,QAAQ,KAAK,WAAW,OAAO,EAAE;AAAA,IAC7C,CAAC,KAAK,CAAC,MAAM,MAAM,MAAM;AACvB,iBAAW,OAAO,CAACC,OAAM,SAASC,YAAW;AAC3C,cAAM,iBAAkBA,QAAe,gBAAgB;AACvD,cAAM,gBAAiBA,QAAe,eAAe;AACrD,cAAM,SAAS,gBACX,WACA,iBACE,YACA;AACN,YAAI,KAAK,QAAQ,GAAGJ,WAAUG,KAAI,CAAC,OAAO,CAAC,IAAI;AAAA,UAC7C;AAAA,UACA;AAAA;AAAA;AAAA,UAGA;AAAA;AAAA;AAAA;AAAA,UAIA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb,CAAC;AAED,UAAIE,OAAM,MAAM,GAAG;AAEjB,mBAAW,OAAOP,YAAW,IAAI,GAAG,QAAQ,MAAM;AAAA,UAChD,OAAOO,OAAM,MAAM,IAAI,OAAO;AAAA,QAChC,CAAC;AACD,eAAO;AAAA,MACT;AAEA,UAAK,OAAe,eAAe,GAAG;AACpC,mBAAW;AAAA,UACTP,YAAW,IAAI;AAAA,UACf,OAAO,SAAS,WACZ;AAAA,YACE,MAAM;AAAA,YACN,UAAU,CAAC,OAAO;AAAA,YAClB,YAAY;AAAA,cACV,OAAO;AAAA,gBACL,GAAG;AAAA,gBACH,aAAa;AAAA,cACf;AAAA,YACF;AAAA,UACF,IACA;AAAA,UACJ;AAAA,UACA;AAAA,YACE,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF,OAAO;AACL,mBAAW,OAAOA,YAAW,IAAI,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,MACtD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import { parse as partContentType } from 'fast-content-type-parse';\nimport { readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n OpenAPIObject,\n OperationObject,\n ReferenceObject,\n ResponseObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase } from 'stringcase';\nimport yaml from 'yaml';\n\nimport {\n isEmpty,\n isRef,\n pascalcase,\n resolveRef,\n snakecase,\n} from '@sdk-it/core';\nimport {\n type ReadFolderFn,\n type Writer,\n createWriterProxy,\n getFolderExportsV2,\n writeFiles,\n} from '@sdk-it/core/file-system.js';\nimport {\n type IR,\n type Operation,\n type PaginationConfig,\n cleanFiles,\n forEachOperation,\n isSseContentType,\n isStreamingContentType,\n isSuccessStatusCode,\n parseJsonContentType,\n readWriteMetadata,\n toIR,\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\nexport async function generate(\n openapi: OpenAPIObject,\n settings: {\n output: string;\n cleanup?: boolean;\n name?: string;\n pagination?: PaginationConfig | false;\n writer?: Writer;\n readFolder?: ReadFolderFn;\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 spec = await toIR(\n {\n spec: openapi,\n pagination: settings.pagination ?? false,\n responses: { flattenErrorResponses: false },\n },\n true,\n );\n\n const clientName = settings.name || 'Client';\n const output = join(settings.output, 'lib');\n const { writer, files: writtenFiles } = createWriterProxy(\n settings.writer ?? writeFiles,\n settings.output,\n );\n settings.writer = writer;\n settings.readFolder ??= async (folder: string) => {\n const files = await readdir(folder, { withFileTypes: true });\n return files.map((file) => ({\n fileName: file.name,\n filePath: join(file.parentPath, file.name),\n isFolder: file.isDirectory(),\n }));\n };\n const groups: Record<\n string,\n {\n use: string;\n methods: string[];\n }\n > = {};\n forEachOperation(spec, (entry, operation) => {\n // if (entry.path !== '/assistants' || entry.method !== 'post') {\n // return;\n // }\n\n console.log(`Processing ${entry.method} ${entry.path}`);\n const group = (groups[entry.tag] ??= {\n methods: [],\n use: `final ${entry.tag} = new ${pascalcase(entry.tag)}();`,\n });\n\n const input = toInputs(spec, { entry, operation });\n\n const response = toOutput(spec, operation);\n group.methods.push(`\n Future<${response ? response.returnType : 'http.StreamedResponse'}> ${camelcase(operation.operationId)}(\n ${input.haveInput ? `${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 ${input.haveInput ? 'input: input.toRequest()' : ''}));\n ${response ? `${response.decode};` : 'return stream;'}\n }\n `);\n });\n\n const models = serializeModels(spec);\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), LoggingInterceptor()];\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 settings.writer(output, models);\n\n const metadata = await readWriteMetadata(\n settings.output,\n Array.from(writtenFiles),\n );\n\n if (settings.cleanup !== false && writtenFiles.size > 0) {\n await cleanFiles(metadata.content, settings.output, [\n '/package.dart',\n '/**/index.dart',\n 'pubspec.yaml',\n '/metadata.json',\n ]);\n }\n\n await settings.writer(output, {\n 'models/index.dart': await getFolderExportsV2(\n join(output, 'models'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'inputs/index.dart': await getFolderExportsV2(\n join(output, 'inputs'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'outputs/index.dart': await getFolderExportsV2(\n join(output, 'outputs'),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n },\n ),\n 'interceptors.dart': interceptorsTxt,\n 'http.dart': dispatcherTxt,\n 'responses.dart': responsesTxt,\n ...clazzez,\n });\n\n await settings.writer(output, {\n 'package.dart': `${await getFolderExportsV2(\n join(output),\n settings.readFolder,\n {\n exportSyntax: 'export',\n extensions: 'dart',\n ignore(dirent) {\n return !dirent.isFolder && dirent.fileName === 'package.dart';\n },\n },\n )}${client}`,\n });\n\n await settings.writer(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 writeFile(\n join(settings.output, 'openapi.json'),\n JSON.stringify(spec, null, 2),\n );\n\n await settings.formatCode?.({\n output: output,\n });\n}\n\nfunction toInputs(spec: IR, { entry, operation }: Operation) {\n let inputName: string | undefined;\n let contentType = 'empty';\n let encode = '';\n let haveInput = false;\n for (const type in operation.requestBody.content) {\n const objectSchema = resolveRef(\n spec,\n operation.requestBody.content[type].schema,\n );\n const serializer = new DartSerializer(spec);\n inputName = objectSchema['x-inputname'] as string;\n const serialized = serializer.handle(inputName, objectSchema, true, {\n alias: isObjectSchema(objectSchema) ? undefined : inputName,\n requestize: objectSchema['x-requestbody'] === true,\n noEmit: true,\n });\n encode = serialized.encode as string;\n const [mediaType, mediaSubType] = partContentType(type).type.split('/');\n if (mediaSubType === 'empty') {\n contentType = 'empty';\n } else if (mediaSubType === 'x-www-form-urlencoded') {\n contentType = 'urlencoded';\n } else if (mediaSubType === 'octet-stream') {\n contentType = 'binary';\n } else if (mediaType === 'application') {\n contentType = parseJsonContentType(type) as string;\n } else if (mediaType === 'multipart') {\n contentType = 'formdata';\n } else {\n contentType = 'binary';\n }\n if (\n !isEmpty({ ...objectSchema.properties, ...objectSchema['x-properties'] })\n ) {\n haveInput = true;\n }\n }\n if (!inputName) {\n throw new Error(\n `No input name found for operation ${operation.operationId} in ${entry.path}`,\n );\n }\n\n return { inputName, contentType, encode, haveInput };\n}\n\nfunction toOutput(spec: IR, operation: OperationObject) {\n operation.responses ??= {};\n for (const status in operation.responses) {\n if (!isSuccessStatusCode(status)) continue;\n // if (isEmpty(response.content)) continue;\n const response = operation.responses[status] as ResponseObject;\n const outputName = response['x-response-name'];\n\n if ((response.headers ?? {})['Transfer-Encoding']) {\n return streamedOutput();\n }\n\n for (const type in response.content) {\n const schema = response.content[type].schema as ReferenceObject;\n if (isStreamingContentType(type)) {\n return streamedOutput();\n }\n if (isSseContentType(type)) {\n continue;\n }\n if (parseJsonContentType(type)) {\n if (!schema) {\n return streamedOutput();\n }\n const serializer = new DartSerializer(spec);\n // if (isRef(schema)) {\n // if (!isPrimitiveSchema(resolveRef(spec, schema))) {\n // const referenced = tapRef<ReferenceObject | SchemaObject>(\n // spec,\n // schema,\n // );\n // if (isRef(referenced)) {\n // const { model } = parseRef(referenced.$ref);\n // return {\n // type: 'json',\n // decode: `final json = await this.receiver.json(stream); return ${model}.fromJson(json)`,\n // returnType: model,\n // };\n // }\n // }\n // }\n const serialized = serializer.handle(outputName, schema, true, {\n // alias: outputName,\n noEmit: true,\n });\n\n return {\n type: 'json',\n decode: `final json = await this.receiver.json(stream); return ${serialized.fromJson}`,\n returnType: serialized.use,\n };\n }\n }\n }\n return streamedOutput();\n}\n\nfunction streamedOutput() {\n return {\n type: 'stream',\n decode: `return stream`,\n returnType: `http.StreamedResponse`,\n };\n}\n\nfunction serializeModels(spec: IR) {\n const serializer = new DartSerializer(spec);\n return Object.entries(spec.components.schemas).reduce<Record<string, string>>(\n (acc, [name, schema]) => {\n serializer.onEmit((name, content, schema) => {\n const isResponseBody = (schema as any)['x-responsebody'];\n const isRequestBody = (schema as any)['x-requestbody'];\n const folder = isRequestBody\n ? 'inputs'\n : isResponseBody\n ? 'outputs'\n : 'models';\n acc[join(folder, `${snakecase(name)}.dart`)] = [\n `import 'dart:io';`,\n `import 'dart:typed_data';`,\n // `import './index.dart';`,\n // `import '../interceptors.dart';`,\n `import '../package.dart';`,\n // folder === 'inputs' || folder === 'outputs'\n // ? `import '../models/index.dart';`\n // : `import '../inputs/index.dart';`,\n content,\n ].join('\\n');\n });\n\n if (isRef(schema)) {\n // what if the schema is a request body?\n serializer.handle(pascalcase(name), schema, true, {\n alias: isRef(schema) ? name : undefined,\n });\n return acc;\n }\n\n if ((schema as any)['x-requestbody']) {\n serializer.handle(\n pascalcase(name),\n schema.type !== 'object'\n ? {\n type: 'object',\n required: ['$body'],\n properties: {\n $body: {\n ...schema,\n 'x-special': true,\n },\n },\n }\n : schema,\n true,\n {\n requestize: true,\n },\n );\n } else {\n serializer.handle(pascalcase(name), schema, true, {});\n }\n\n return acc;\n },\n {},\n );\n}\n", "import { merge } from 'lodash-es';\nimport assert from 'node:assert';\nimport type {\n ReferenceObject,\n SchemaObject,\n SchemaObjectType,\n} from 'openapi3-ts/oas31';\nimport { camelcase, snakecase } from 'stringcase';\n\nimport {\n followRef,\n isEmpty,\n isRef,\n joinSkipDigits,\n notRef,\n parseRef,\n pascalcase,\n resolveRef,\n} from '@sdk-it/core';\nimport {\n type IR,\n type Varient,\n coerceTypes,\n formatName,\n getRefUsage,\n isPrimitiveSchema,\n sanitizeTag,\n} from '@sdk-it/spec';\n\nexport function coearceObject(schema: SchemaObject): SchemaObject {\n schema = structuredClone(schema);\n if (schema['x-properties']) {\n schema.properties = {\n ...(schema.properties ?? {}),\n ...(schema['x-properties'] ?? {}),\n };\n }\n if (schema['x-required']) {\n schema.required = Array.from(\n new Set([\n ...(Array.isArray(schema.required) ? schema.required : []),\n ...(schema['x-required'] || []),\n ]),\n );\n }\n return schema;\n}\n\ntype Context = Record<string, any>;\ntype Serialized = {\n nullable?: boolean;\n encode?: string;\n encodeV2?: string;\n use: string;\n matches?: string;\n fromJson: any;\n type?: string;\n literal?: unknown;\n content: string;\n simple?: boolean;\n impossible?: boolean;\n};\ntype Emit = (name: string, content: string, schema: SchemaObject) => void;\n/**\n * Convert an OpenAPI (JSON Schema style) object into Dart classes\n */\nexport class DartSerializer {\n #spec: IR;\n #emitHandler?: Emit;\n #emitHistory = new Set<string>();\n\n #emit(name: string, content: string, schema: SchemaObject): void {\n if (this.#emitHistory.has(content)) {\n return;\n }\n this.#emitHistory.add(content);\n this.#emitHandler?.(name, content, schema);\n }\n\n constructor(spec: IR) {\n this.#spec = spec;\n }\n\n onEmit(emit: Emit): void {\n this.#emitHandler = emit;\n }\n\n #formatKeyName(name: string): string {\n if (name.startsWith('$')) {\n return `\\\\${name}`;\n }\n return name;\n }\n\n #object(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const { properties = {}, required = [] } = coearceObject(schema);\n\n if (schema.additionalProperties || isEmpty(properties)) {\n if (context.requestize) {\n return this.#object(\n className,\n {\n type: 'object',\n properties: {\n $body: { 'x-special': true },\n },\n },\n context,\n );\n }\n\n if (context.noEmit !== true && !context.propName) {\n // only emit if root level not for individual properties\n this.#emit(\n pascalcase(formatName(className)),\n `typedef ${pascalcase(className)} = Map<String, dynamic>;`,\n schema,\n );\n }\n\n return {\n content: '',\n use: `Map<String, dynamic>`,\n encode: 'input',\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is Map<String, dynamic>`,\n };\n }\n\n let requestContent = '';\n const props: string[] = [];\n const toJsonProperties: string[] = [];\n const constructorParams: string[] = [];\n const fromJsonParams: string[] = [];\n const matches: string[] = [];\n\n const headers: string[] = [];\n const params: string[] = [];\n const queryParams: string[] = [];\n const bodyParams: string[] = [];\n\n for (const [key, propSchema] of Object.entries(properties)) {\n const propName = key.replace('[]', '');\n const safePropName = camelcase(formatName(propName));\n const requiredProp = required.includes(key);\n const jsonKey = this.#formatKeyName(propName);\n\n const serializedType = this.handle(className, propSchema, requiredProp, {\n name: propName,\n safeName: safePropName,\n required: requiredProp,\n propName: isRef(propSchema)\n ? pascalcase(propName)\n : joinSkipDigits([className, propName], '_'),\n parsable: `json['${jsonKey}']`,\n });\n const nullable = serializedType.nullable || !requiredProp;\n const nullableSuffix =\n serializedType.use === 'dynamic' ? '' : nullable ? '?' : ''; // dynamic types requires no suffix\n const omitWhenNull = serializedType.impossible && !requiredProp;\n const includeIfPresent = omitWhenNull\n ? `if (${safePropName} != null) `\n : '';\n const withValue =\n serializedType.literal !== undefined\n ? ` = ${serializedType.literal}`\n : '';\n props.push(\n `final ${serializedType.use}${nullableSuffix} ${safePropName} ${withValue};`,\n );\n toJsonProperties.push(\n `${includeIfPresent}'${jsonKey}': ${safePropName}${serializedType.encodeV2}`,\n );\n if (!withValue) {\n fromJsonParams.push(\n `${safePropName}: ${\n omitWhenNull\n ? `json.containsKey('${jsonKey}') ? ${serializedType.fromJson} : null`\n : serializedType.fromJson\n }`,\n );\n constructorParams.push(\n `${requiredProp ? 'required ' : ''}this.${safePropName},`,\n );\n }\n if (serializedType.impossible) {\n matches.push(\n requiredProp ? 'false' : `!json.containsKey('${jsonKey}')`,\n );\n } else if (requiredProp) {\n matches.push(`(\n json.containsKey('${jsonKey}')\n ? ${nullable ? `json['${jsonKey}'] == null` : `json['${jsonKey}'] != null`} ${serializedType.matches ? `&& ${serializedType.matches}` : ''}\n : false)`);\n } else {\n matches.push(`(\n json.containsKey('${jsonKey}')\n ? ${nullable ? `json['${jsonKey}'] == null` : `json['${jsonKey}'] != null`} ${serializedType.matches ? `|| ${serializedType.matches}` : ''}\n : true)`);\n }\n\n const { 'x-in': source, 'x-special': special } =\n propSchema as SchemaObject;\n if (source) {\n switch (source) {\n case 'header':\n headers.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);\n break;\n case 'path':\n params.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);\n break;\n case 'query':\n queryParams.push(\n `${includeIfPresent}'${jsonKey}': ${safePropName}`,\n );\n break;\n default:\n bodyParams.push(`${includeIfPresent}'${jsonKey}': ${safePropName}`);\n }\n } else {\n if (special) {\n bodyParams.push(`$body${serializedType.encodeV2!}`);\n } else {\n bodyParams.push(\n `${includeIfPresent}'${jsonKey}': ${safePropName}${serializedType.encodeV2}`,\n );\n }\n }\n }\n\n if (context.requestize) {\n const body =\n bodyParams.length === 1 && bodyParams[0].startsWith('$body')\n ? bodyParams[0]\n : `${bodyParams.length ? `{${bodyParams.join(', ')}}` : '{}'}`;\n\n requestContent = `\n RequestInput toRequest() =>\n RequestInput(\n headers: ${headers.length ? `{${headers.join(', ')}}` : '{}'},\n query: ${queryParams.length ? `{${queryParams.join(', ')}}` : '{}'},\n params: ${params.length ? `{${params.join(', ')}}` : '{}'},\n body: ${body}\n );`;\n }\n\n const constructorP = constructorParams.length\n ? `{${constructorParams.join('\\n')}}`\n : '';\n\n // const { mixins, withMixins } = this.#mixinise(className, context);\n const fixedClassName = pascalcase(sanitizeTag(className));\n\n // ${!mixins.length ? 'const' : ''} ${fixedClassName}(${constructorP})${mixins.length > 1 ? '' : `:super()`};\n\n const content = `class ${fixedClassName} {\n ${props.join('\\n')}\n const ${fixedClassName}(${constructorP}): super();\n factory ${fixedClassName}.fromJson(Map<String, dynamic> json) {\nreturn ${fixedClassName}(\\n${fromJsonParams.join(',\\n')});\n }\n Map<String, dynamic> toJson() => {\n${toJsonProperties.join(',\\n')}\n };\n static bool matches(Map<String, dynamic> json) {return ${matches.join(' && ')};}\n\n ${requestContent}\n\n }`;\n if (context.noEmit !== true && !context.propName) {\n this.#emit(fixedClassName, content, schema);\n }\n const generatedClassName = context.forJson || className;\n return {\n use: fixedClassName,\n content,\n encode: 'input.toJson()',\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${generatedClassName}.fromJson(${context.parsable})`,\n matches: `${generatedClassName}.matches(${context.parsable})`,\n };\n }\n\n #oneOfObject(\n className: string,\n varientName: string,\n schemaOrRef: SchemaObject | ReferenceObject,\n context: Context,\n ) {\n const schema = resolveRef(this.#spec, schemaOrRef);\n const entries = Object.entries(schema.properties || {});\n if (entries.length === 1) {\n const [key, prop] = entries[0];\n const serializedType = this.handle(\n pascalcase(`${className} ${varientName}`),\n prop,\n true,\n {\n ...context,\n propName: joinSkipDigits([varientName, key], '_'),\n safeName: varientName,\n parsable: `json['${varientName}']`,\n },\n );\n return {\n typeStr: `${serializedType.use}${serializedType.nullable ? '?' : ''} ${key}`,\n returnValue: `_Value({'${key}': ${key}${serializedType.encodeV2}});`,\n fromJson: serializedType.fromJson,\n };\n }\n const serializedType = this.handle(className, schemaOrRef, true, {\n ...context,\n propName: joinSkipDigits([className, varientName], '_'),\n safeName: varientName,\n parsable: `json['${varientName}']`,\n });\n return {\n typeStr: `${serializedType.use} value`,\n returnValue: `_Value(value.toJson());`,\n fromJson: serializedType.fromJson,\n };\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 encodeV2: '',\n fromJson: `List<dynamic>.from(${context.parsable})`,\n matches: '',\n };\n }\n const itemsType = this.handle(className, schema.items, true, {\n ...context,\n parsable: 'it',\n });\n const fromJson = required\n ? context.name\n ? `(${context.parsable} as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()`\n : `(json as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()`\n : context.name\n ? `${context.parsable} != null\n ? (${context.parsable} as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\n .toList()\n : null`\n : `json != null\n ? (json as List)\n .map((it) => ${itemsType.simple ? `it as ${itemsType.use}` : `${itemsType.fromJson}`})\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 simple: true,\n encodeV2: `${itemsType.simple ? '' : `${context.required ? '' : '?'}.map((it) => ${itemsType.simple ? 'it' : `it.toJson()`}).toList()`}`,\n matches: context.parsable\n ? `(${context.parsable} as List).every((it) => ${itemsType.matches})`\n : `${context.parsable} is List && ${context.parsable}.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 encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: `${context.parsable} 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 encodeV2: '',\n simple: true,\n use: 'Null',\n fromJson: context.parsable,\n };\n default:\n // Unknown type -> fallback\n return {\n content: '',\n use: 'dynamic',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: '',\n nullable: false,\n };\n }\n }\n\n #ref(\n className: string,\n $ref: string,\n required: boolean,\n context: Context,\n ): Serialized {\n const schemaName = pascalcase(sanitizeTag(parseRef($ref).model));\n const schema = followRef(this.#spec, $ref);\n if (\n isPrimitiveSchema(schema) ||\n (schema.not !== undefined && isEmpty(schema.not))\n ) {\n return this.handle(schemaName, schema, required, {\n ...context,\n propName: schemaName,\n noEmit: true,\n // default to json in case this method is root level\n parsable: context.parsable || 'json',\n });\n }\n const generatedClassName = context.forJson || schemaName;\n\n const isDynamicObject =\n schema.type === 'object'\n ? !!schema.additionalProperties || isEmpty(schema.properties)\n : schema.anyOf\n ? false\n : !schema.oneOf;\n return {\n use: pascalcase(schemaName),\n content: '',\n encode: 'input.toJson()',\n encodeV2: isDynamicObject\n ? ''\n : `${context.required ? '' : '?'}.toJson()`,\n fromJson: isDynamicObject\n ? `${generatedClassName}.from(json)`\n : `${generatedClassName}.fromJson(${context.parsable || 'json'})`,\n matches: isDynamicObject\n ? `${context.parsable} is ${generatedClassName}`\n : `${generatedClassName}.matches(${context.parsable})`,\n simple: isDynamicObject,\n };\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 #mixinise(name: string, context: Context) {\n const mixins = getRefUsage(this.#spec, name);\n if (context.mixin) {\n mixins.unshift(context.mixin);\n }\n const withMixins =\n mixins.length > 1\n ? ` implements ${mixins.join(', ')}`\n : mixins.length === 1\n ? `extends ${mixins[0]}`\n : '';\n return {\n withMixins,\n mixins,\n };\n }\n\n #buildClass(options: {\n name: string;\n abstract?: boolean;\n mixins?: string[];\n withMixins?: string;\n content: string[];\n implements?: string[];\n }) {\n return [\n options.abstract ? 'abstract' : '',\n options.mixins?.length ? '' : 'mixin',\n `class ${options.name} ${options.withMixins} ${options.implements?.length ? `implements ${options.implements.join(', ')}` : ''}`,\n '{',\n options.content.join('\\n'),\n '}',\n ]\n .filter(Boolean)\n .join('\\n');\n }\n\n #oneOf(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const varients: Varient[] = schema['x-varients'];\n const schemas = schema.oneOf || schema.anyOf || [];\n const name = pascalcase(sanitizeTag(context.propName || className)); // className in case is top level\n if (schemas.length === 0) {\n return {\n content: '',\n nullable: false,\n use: 'dynamic',\n encodeV2: '',\n fromJson: context.parsable,\n };\n }\n\n const content: string[] = [];\n const patterns: { pattern: string; name: string }[] = [];\n\n content.push(`class _Value implements ${name} {\n final dynamic value;\n const _Value(this.value);\n @override\n toJson() => value;\n}`);\n\n for (const { name: varientName, ...varient } of varients) {\n switch (varientName) {\n case 'empty':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}() => _Value(\"\");`,\n pattern: `case '': return ${name}.${formatName(varientName)}();`,\n });\n continue;\n case 'uri':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(Uri value) => _Value(value);`,\n pattern: `case String: return ${name}.${formatName(varientName)}(Uri.parse(json));`,\n });\n continue;\n case 'number':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(num value) => _Value(value);`,\n pattern: `case num: return ${name}.${formatName(varientName)}(json);`,\n });\n continue;\n case 'object': {\n // const objectSchema = resolveRef(\n // this.#spec,\n // schemas[varient.position],\n // );\n // const result = this.#object(\n // pascalcase(`${name} ${formatName(varientName)}`),\n // objectSchema,\n // { ...context, noEmit: false },\n // );\n const result = this.handle(className, schemas[varient.position]);\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${result.use} value) => _Value(value);`,\n pattern: `case Map<String, dynamic> map: return ${name}.${formatName(varientName)}(${pascalcase(\n `${name} ${formatName(varientName)}`,\n )}.fromJson(map));`,\n });\n continue;\n }\n }\n switch (varient.type) {\n case 'string':\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(String value) => _Value(value);`,\n pattern: `case String: return ${name}.${formatName(varientName)}(json);`,\n });\n break;\n case 'object': {\n const { typeStr, returnValue, fromJson } = this.#oneOfObject(\n name,\n varientName,\n schemas[varient.position],\n context,\n );\n const staticStr = varient.static\n ? `&& json['${varient.source}'] == '${formatName(varientName)}'`\n : '';\n const caseStr = `case Map<String, dynamic> json when json.containsKey('${varient.source}') ${staticStr}`;\n\n const returnStr = `return ${name}.${formatName(varientName)}(${fromJson})`;\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${typeStr}) => ${returnValue}`,\n pattern: `${caseStr}: ${returnStr};`,\n });\n break;\n }\n case 'array': {\n const serializedType = this.handle(\n className,\n schemas[varient.position],\n true,\n {\n ...context,\n noEmit: true,\n parsable: 'json',\n },\n );\n patterns.push({\n name: `static ${name} ${formatName(varientName)}(${serializedType.use} value) => _Value(value);`,\n pattern: `case ${serializedType.use} json: return ${name}.${formatName(varientName)}(${serializedType.fromJson});`,\n });\n break;\n }\n default: {\n //\n }\n }\n }\n const { mixins, withMixins } = this.#mixinise(name, context);\n content.push(\n this.#buildClass({\n name,\n abstract: true,\n mixins,\n withMixins,\n content: [\n // 'dynamic get value;',\n 'dynamic toJson();',\n ...patterns.map((it) => it.name),\n `${name}();`,\n `factory ${name}.fromJson(dynamic json)`,\n `{`,\n `switch (json) {`,\n ...patterns.map((it) => it.pattern),\n `default: throw ArgumentError(\"Invalid type: \\${json}\");`,\n `}`,\n `}`,\n `static bool matches(dynamic value) {\n try {\n ${name}.fromJson(value);\n return true;\n } catch (error) {\n return false;\n }\n }`,\n ],\n }),\n );\n\n if (context.noEmit !== true) {\n this.#emit(name, content.join('\\n'), {\n oneOf: schemas,\n });\n }\n\n return {\n content: content.join('\\n'),\n use: name,\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${name}.fromJson(${context.parsable})`,\n matches: `${name}.matches(${context.parsable})`,\n };\n }\n\n #simple(type?: SchemaObjectType) {\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 case 'object':\n return 'Map<String, dynamic>';\n case 'array':\n return 'List<dynamic>';\n case 'null':\n return 'Null';\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(coerceTypes(schema)[0]);\n // fixme: if enum have one value and cannot be null then use it as default value\n\n const { mixins, withMixins } = this.#mixinise(name, context);\n\n // ${this.#buildClass({\n // name: '_EnumValue',\n // implements: [pascalcase(formatName(name))],\n // content: `final ${valType} value;\n // const _EnumValue(this.value);\n // @override\n // toJson() => value;`,\n // })}\n // formatName(snakecase(formatName(it))) => formatName('NEW') => NEW => snakecase(formatName('NEW')) => new => formatName(snakecase(formatName('NEW'))) => $new\n const content = `\n class _EnumValue implements ${pascalcase(formatName(name))} {\n final ${valType} value;\n const _EnumValue(this.value);\n @override\n toJson() => value;\n}\n abstract ${mixins.length ? '' : 'mixin'} class ${pascalcase(formatName(name))} ${withMixins} {\n ${values.map((it) => `static const _EnumValue ${formatName(snakecase(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(snakecase(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(pascalcase(formatName(name)), content, schema);\n }\n return {\n use: pascalcase(formatName(name)),\n type: this.#simple(coerceTypes(schema)[0]),\n content: content,\n encodeV2: `${context.required ? '' : '?'}.toJson()`,\n fromJson: `${pascalcase(name)}.fromJson(${context.parsable})`,\n matches: `${pascalcase(name)}.matches(${context.parsable})`,\n };\n }\n\n #const(\n className: string,\n schema: SchemaObject,\n context: Context,\n ): Serialized {\n const valType = this.#simple(coerceTypes(schema)[0]);\n return {\n content: '',\n literal: valType === 'String' ? `'${schema.const}'` : schema.const,\n use: valType,\n encode: 'input',\n encodeV2: '',\n fromJson: context.parsable,\n matches: context.parsable,\n simple: true,\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 encodeV2: `${context.required ? '' : '?'}.toIso8601String()`,\n fromJson: context.parsable\n ? context.required\n ? `DateTime.parse(${context.parsable})`\n : `${context.parsable} != null ? DateTime.parse(${context.parsable}) : null`\n : 'json',\n matches: `${context.parsable} is String`,\n };\n case 'binary':\n case 'byte':\n return {\n content: '',\n use: 'File',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\n matches: `${context.parsable} is Uint8List`,\n };\n default:\n return {\n encode: 'input',\n use: `String`,\n content: '',\n encodeV2: '',\n simple: true,\n fromJson: `${context.parsable} as String`,\n matches: `${context.parsable} 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 encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is int`,\n };\n }\n if (['float', 'double'].includes(schema.format as string)) {\n return {\n content: '',\n use: 'double',\n simple: true,\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} is double`,\n };\n }\n return {\n content: '',\n use: 'num',\n simple: true,\n encodeV2: '',\n fromJson: context.parsable,\n matches: `${context.parsable} 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\n if (schema.not && isEmpty(schema.not)) {\n return {\n content: '',\n use: 'Never',\n encodeV2: '',\n simple: true,\n fromJson: `${context.parsable || 'json'} as Never`,\n matches: 'false',\n nullable: false,\n impossible: true,\n };\n }\n\n if (schema.const !== undefined) {\n return this.#const(className, schema, context);\n }\n\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(className, schema, 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, context);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#oneOf(className, schema, context);\n }\n\n // Handle types\n const types = coerceTypes(schema, false);\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 // Unknown type -> fallback\n content: '',\n use: 'dynamic',\n encodeV2: '',\n simple: true,\n fromJson: context.parsable,\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(\n pascalcase(formatName(className)),\n `typedef ${pascalcase(alias)} = ${serialized.use};`,\n resolveRef(this.#spec, schema),\n );\n return serialized;\n }\n return serialized;\n }\n}\n\nexport function isObjectSchema(\n schema: SchemaObject | ReferenceObject,\n): schema is SchemaObject {\n return (\n !isRef(schema) &&\n (schema.type === 'object' || !!coearceObject(schema).properties)\n );\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 void _setHeaders(\n http.BaseRequest request,\n RequestConfig config, [\n String? contentType,\n ]) {\n request.headers.addAll(config.headers);\n for (var entry in config.input.headers.entries) {\n final value = entry.value;\n if (value != null) {\n request.headers[entry.key] = value;\n }\n }\n if (contentType != null) {\n request.headers['Content-Type'] = contentType;\n }\n }\n\n void _setParams(RequestConfig config) {\n final params = config.input.params;\n if (params.isEmpty) return;\n\n String path = config.url.toString();\n for (var entry in params.entries) {\n path = path.replaceAll('{${entry.key}}', entry.value.toString());\n }\n config.url = Uri.parse(path);\n }\n\n void _setQuery(RequestConfig config) {\n final query = config.input.query;\n if (query.isEmpty) return;\n\n final uri = config.url;\n final queryParameters = Map<String, String>.from(uri.queryParameters);\n\n for (var entry in query.entries) {\n if (entry.value != null) {\n queryParameters[entry.key] = entry.value.toString();\n }\n }\n\n config.url = uri.replace(queryParameters: queryParameters);\n }\n\n Future<http.StreamedResponse> formdata(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.MultipartRequest(\n modifiedConfig.method,\n modifiedConfig.url,\n );\n _setHeaders(request, modifiedConfig);\n\n for (var entry in config.input.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 _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig);\n return request.send();\n }\n\n Future<http.StreamedResponse> json(RequestConfig config) {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/json');\n\n if ((config.input.body is Map || config.input.body is List)) {\n request.body = jsonEncode(config.input.body);\n } else if (config.input.body is String) {\n request.body = config.input.body;\n } else {\n throw ArgumentError(\n 'Unsupported body type: ${config.input.body.runtimeType}',\n );\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> binary(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/octet-stream');\n\n switch (config.input.body) {\n case List<int> bytes:\n request.bodyBytes = bytes;\n case Stream<List<int>> stream:\n request.bodyBytes = await stream.expand((x) => x).toList();\n case String body:\n request.body = body;\n case File file:\n request.bodyBytes = await file.readAsBytes();\n default:\n throw ArgumentError(\n 'Unsupported body type for binary request: ${config.input.body.runtimeType}',\n );\n }\n\n return request.send();\n }\n\n Future<http.StreamedResponse> urlencoded(RequestConfig config) async {\n final modifiedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n _setParams(modifiedConfig);\n _setQuery(modifiedConfig);\n final request = http.Request(modifiedConfig.method, modifiedConfig.url);\n _setHeaders(request, modifiedConfig, 'application/x-www-form-urlencoded');\n\n // Convert body to URL-encoded string\n final bodyMap = config.input.body;\n request.body = bodyMap.entries\n .map(\n (entry) =>\n '${Uri.encodeComponent(entry.key)}=${Uri.encodeComponent(entry.value.toString())}',\n )\n .join('&');\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.startsWith('application/json')) {\n return jsonDecode(response.body);\n } else if (parsed.type.startsWith('text/')) {\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 Future<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 throw _handleError(stream);\n }\n\n Future<String> text(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 throw _handleError(stream);\n }\n\n _handleError(http.StreamedResponse stream) {\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 412:\n throw PreconditionFailedError('');\n case 415:\n throw UnsupportedMediaTypeError('');\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\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 LoggingInterceptor extends Interceptor {\n // ANSI color codes\n static const String _reset = '\\x1B[0m';\n static const String _green = '\\x1B[32m';\n static const String _yellow = '\\x1B[33m';\n static const String _blue = '\\x1B[34m';\n static const String _magenta = '\\x1B[35m';\n static const String _cyan = '\\x1B[36m';\n\n @override\n RequestConfig before(RequestConfig config) {\n print('${_cyan}[LOG] --- HTTP REQUEST ---$_reset');\n print('${_yellow}[LOG] Method: ${config.method.toUpperCase()}$_reset');\n print('${_green}[LOG] URL: ${config.url}$_reset');\n print('${_magenta}[ContentType] ${config.headers['content-type']}$_reset');\n if (config.headers.isNotEmpty) {\n print('${_blue}[LOG] Headers: ${config.headers}$_reset');\n } else {\n print('${_blue}[LOG] Headers: <none>$_reset');\n }\n print('${_cyan}[LOG] --------------$_reset');\n return config;\n }\n\n @override\n void after() {\n // Optionally log after the request\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n final RequestInput input;\n\n RequestConfig({\n required this.method,\n required this.url,\n required this.headers,\n this.input = const RequestInput.empty(),\n });\n}\n\nclass RequestInput {\n final Map<String, String?> headers;\n final Map<String, dynamic> query;\n final Map<String, dynamic> params;\n final dynamic body;\n RequestInput({\n this.headers = const {},\n this.query = const {},\n this.params = const {},\n required this.body,\n });\n\n const RequestInput.empty()\n : headers = const {},\n query = const {},\n params = const {},\n body = null;\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
6
  "names": ["camelcase", "isEmpty", "isRef", "pascalcase", "resolveRef", "snakecase", "serializedType", "pascalcase", "camelcase", "snakecase", "resolveRef", "isEmpty", "name", "schema", "isRef"]
7
7
  }
@@ -13,6 +13,7 @@ type Serialized = {
13
13
  literal?: unknown;
14
14
  content: string;
15
15
  simple?: boolean;
16
+ impossible?: boolean;
16
17
  };
17
18
  type Emit = (name: string, content: string, schema: SchemaObject) => void;
18
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dart-emitter.d.ts","sourceRoot":"","sources":["../../src/lib/dart-emitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAa3B,OAAO,EACL,KAAK,EAAE,EAOR,MAAM,cAAc,CAAC;AAEtB,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiBhE;AAED,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AACF,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AAC1E;;GAEG;AACH,qBAAa,cAAc;;gBAab,IAAI,EAAE,EAAE;IAIpB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IA+0BxB,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GAAG,eAAe,EACtC,QAAQ,UAAO,EACf,OAAO,GAAE,OAAY,GACpB,UAAU;CAkBd;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,GAAG,eAAe,GACrC,MAAM,IAAI,YAAY,CAKxB"}
1
+ {"version":3,"file":"dart-emitter.d.ts","sourceRoot":"","sources":["../../src/lib/dart-emitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAa3B,OAAO,EACL,KAAK,EAAE,EAOR,MAAM,cAAc,CAAC;AAEtB,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiBhE;AAED,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AACF,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AAC1E;;GAEG;AACH,qBAAa,cAAc;;gBAab,IAAI,EAAE,EAAE;IAIpB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IA+2BxB,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GAAG,eAAe,EACtC,QAAQ,UAAO,EACf,OAAO,GAAE,OAAY,GACpB,UAAU;CAkBd;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,GAAG,eAAe,GACrC,MAAM,IAAI,YAAY,CAKxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdk-it/dart",
3
- "version": "0.46.0",
3
+ "version": "0.46.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -23,8 +23,8 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "openapi3-ts": "4.5.0",
26
- "@sdk-it/core": "0.46.0",
27
- "@sdk-it/spec": "0.46.0",
26
+ "@sdk-it/core": "0.46.2",
27
+ "@sdk-it/spec": "0.46.2",
28
28
  "lodash-es": "^4.17.21",
29
29
  "stringcase": "^4.3.1",
30
30
  "fast-content-type-parse": "^3.0.0",