@redocly/client-generator 0.7.10 → 0.7.12

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.
Files changed (135) hide show
  1. package/eject-assets/generators/cli/docs.ts +1 -1
  2. package/eject-assets/generators/cli/engine-source.ts +1 -1
  3. package/eject-assets/generators/cli/index.ts +2 -2
  4. package/eject-assets/generators/cli/render.ts +1 -1
  5. package/eject-assets/generators/go/client.ts +1 -1
  6. package/eject-assets/generators/go/descriptor.ts +1 -1
  7. package/eject-assets/generators/go/index.ts +2 -2
  8. package/eject-assets/generators/go/models.ts +7 -2
  9. package/eject-assets/generators/go/naming.ts +1 -1
  10. package/eject-assets/generators/go/operations.ts +1 -1
  11. package/eject-assets/generators/go/pagination.ts +1 -1
  12. package/eject-assets/generators/go/types.ts +1 -1
  13. package/eject-assets/generators/mock/faker.ts +17 -9
  14. package/eject-assets/generators/mock/index.ts +4 -3
  15. package/eject-assets/generators/mock/render.ts +128 -9
  16. package/eject-assets/generators/mock/sample.ts +87 -4
  17. package/eject-assets/generators/mock/values.ts +1 -1
  18. package/eject-assets/generators/php/client.ts +1 -1
  19. package/eject-assets/generators/php/descriptor.ts +10 -1
  20. package/eject-assets/generators/php/index.ts +2 -2
  21. package/eject-assets/generators/php/models.ts +8 -3
  22. package/eject-assets/generators/php/naming.ts +1 -1
  23. package/eject-assets/generators/php/operations.ts +11 -6
  24. package/eject-assets/generators/php/pagination.ts +3 -2
  25. package/eject-assets/generators/php/types.ts +12 -2
  26. package/eject-assets/generators/python/client.ts +1 -1
  27. package/eject-assets/generators/python/descriptor.ts +1 -1
  28. package/eject-assets/generators/python/index.ts +3 -3
  29. package/eject-assets/generators/python/models.ts +9 -3
  30. package/eject-assets/generators/python/naming.ts +1 -1
  31. package/eject-assets/generators/python/operations.ts +6 -5
  32. package/eject-assets/generators/python/pagination.ts +1 -1
  33. package/eject-assets/generators/python/types.ts +1 -1
  34. package/eject-assets/generators/swr/index.ts +2 -2
  35. package/eject-assets/generators/swr/render.ts +1 -1
  36. package/eject-assets/generators/tanstack-query/index.ts +2 -2
  37. package/eject-assets/generators/tanstack-query/render.ts +6 -5
  38. package/eject-assets/generators/transformers/index.ts +2 -2
  39. package/eject-assets/generators/transformers/render.ts +34 -7
  40. package/eject-assets/generators/typescript/banner.ts +1 -1
  41. package/eject-assets/generators/typescript/client.ts +1 -1
  42. package/eject-assets/generators/typescript/descriptor.ts +1 -1
  43. package/eject-assets/generators/typescript/index.ts +2 -2
  44. package/eject-assets/generators/typescript/inline-runtime.ts +1 -1
  45. package/eject-assets/generators/typescript/operation-signature.ts +1 -1
  46. package/eject-assets/generators/typescript/operation-types.ts +1 -1
  47. package/eject-assets/generators/typescript/operations.ts +1 -1
  48. package/eject-assets/generators/typescript/response-headers.ts +1 -1
  49. package/eject-assets/generators/typescript/type-guards.ts +1 -1
  50. package/eject-assets/generators/typescript/types.ts +1 -1
  51. package/eject-assets/generators/zod/index.ts +2 -2
  52. package/eject-assets/generators/zod/schemas.ts +1 -1
  53. package/eject-assets/skills/go-generator/SKILL.md +3 -0
  54. package/eject-assets/skills/mock-generator/SKILL.md +22 -0
  55. package/eject-assets/skills/php-generator/SKILL.md +9 -2
  56. package/eject-assets/skills/python-generator/SKILL.md +6 -0
  57. package/eject-assets/skills/tanstack-query-generator/SKILL.md +2 -1
  58. package/eject-assets/skills/transformers-generator/SKILL.md +4 -0
  59. package/eject-assets/skills/typescript-generator/SKILL.md +5 -0
  60. package/lib/authoring/schema.d.ts.map +1 -1
  61. package/lib/authoring/schema.js +4 -1
  62. package/lib/authoring/schema.js.map +1 -1
  63. package/lib/generators/go/models.d.ts.map +1 -1
  64. package/lib/generators/go/models.js +4 -1
  65. package/lib/generators/go/models.js.map +1 -1
  66. package/lib/generators/mock/faker.js +18 -8
  67. package/lib/generators/mock/faker.js.map +1 -1
  68. package/lib/generators/mock/index.d.ts.map +1 -1
  69. package/lib/generators/mock/index.js +2 -1
  70. package/lib/generators/mock/index.js.map +1 -1
  71. package/lib/generators/mock/render.d.ts +3 -1
  72. package/lib/generators/mock/render.d.ts.map +1 -1
  73. package/lib/generators/mock/render.js +119 -9
  74. package/lib/generators/mock/render.js.map +1 -1
  75. package/lib/generators/mock/sample.d.ts +18 -1
  76. package/lib/generators/mock/sample.d.ts.map +1 -1
  77. package/lib/generators/mock/sample.js +71 -2
  78. package/lib/generators/mock/sample.js.map +1 -1
  79. package/lib/generators/php/descriptor.d.ts +6 -0
  80. package/lib/generators/php/descriptor.d.ts.map +1 -1
  81. package/lib/generators/php/descriptor.js +8 -0
  82. package/lib/generators/php/descriptor.js.map +1 -1
  83. package/lib/generators/php/models.d.ts.map +1 -1
  84. package/lib/generators/php/models.js +5 -2
  85. package/lib/generators/php/models.js.map +1 -1
  86. package/lib/generators/php/operations.d.ts.map +1 -1
  87. package/lib/generators/php/operations.js +5 -5
  88. package/lib/generators/php/operations.js.map +1 -1
  89. package/lib/generators/php/pagination.d.ts.map +1 -1
  90. package/lib/generators/php/pagination.js +2 -1
  91. package/lib/generators/php/pagination.js.map +1 -1
  92. package/lib/generators/php/types.d.ts.map +1 -1
  93. package/lib/generators/php/types.js +13 -2
  94. package/lib/generators/php/types.js.map +1 -1
  95. package/lib/generators/python/index.js +1 -1
  96. package/lib/generators/python/index.js.map +1 -1
  97. package/lib/generators/python/models.d.ts.map +1 -1
  98. package/lib/generators/python/models.js +6 -2
  99. package/lib/generators/python/models.js.map +1 -1
  100. package/lib/generators/python/operations.d.ts.map +1 -1
  101. package/lib/generators/python/operations.js +5 -4
  102. package/lib/generators/python/operations.js.map +1 -1
  103. package/lib/generators/tanstack-query/render.js +5 -4
  104. package/lib/generators/tanstack-query/render.js.map +1 -1
  105. package/lib/generators/transformers/render.d.ts +1 -1
  106. package/lib/generators/transformers/render.d.ts.map +1 -1
  107. package/lib/generators/transformers/render.js +24 -5
  108. package/lib/generators/transformers/render.js.map +1 -1
  109. package/lib/generators/typescript/runtime/create-client.js +1 -1
  110. package/lib/generators/typescript/runtime/create-client.js.map +1 -1
  111. package/lib/generators/typescript/runtime/paginate.d.ts.map +1 -1
  112. package/lib/generators/typescript/runtime/paginate.js +5 -4
  113. package/lib/generators/typescript/runtime/paginate.js.map +1 -1
  114. package/lib/generators/typescript/runtime/send.d.ts.map +1 -1
  115. package/lib/generators/typescript/runtime/send.js +10 -4
  116. package/lib/generators/typescript/runtime/send.js.map +1 -1
  117. package/lib/generators/typescript/runtime/sse.d.ts.map +1 -1
  118. package/lib/generators/typescript/runtime/sse.js +6 -1
  119. package/lib/generators/typescript/runtime/sse.js.map +1 -1
  120. package/lib/intermediate-representation/build.d.ts.map +1 -1
  121. package/lib/intermediate-representation/build.js +51 -26
  122. package/lib/intermediate-representation/build.js.map +1 -1
  123. package/lib/intermediate-representation/model.d.ts +6 -2
  124. package/lib/intermediate-representation/model.d.ts.map +1 -1
  125. package/lib/intermediate-representation/model.js.map +1 -1
  126. package/lib/runtime-contract.d.ts +1 -1
  127. package/lib/runtime-contract.d.ts.map +1 -1
  128. package/lib/runtime-contract.js.map +1 -1
  129. package/lib/runtime-sources/python.d.ts +2 -2
  130. package/lib/runtime-sources/python.js +2 -2
  131. package/lib/runtime-sources/python.js.map +1 -1
  132. package/lib/runtime-sources/typescript.d.ts +10 -10
  133. package/lib/runtime-sources/typescript.js +10 -10
  134. package/lib/runtime-sources/typescript.js.map +1 -1
  135. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "php" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "php" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator php --update`.
@@ -18,7 +18,7 @@ import {
18
18
  } from '@redocly/client-generator';
19
19
  import type { PhpPrinter } from '@redocly/client-generator/printers/php';
20
20
 
21
- import { envelopeHeaderSpecs } from './descriptor.ts';
21
+ import { envelopeHeaderSpecs, phpSecurityArg } from './descriptor.ts';
22
22
  import { hydration, serialization } from './models.ts';
23
23
  import { PHP, phpString } from './naming.ts';
24
24
  import { phpElementType, phpNullable, phpType } from './types.ts';
@@ -94,10 +94,15 @@ export function methodArgs(
94
94
  }
95
95
 
96
96
  /** The shared prologue: resolve auth, build query/url, merge headers. */
97
- function writeRequestSetup(printer: PhpPrinter, op: OperationModel, args: MethodArgs): void {
97
+ function writeRequestSetup(
98
+ printer: PhpPrinter,
99
+ op: OperationModel,
100
+ model: ApiModel,
101
+ args: MethodArgs
102
+ ): void {
98
103
  printer.line(`$op = self::OPERATIONS[${phpString(op.specName ?? op.name)}];`);
99
104
  printer.line(
100
- "[$authHeaders, $query, $cookies] = resolveAuth($op['security'] ?? [], $this->config->auth);"
105
+ `[$authHeaders, $query, $cookies] = resolveAuth(${phpSecurityArg(op, model)}, $this->config->auth);`
101
106
  );
102
107
  for (const { php, wire, value } of args.queryArgs) {
103
108
  printer.block(
@@ -154,13 +159,13 @@ export function writePhpMethod(
154
159
  envelope
155
160
  ? `Like ${ident}(), returning an Envelope with the declared response headers.`
156
161
  : (op.summary ?? `${op.method.toUpperCase()} ${op.path}`),
157
- element === undefined ? [] : [`@return ${element}[]`]
162
+ element === undefined ? [] : [`@return ${element.includes('|') ? `(${element})` : element}[]`]
158
163
  );
159
164
  printer.line(`public function ${name}(${args.signature.join(', ')}): ${returnType}`);
160
165
  printer.block(
161
166
  '{',
162
167
  () => {
163
- writeRequestSetup(printer, op, args);
168
+ writeRequestSetup(printer, op, model, args);
164
169
  if (sse !== undefined) {
165
170
  const jsonData = sse.schema !== undefined && sse.schema.kind !== 'unknown';
166
171
  printer.line('$url = appendQuery($url, $query);');
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "php" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "php" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator php --update`.
@@ -13,6 +13,7 @@ import {
13
13
  } from '@redocly/client-generator';
14
14
  import type { PhpPrinter } from '@redocly/client-generator/printers/php';
15
15
 
16
+ import { phpSecurityArg } from './descriptor.ts';
16
17
  import { phpString } from './naming.ts';
17
18
  import { methodArgs } from './operations.ts';
18
19
  import { phpType } from './types.ts';
@@ -51,7 +52,7 @@ export function writePhpPaginationWrappers(
51
52
  '$call = function (array $params) use ($op, $headers): array {',
52
53
  () => {
53
54
  printer.line(
54
- "[$authHeaders, $authQuery, $cookies] = resolveAuth($op['security'] ?? [], $this->config->auth);"
55
+ `[$authHeaders, $authQuery, $cookies] = resolveAuth(${phpSecurityArg(op, model)}, $this->config->auth);`
55
56
  );
56
57
  printer.line(`$url = buildUrl($this->config->serverUrl, $op['path'], [${pathDict}]);`);
57
58
  printer.line('$requestHeaders = array_merge($authHeaders, $headers ?? []);');
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "php" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "php" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator php --update`.
@@ -9,6 +9,7 @@ import {
9
9
  type ApiModel,
10
10
  type DateType,
11
11
  deref,
12
+ discriminatorCases,
12
13
  enumValues,
13
14
  flattenAllOf,
14
15
  isNullable,
@@ -61,7 +62,16 @@ export function phpType(
61
62
  const kind = classify(schema.name, model);
62
63
  if (kind === 'class' || kind === 'enum') return className(schema.name);
63
64
  const target = deref(schema, model);
64
- return target === undefined ? 'mixed' : phpType(target, model, dateType);
65
+ if (target === undefined) return 'mixed';
66
+ const type = phpType(target, model, dateType);
67
+ // A discriminated union hydrates through `unmarshalX`, which hands a value with an
68
+ // unknown discriminator back as the raw array.
69
+ // A nullable type drops its `?` first, because PHP forbids `?` inside a union.
70
+ const raw = discriminatorCases(target, model) !== undefined;
71
+ if (!raw || type === 'mixed' || type.split('|').includes('array')) return type;
72
+ const nullable = type.startsWith('?') || type.endsWith('|null');
73
+ const bare = type.startsWith('?') ? type.slice(1) : type.replace(/\|null$/, '');
74
+ return nullable ? phpNullable(`${bare}|array`) : `${bare}|array`;
65
75
  }
66
76
  case 'enum':
67
77
  // Anonymous (inline) enums keep the wire scalar; only NAMED enums get types.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -138,7 +138,7 @@ export const pythonGenerator: Generator = ({
138
138
  for (const { op, ident } of operationIdents(model)) {
139
139
  paginationSpecs.set(ident, paginationSpec(pagination?.get(op.name)?.spec));
140
140
  }
141
- printer.line('_OPERATIONS = {');
141
+ printer.line('_OPERATIONS: Dict[str, Dict[str, Any]] = {');
142
142
  printer.indent(() => {
143
143
  for (const { op, ident } of operationIdents(model)) {
144
144
  const descriptor = {
@@ -247,5 +247,5 @@ export default {
247
247
  "argsStyle": "inputs follow the target language's own idiom",
248
248
  "importExt": "the generated file has no relative imports"
249
249
  },
250
- requiresGenerator: '^0.7.10',
250
+ requiresGenerator: '^0.7.12',
251
251
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -84,6 +84,11 @@ function writeDataclass(
84
84
  /** The discriminator value this class is mapped to, pinned as a `Literal` (pydantic). */
85
85
  pinned?: DiscriminatorPin
86
86
  ): void {
87
+ // A response never carries a `writeOnly` property, and responses decode into this same
88
+ // class, so the property is optional even when the description requires it.
89
+ const fields = properties.map((property) =>
90
+ property.writeOnly ? { ...property, required: false } : property
91
+ );
87
92
  const pydantic = models === 'pydantic';
88
93
  if (!pydantic) printer.line('@dataclass');
89
94
  const header = pydantic ? `class ${className(name)}(BaseModel):` : `class ${className(name)}:`;
@@ -97,8 +102,8 @@ function writeDataclass(
97
102
  }
98
103
  // Required fields first — a dataclass field without a default may not follow one with.
99
104
  const ordered = [
100
- ...properties.filter((property) => property.required),
101
- ...properties.filter((property) => !property.required),
105
+ ...fields.filter((property) => property.required),
106
+ ...fields.filter((property) => !property.required),
102
107
  ];
103
108
  const fieldMap: Array<[string, string]> = [];
104
109
  if (ordered.length === 0) printer.line('pass');
@@ -157,6 +162,7 @@ export function renderPythonModels(
157
162
  'Optional',
158
163
  'Tuple',
159
164
  'Union',
165
+ 'cast',
160
166
  ];
161
167
  if (models === 'dataclass') typingNames.splice(2, 0, 'ClassVar');
162
168
  if (unions.size > 0) typingNames.unshift('Annotated');
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -72,7 +72,7 @@ export function writeMethod(
72
72
  : sse !== undefined
73
73
  ? `${isAsync ? 'AsyncIterator' : 'Iterator'}[ServerSentEvent]`
74
74
  : errorMode === 'result'
75
- ? 'Result'
75
+ ? `Result[${success === undefined ? 'None' : pythonType(success, dateType)}, Any]`
76
76
  : success === undefined
77
77
  ? 'None'
78
78
  : pythonType(success, dateType);
@@ -103,7 +103,7 @@ export function writeMethod(
103
103
  printer.line(`url = build_url(self._server_url, op["path"], {${pathDict}})`);
104
104
  if (sse !== undefined) {
105
105
  const dataKind = sse.schema !== undefined && sse.schema.kind !== 'unknown' ? 'json' : 'text';
106
- printer.block('def _open(extra_headers: Dict[str, str]):', () => {
106
+ printer.block('def _open(extra_headers: Dict[str, str]) -> Any:', () => {
107
107
  printer.line(
108
108
  'return self._http.stream(op["method"], url, ' +
109
109
  'headers={**auth_headers, **(headers or {}), **extra_headers}, params=params, timeout=timeout)'
@@ -129,10 +129,11 @@ export function writeMethod(
129
129
  `headers={**auth_headers, **(headers or {})}, params=params${bodyKw}, ` +
130
130
  'timeout=timeout, retry=retry, idempotency_key=idempotency_key)'
131
131
  );
132
+ const successType = success === undefined ? undefined : pythonType(success, dateType);
132
133
  const decoded =
133
- success === undefined
134
+ successType === undefined
134
135
  ? 'None'
135
- : `decode(${pythonType(success, dateType)}, _safe_json(response))`;
136
+ : `cast(${successType}, decode(${successType}, _safe_json(response)))`;
136
137
  if (envelope) {
137
138
  printer.block('if not response.is_success:', () => {
138
139
  printer.line(
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "python" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "python" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator python --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "swr" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "swr" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator swr --update`.
@@ -33,5 +33,5 @@ export default {
33
33
  run: swrGenerator,
34
34
  requires: ["typescript"],
35
35
  errorModes: ["throw"],
36
- requiresGenerator: '^0.7.10',
36
+ requiresGenerator: '^0.7.12',
37
37
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "swr" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "swr" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator swr --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "tanstack-query" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "tanstack-query" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator tanstack-query --update`.
@@ -44,5 +44,5 @@ export default {
44
44
  run: tanstackQueryGenerator('react'),
45
45
  requires: ["typescript"],
46
46
  errorModes: ["throw"],
47
- requiresGenerator: '^0.7.10',
47
+ requiresGenerator: '^0.7.12',
48
48
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "tanstack-query" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "tanstack-query" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator tanstack-query --update`.
@@ -236,12 +236,13 @@ function infiniteMember(
236
236
  );
237
237
  }
238
238
  // The cursor is a query parameter, so it lands in the sdk's own spelling for one:
239
- // inside the `query` layer, or at the top level of a merged call.
240
- const cursor = safeIdent(spec.param);
239
+ // inside the `query` layer, or at the top level of a merged call. A first page without
240
+ // a cursor leaves the key out, so `exactOptionalPropertyTypes` accepts the call.
241
+ const cursor = `...(pageParam === undefined ? {} : { ${safeIdent(spec.param)}: pageParam })`;
241
242
  const override =
242
243
  argsStyle === 'flat'
243
- ? `{ ...vars, ${cursor}: pageParam }`
244
- : `{ ...vars, query: { ...vars.query, ${cursor}: pageParam } }`;
244
+ ? `{ ...vars, ${cursor} }`
245
+ : `{ ...vars, query: { ...vars.query, ${cursor} } }`;
245
246
  return (
246
247
  ` ${op.name}InfiniteOptions: (${params}) => infiniteQueryOptions({\n` +
247
248
  ` queryKey: [...${op.name}QueryKey(${keyArg}), "infinite"] as const,\n` +
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "transformers" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "transformers" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator transformers --update`.
@@ -42,5 +42,5 @@ export default {
42
42
  run: transformersGenerator,
43
43
  requires: ["typescript"],
44
44
  dateTypes: ["Date"],
45
- requiresGenerator: '^0.7.10',
45
+ requiresGenerator: '^0.7.12',
46
46
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "transformers" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "transformers" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator transformers --update`.
@@ -13,7 +13,12 @@
13
13
  // `transformPet` calls `transformOwner(data["owner"])` when `Pet.owner` is an
14
14
  // `Owner` that has dates. Source-text templates throughout.
15
15
 
16
- import type { ApiModel, NamedSchemaModel, SchemaModel } from '@redocly/client-generator';
16
+ import {
17
+ type ApiModel,
18
+ flattenAllOf,
19
+ type NamedSchemaModel,
20
+ type SchemaModel,
21
+ } from '@redocly/client-generator';
17
22
  import { pascalCase, safeIdent } from '@redocly/client-generator/printers/typescript';
18
23
 
19
24
  const INDENT = ' ';
@@ -467,8 +472,17 @@ function convertCollection(
467
472
  );
468
473
  }
469
474
 
470
- /** `export const transform<Name> = (data: <Name>): <Name> => { … };`. */
471
- function transformBlock(named: NamedSchemaModel, byName: Map<string, SchemaModel>): string {
475
+ /**
476
+ * `export const transform<Name> = (data: <Name>): <Name> => { … };`. A schema with
477
+ * `writeOnly` properties is never returned whole: its responses are typed
478
+ * `Omit<Name, …>`. Its transform takes that shape and returns the type it was given:
479
+ * `<T extends Omit<Name, …>>(input: T): T`.
480
+ */
481
+ function transformBlock(
482
+ named: NamedSchemaModel,
483
+ model: ApiModel,
484
+ byName: Map<string, SchemaModel>
485
+ ): string {
472
486
  // The sdk exports the type verbatim; only the `transform<Pascal>` NAME is PascalCased.
473
487
  const typeName = named.name;
474
488
  const data = ident('data');
@@ -476,10 +490,23 @@ function transformBlock(named: NamedSchemaModel, byName: Map<string, SchemaModel
476
490
  named.schema.kind === 'ref'
477
491
  ? convertRef(data, named.schema.name, byName, new Set(), INDENT)
478
492
  : convert(data, named.schema, byName, new Set(), 'data', INDENT);
493
+ const writeOnly = (flattenAllOf(named.schema, model)?.properties ?? [])
494
+ .filter((property) => property.writeOnly)
495
+ .map((property) => JSON.stringify(property.name));
496
+ if (writeOnly.length === 0) {
497
+ return [
498
+ `export const ${transformName(named.name)} = (data: ${typeName}): ${typeName} => {`,
499
+ ...body,
500
+ `${INDENT}return data;`,
501
+ '};',
502
+ ].join('\n');
503
+ }
504
+ const response = `Omit<${typeName}, ${writeOnly.join(' | ')}>`;
479
505
  return [
480
- `export const ${transformName(named.name)} = (data: ${typeName}): ${typeName} => {`,
506
+ `export const ${transformName(named.name)} = <T extends ${response}>(input: T): T => {`,
507
+ `${INDENT}const data: ${response} = input;`,
481
508
  ...body,
482
- `${INDENT}return data;`,
509
+ `${INDENT}return input;`,
483
510
  '};',
484
511
  ].join('\n');
485
512
  }
@@ -496,7 +523,7 @@ export function renderTransformersModule(model: ApiModel, opts: { sdkModule: str
496
523
  if (dated.length === 0) return '';
497
524
  const types = dated.map((s) => safeIdent(s.name)).join(', ');
498
525
  writableUsed = false; // reset the per-render flag `writableLhs` sets
499
- const transforms = dated.map((s) => transformBlock(s, byName));
526
+ const transforms = dated.map((s) => transformBlock(s, model, byName));
500
527
  const blocks = [
501
528
  `import type { ${types} } from ${JSON.stringify(opts.sdkModule)};`,
502
529
  ...(writableUsed ? [WRITABLE_DECL] : []),
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -123,5 +123,5 @@ export default {
123
123
  run: typescriptGenerator,
124
124
  sample: typescriptSample,
125
125
  docs: typescriptDocs,
126
- requiresGenerator: '^0.7.10',
126
+ requiresGenerator: '^0.7.12',
127
127
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "typescript" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "typescript" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator typescript --update`.
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "zod" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "zod" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator zod --update`.
@@ -28,5 +28,5 @@ export const zodGenerator: Generator = ({ model, output, banner }) => {
28
28
  export default {
29
29
  name: 'zod',
30
30
  run: zodGenerator,
31
- requiresGenerator: '^0.7.10',
31
+ requiresGenerator: '^0.7.12',
32
32
  };
@@ -1,4 +1,4 @@
1
- // Ejected from @redocly/client-generator@0.7.10 — the built-in "zod" generator.
1
+ // Ejected from @redocly/client-generator@0.7.12 — the built-in "zod" generator.
2
2
  // This file is yours: edit freely; the generated client stays machine-owned and is
3
3
  // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
4
  // `redocly eject-generator zod --update`.
@@ -19,6 +19,9 @@ runtime. Go ≥ 1.21, standard library only — zero dependencies.
19
19
 
20
20
  - **Models are structs**: required fields by value, optionals as pointers with
21
21
  `,omitempty`; the `json` tag always carries the exact wire name.
22
+ - **A `writeOnly` property is optional** even when required: requests and responses share
23
+ one struct, and a response never carries it. A pointer with `,omitempty` still sends it
24
+ in a request, and leaves it `nil` in a response instead of claiming a zero value.
22
25
  - **Package clause:** `package client` by default, `goPackage` to override — a generated
23
26
  file usually lands in a package the consumer already owns. The value is checked against
24
27
  Go's own rule (lowercase letters, digits, `_`, no leading digit, not a keyword) and an
@@ -22,6 +22,28 @@ A standalone MSW module: `create<Name>()` data factories, `<op>Handler()` /
22
22
  - **Interpolated identifiers are gated** (`codeIdent`): an operation name or method
23
23
  reaching a code position is validated, never trusted, even though the pipeline
24
24
  sanitizes upstream.
25
+ - **Mock data satisfies the description** it came from, so it passes the zod schemas
26
+ generated from the same description:
27
+ - Numeric samples respect `minimum`, `maximum`, `exclusiveMinimum`,
28
+ `exclusiveMaximum`, and `multipleOf`. A static sample is `0` when `0` is in range,
29
+ else the lowest valid value (the highest one when only an upper bound is set).
30
+ Faker mode passes the same inclusive range to `faker.number.*`; when only one side
31
+ is set, the other side is 100 steps away, because faker's own defaults can sit on
32
+ the wrong side of the bound.
33
+ - Mocks are response data, and responses never carry `writeOnly` properties. An
34
+ optional one is never emitted. A required one stays in the factories, because the
35
+ named type (and its zod schema) demands it. A handler whose response leaves the
36
+ `writeOnly` properties out (an `omit` body) samples that shape inline, typed
37
+ `Partial<Omit<Name, …>>`, so its body leaves them out too.
38
+ - The default handler of a paginated operation ends the walk. A cursor page is the
39
+ last page: the next cursor is `null` when nullable, absent when optional, and `""`
40
+ otherwise, and `hasMore` is `false`. A `body-link` page is the last page the same
41
+ way, through its next link. So `.pages()` ends after one page. Offset and
42
+ page-number styles stop only on an empty page, so the handler answers any position
43
+ past the first with an empty item list, and `.pages()` ends after that empty page.
44
+ The handler's `override` sets the first page: it is spread into an object page, or
45
+ replaces a page that is the item array. The empty page sets its items after the
46
+ spread, so an override cannot refill it.
25
47
  - Handlers are opt-in overrides: `<op>ErrorHandler` is NOT in `handlers`.
26
48
  - The module references the sdk's TYPES only — never its runtime.
27
49
 
@@ -23,8 +23,15 @@ extension — zero Composer dependencies. The namespace derives from the API tit
23
23
  `fromArray(array $data): self` and `toArray(): array` (wire names inline; nulls
24
24
  skipped on serialize) — no reflection. `omit` schemas hydrate/serialize through their
25
25
  base class. A property or response typed as a DISCRIMINATED union hydrates through the
26
- union's `unmarshalX` dispatcher, so consumers can narrow with `instanceof`;
27
- undiscriminated unions stay raw arrays.
26
+ union's `unmarshalX` dispatcher, so consumers can narrow with `instanceof`; its type
27
+ includes `array`, because a value with an unknown discriminator stays the raw array.
28
+ Undiscriminated unions stay raw arrays.
29
+ - **The file passes PHPStan level 5.** It lands in the user's own project, so their
30
+ analyser reads it. The operations table is a constant PHPStan knows exactly, so a method
31
+ reads `$op['security']` only when the table has that entry, and passes `[]` otherwise.
32
+ - **A `writeOnly` property is optional** even when required: requests and responses share
33
+ one class, and a response never carries it. It is nullable `= null`, so `fromArray`
34
+ hydrates a response without it and `toArray` still sends it in a request.
28
35
  - The `Client` class is NOT `final` — PHP test suites mock concrete classes
29
36
  (`createMock(Client::class)`), and `final` would force a wrapper interface on every
30
37
  consumer. Model classes stay `final`.
@@ -26,6 +26,12 @@ One self-contained `<stem>.py`: typed dataclass models, a sync `Client` and an a
26
26
  - **Models are dataclasses by default**, required fields first (a dataclass constraint),
27
27
  optionals `Optional[T] = None`. Wire names live in a `_field_map: ClassVar[Dict[str, str]]`;
28
28
  decode/encode is reflective (`_decode.py`, `get_type_hints`) — no per-model codecs.
29
+ - **The file passes `mypy --strict`.** It lands in the user's own package, so their
30
+ strictest checker reads it: every function is annotated, the operation table is typed,
31
+ and a decoded body is `cast` to the declared return type (`decode` returns `Any`).
32
+ - **A `writeOnly` property is optional** even when required: requests and responses share
33
+ one model, and a response never carries it. It is `Optional[T] = None`, so a response
34
+ decodes without it and a request still sends it.
29
35
  - **`models: pydantic` emits `BaseModel` classes instead**, for the FastAPI-shaped half of
30
36
  the ecosystem that expects them. A wire name becomes `Field(alias=…)` with
31
37
  `populate_by_name=True`, so `_field_map` is not emitted in this mode — the alias is the
@@ -25,7 +25,8 @@ query keys. One generator, four framework variants (`react` default, `-vue`,
25
25
  `body-link` rule gets one when the operation has a query parameter: the next page's
26
26
  URL is the page param, and each later page merges the URL's query parameters over
27
27
  `vars`. A `Link` header is invisible to a `queryFn`, so `link`-style operations get
28
- only the sdk's `.pages()`/`.items()`.
28
+ only the sdk's `.pages()`/`.items()`. A page without a page parameter leaves the key
29
+ out of the call, so `exactOptionalPropertyTypes` holds.
29
30
  - **`envelope` is excluded and stripped** — cached data is the plain body.
30
31
  - Requires `typescript`; throw-mode only (it wraps thrown errors into query errors).
31
32
 
@@ -22,6 +22,10 @@ values and back — the bridge for `dateType: Date` clients.
22
22
  - **Imports the sdk's schema TYPES** (so `typescript` is required) and nothing else.
23
23
  - Converters are pure and total: every named schema gets a pair, nested structures
24
24
  recurse, and a missing optional stays missing.
25
+ - **A transform takes response data.** A response never carries `writeOnly`
26
+ properties, so the sdk types it `Omit<Name, …>`. The transform of a schema with
27
+ `writeOnly` properties takes that shape and returns the type it was given:
28
+ `<T extends Omit<Name, …>>(input: T): T`. Other transforms keep `(data: Name): Name`.
25
29
 
26
30
  ## The stage files
27
31
 
@@ -30,6 +30,11 @@ it with `use(telemetry({ sdkName, sdkVersion, client }))`.
30
30
  an entry that `export *`s it; the entry type-imports only the schema names it
31
31
  references (`collectEntrySchemaRefs`).
32
32
  - **Zero runtime dependencies.** `Date`, `Blob`, `fetch` — nothing else.
33
+ - **It type-checks under the strictest common settings.** The output compiles as part of
34
+ the user's sources, so `skipLibCheck` does not cover it: `strict`,
35
+ `noUncheckedIndexedAccess`, and `exactOptionalPropertyTypes` must all pass. Guard an
36
+ index access explicitly instead of asserting it, and leave an absent optional key out
37
+ (a conditional spread) instead of setting it to `undefined`.
33
38
  - **Timeouts need no platform statics.** `send()` uses `AbortSignal.timeout()` and
34
39
  `AbortSignal.any()` where they exist and builds the same signal from an `AbortController`
35
40
  and `setTimeout` where they do not (Chrome before 116, Safari before 17.4, Firefox before
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/authoring/schema.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,WAAW,EACZ,MAAM,yCAAyC,CAAC;AAGjD,4FAA4F;AAC5F,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAYnF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,GACd;IAAE,UAAU,EAAE,aAAa,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcnE;AAED,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,GAEb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9F,SAAS,CAUZ;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEvD;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAI/D;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,GAClB;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAcjG;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAMtD;AAuBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,GACd,WAAW,GAAG,SAAS,CAYzB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE;IAAE,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,EAC/C,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAC5B,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAoC7C"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/authoring/schema.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,WAAW,EACZ,MAAM,yCAAyC,CAAC;AAGjD,4FAA4F;AAC5F,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAYnF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,GACd;IAAE,UAAU,EAAE,aAAa,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcnE;AAED,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,GAEb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9F,SAAS,CAUZ;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEvD;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAI/D;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,GAClB;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAcjG;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAMtD;AAuBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,GACd,WAAW,GAAG,SAAS,CAezB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE;IAAE,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,EAC/C,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAC5B,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAoC7C"}