@aws/nx-plugin 0.14.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -2
- package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +2236 -0
- package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +2307 -0
- package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +1495 -0
- package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +1470 -0
- package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +1138 -0
- package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +732 -0
- package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +743 -0
- package/src/open-api/ts-client/files/client.gen.ts.template +55 -18
- package/src/open-api/ts-client/files/types.gen.ts.template +7 -2
- package/src/open-api/ts-hooks/__snapshots__/generator.spec.tsx.snap +1092 -0
- package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +210 -0
- package/src/open-api/ts-hooks/generator.d.ts +5 -0
- package/src/open-api/ts-hooks/generator.js +15 -2
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.spec.tsx +1787 -0
- package/src/open-api/utils/codegen-data/types.d.ts +25 -0
- package/src/open-api/utils/codegen-data/types.js +26 -1
- package/src/open-api/utils/codegen-data/types.js.map +1 -1
- package/src/open-api/utils/codegen-data.js +187 -79
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.js +11 -1
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +120 -10
- package/src/py/fast-api/react/files/website/components/__apiNameClassName__Provider.tsx.template +40 -0
- package/src/py/fast-api/react/files/website/hooks/use__apiNameClassName__.tsx.template +13 -18
- package/src/py/fast-api/react/files/website/hooks/use__apiNameClassName__Client.tsx.template +13 -0
- package/src/py/fast-api/react/generator.js +35 -9
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/project/generator.js +5 -0
- package/src/py/project/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +7 -9
- package/src/utils/files/http-api/common/constructs/src/core/http-api.ts.template +7 -9
- package/src/open-api/ts-client/__snapshots__/generator.spec.ts.snap +0 -7607
|
@@ -32,7 +32,7 @@ import type {
|
|
|
32
32
|
// eg. an array of arrays of strings doesn't need to be rendered as `value.map(item0 => item0.map(item1 => item1))`
|
|
33
33
|
const canShortCircuitConversion = (property) => {
|
|
34
34
|
if (["array", "dictionary"].includes(property.export)) {
|
|
35
|
-
return canShortCircuitConversion(property.link);
|
|
35
|
+
return !property.link || canShortCircuitConversion(property.link);
|
|
36
36
|
}
|
|
37
37
|
return property.isPrimitive && !["date", "date-time"].includes(property.format);
|
|
38
38
|
};
|
|
@@ -41,19 +41,22 @@ const renderToJsonDateValue = (identifier, format) => {
|
|
|
41
41
|
return `${identifier}.toISOString()${format === 'date' ? '.slice(0,10)' : ''}`;
|
|
42
42
|
};
|
|
43
43
|
// Renders the appropriate nested function for .map() or $mapValues() for arrays and dictionaries for the given type
|
|
44
|
-
const renderNestedToJsonValue = (type, depth = 0) => {
|
|
44
|
+
const renderNestedToJsonValue = (type, argumentType = undefined, depth = 0) => {
|
|
45
45
|
const itemIdentifier = `item${depth}`;
|
|
46
|
+
const argType = `${argumentType ? `: ${argumentType}` : ''}`;
|
|
46
47
|
if (type.isPrimitive || type.typescriptType === 'unknown' || type.export === 'enum' || type.isEnum) {
|
|
47
|
-
return `(${itemIdentifier}) => ${["date", "date-time"].includes(type.format) ? renderToJsonDateValue(itemIdentifier, type.format) : itemIdentifier}`;
|
|
48
|
+
return `(${itemIdentifier}${argType}) => ${["date", "date-time"].includes(type.format) ? renderToJsonDateValue(itemIdentifier, type.format) : itemIdentifier}`;
|
|
48
49
|
} else if (type.export === "array") {
|
|
49
|
-
return `(${itemIdentifier}) => ${itemIdentifier}.map(${renderNestedToJsonValue(type.link, depth + 1)})`;
|
|
50
|
+
return `(${itemIdentifier}${argType}) => ${itemIdentifier}.map(${renderNestedToJsonValue(type.link, argumentType, depth + 1)})`;
|
|
50
51
|
} else if (type.export === "dictionary") {
|
|
51
|
-
return `(${itemIdentifier}) => $IO.$mapValues(${itemIdentifier}, ${renderNestedToJsonValue(type.link, depth + 1)})`;
|
|
52
|
+
return `(${itemIdentifier}${argType}) => $IO.$mapValues(${itemIdentifier}, ${renderNestedToJsonValue(type.link, argumentType, depth + 1)})`;
|
|
53
|
+
} else if (type.type === 'unknown') {
|
|
54
|
+
return `(${itemIdentifier}${argType}) => ${itemIdentifier}`;
|
|
52
55
|
}
|
|
53
56
|
return `$IO.${type.name || type.type}.toJson`;
|
|
54
57
|
};
|
|
55
58
|
// Renders the code to transform a property of the model to its json representation from the model types
|
|
56
|
-
const renderToJsonValue = (property, value) => {
|
|
59
|
+
const renderToJsonValue = (property, value, argumentType = undefined) => {
|
|
57
60
|
let rendered = '';
|
|
58
61
|
|
|
59
62
|
if (canShortCircuitConversion(property)) {
|
|
@@ -62,9 +65,9 @@ const renderToJsonValue = (property, value) => {
|
|
|
62
65
|
rendered = ["date", "date-time"].includes(property.format) ? `(${renderToJsonDateValue(value, property.format)})` : value;
|
|
63
66
|
} else if (property.export === "array") {
|
|
64
67
|
const prefix = property.uniqueItems ? `Array.from(${value})` : `${value}`;
|
|
65
|
-
rendered = `(${prefix}.map(${renderNestedToJsonValue(property.link)}))`;
|
|
68
|
+
rendered = `(${prefix}.map(${renderNestedToJsonValue(property.link, argumentType)}))`;
|
|
66
69
|
} else if (property.export === "dictionary") {
|
|
67
|
-
rendered = `($IO.$mapValues(${value}, ${renderNestedToJsonValue(property.link)}))`;
|
|
70
|
+
rendered = `($IO.$mapValues(${value}, ${renderNestedToJsonValue(property.link, argumentType)}))`;
|
|
68
71
|
} else if (property.type !== "any") {
|
|
69
72
|
rendered = `$IO.${property.type}.toJson(${value})`;
|
|
70
73
|
} else {
|
|
@@ -77,29 +80,32 @@ const renderToJsonValue = (property, value) => {
|
|
|
77
80
|
return rendered;
|
|
78
81
|
};
|
|
79
82
|
// Renders the appropriate nested function for .map() or $mapValues() for arrays and dictionaries for the given type
|
|
80
|
-
const renderNestedFromJsonValue = (type, depth = 0) => {
|
|
83
|
+
const renderNestedFromJsonValue = (type, argumentType = undefined, depth = 0) => {
|
|
81
84
|
const itemIdentifier = `item${depth}`;
|
|
85
|
+
const argType = `${argumentType ? `: ${argumentType}` : ''}`;
|
|
82
86
|
if (type.isPrimitive || type.typescriptType === 'unknown' || type.export === 'enum' || type.isEnum) {
|
|
83
|
-
return `(${itemIdentifier}) => ${["date", "date-time"].includes(type.format) ? `new Date(${itemIdentifier})` : itemIdentifier}`;
|
|
87
|
+
return `(${itemIdentifier}${argType}) => ${["date", "date-time"].includes(type.format) ? `new Date(${itemIdentifier})` : itemIdentifier}`;
|
|
84
88
|
} else if (type.export === "array") {
|
|
85
|
-
return `(${itemIdentifier}) => ${itemIdentifier}.map(${renderNestedFromJsonValue(type.link, depth + 1)})`;
|
|
89
|
+
return `(${itemIdentifier}${argType}) => ${itemIdentifier}.map(${renderNestedFromJsonValue(type.link, argumentType, depth + 1)})`;
|
|
86
90
|
} else if (type.export === "dictionary") {
|
|
87
|
-
return `(${itemIdentifier}) => $IO.$mapValues(${itemIdentifier}, ${renderNestedFromJsonValue(type.link, depth + 1)})`;
|
|
91
|
+
return `(${itemIdentifier}${argType}) => $IO.$mapValues(${itemIdentifier}, ${renderNestedFromJsonValue(type.link, argumentType, depth + 1)})`;
|
|
92
|
+
} else if (type.type === 'unknown') {
|
|
93
|
+
return `(${itemIdentifier}${argType}) => ${itemIdentifier}`;
|
|
88
94
|
}
|
|
89
95
|
return `$IO.${type.name || type.type}.fromJson`;
|
|
90
96
|
};
|
|
91
97
|
// Renders the code to transform a property of the model from its json representation into the model types
|
|
92
|
-
const renderFromJsonValue = (property, value) => {
|
|
98
|
+
const renderFromJsonValue = (property, value, argumentType = undefined) => {
|
|
93
99
|
let rendered = '';
|
|
94
100
|
if (canShortCircuitConversion(property)) {
|
|
95
101
|
rendered = value;
|
|
96
102
|
} else if (property.isPrimitive || property.typescriptType === 'unknown' || property.export === 'enum' || property.isEnum) {
|
|
97
103
|
rendered = ["date", "date-time"].includes(property.format) ? `(new Date(${value}))` : value;
|
|
98
104
|
} else if (property.export === "array") {
|
|
99
|
-
rendered = `((${value} as Array<any>).map(${renderNestedFromJsonValue(property.link)}))`;
|
|
105
|
+
rendered = `((${value} as Array<any>).map(${renderNestedFromJsonValue(property.link, argumentType)}))`;
|
|
100
106
|
rendered = property.uniqueItems ? `new Set(${rendered})` : rendered;
|
|
101
107
|
} else if (property.export === "dictionary") {
|
|
102
|
-
rendered = `($IO.$mapValues(${value}, ${renderNestedFromJsonValue(property.link)}))`;
|
|
108
|
+
rendered = `($IO.$mapValues(${value}, ${renderNestedFromJsonValue(property.link, argumentType)}))`;
|
|
103
109
|
} else {
|
|
104
110
|
rendered = `$IO.${property.type}.fromJson(${value})`;
|
|
105
111
|
}
|
|
@@ -147,6 +153,9 @@ const renderStreamingResponseChunk = (response) => {
|
|
|
147
153
|
asBlob: 'new Blob([value])',
|
|
148
154
|
});
|
|
149
155
|
};
|
|
156
|
+
const matchPattern = (pattern, value) => {
|
|
157
|
+
return `/${pattern}/.test(${value})`;
|
|
158
|
+
};
|
|
150
159
|
_%>
|
|
151
160
|
|
|
152
161
|
/**
|
|
@@ -164,7 +173,7 @@ export class $IO {
|
|
|
164
173
|
return model;
|
|
165
174
|
}
|
|
166
175
|
<%_ if (isComposite) { _%>
|
|
167
|
-
<%_ model.composedPrimitives.filter(p => !['array', 'dictionary'].includes(p.export)).forEach((primitive) => { _%>
|
|
176
|
+
<%_ model.composedPrimitives.filter(p => !['array', 'dictionary'].includes(p.export) && p.type !== 'null').forEach((primitive) => { _%>
|
|
168
177
|
if (typeof model === "<%- primitive.typescriptType %>") {
|
|
169
178
|
return model;
|
|
170
179
|
}
|
|
@@ -196,6 +205,20 @@ export class $IO {
|
|
|
196
205
|
<%_ if (model.export === 'dictionary') { _%>
|
|
197
206
|
...<%- renderToJsonValue(model, 'model') %>,
|
|
198
207
|
<%_ } _%>
|
|
208
|
+
<%_ if (model.hasPatternProperties && model.patternPropertiesModels.length > 0) { _%>
|
|
209
|
+
<%_ model.patternPropertiesModels.forEach(({ pattern, model: patternProperty }) => { _%>
|
|
210
|
+
...$IO.$mapValues(Object.fromEntries(Object.entries(model).filter(([key]) => <% if (model.properties.length > 0) { %>![<%- model.properties.map(p => `'${p.typescriptName}'`).join(', ') %>].includes(key) && <% } %>
|
|
211
|
+
<%- matchPattern(pattern, 'key') %>
|
|
212
|
+
)), (patternProperty) => <%- renderToJsonValue(patternProperty, 'patternProperty', 'any') %>),
|
|
213
|
+
<%_ }); _%>
|
|
214
|
+
<%_ } _%>
|
|
215
|
+
<%_ if (model.hasAdditionalProperties) { _%>
|
|
216
|
+
...$IO.$mapValues(Object.fromEntries(Object.entries(model).filter(([key]) => <% if (model.properties.length > 0) { %>![<%- model.properties.map(p => `'${p.typescriptName}'`).join(', ') %>].includes(key)<% } %>
|
|
217
|
+
<%_ if (model.hasPatternProperties && model.patternPropertiesModels.length > 0) { _%>
|
|
218
|
+
<% if (model.properties.length > 0) { %>&& <% } %>!(<%- model.patternPropertiesModels.map(({ pattern }) => matchPattern(pattern, 'key')).join(' || ') %>)
|
|
219
|
+
<%_ } _%>
|
|
220
|
+
)), (additionalProperty) => <%- renderToJsonValue(model.additionalPropertiesModel, 'additionalProperty', 'any') %>),
|
|
221
|
+
<%_ } _%>
|
|
199
222
|
<%_ model.properties.forEach((property) => { _%>
|
|
200
223
|
...(model.<%- property.typescriptName %> === undefined ? {} : {
|
|
201
224
|
'<%= property.name %>': <%- renderToJsonValue(property, `model.${property.typescriptName}`) %>,
|
|
@@ -209,7 +232,7 @@ export class $IO {
|
|
|
209
232
|
return json;
|
|
210
233
|
}
|
|
211
234
|
<%_ if (isComposite) { _%>
|
|
212
|
-
<%_ model.composedPrimitives.filter(p => !['array', 'dictionary'].includes(p.export)).forEach((primitive) => { _%>
|
|
235
|
+
<%_ model.composedPrimitives.filter(p => !['array', 'dictionary'].includes(p.export) && p.type !== 'null').forEach((primitive) => { _%>
|
|
213
236
|
if (typeof json === "<%- primitive.typescriptType %>") {
|
|
214
237
|
return json;
|
|
215
238
|
}
|
|
@@ -240,6 +263,20 @@ export class $IO {
|
|
|
240
263
|
<%_ if (model.export === 'dictionary') { _%>
|
|
241
264
|
...<%- renderFromJsonValue(model, 'json') %>,
|
|
242
265
|
<%_ } _%>
|
|
266
|
+
<%_ if (model.hasPatternProperties && model.patternPropertiesModels.length > 0) { _%>
|
|
267
|
+
<%_ model.patternPropertiesModels.forEach(({ pattern, model: patternProperty }) => { _%>
|
|
268
|
+
...$IO.$mapValues(Object.fromEntries(Object.entries(json).filter(([key]) => <% if (model.properties.length > 0) { %>![<%- model.properties.map(p => `'${p.name}'`).join(', ') %>].includes(key) && <% } %>
|
|
269
|
+
<%- matchPattern(pattern, 'key') %>
|
|
270
|
+
)), (patternProperty) => <%- renderFromJsonValue(patternProperty, 'patternProperty', 'any') %>),
|
|
271
|
+
<%_ }); _%>
|
|
272
|
+
<%_ } _%>
|
|
273
|
+
<%_ if (model.hasAdditionalProperties) { _%>
|
|
274
|
+
...$IO.$mapValues(Object.fromEntries(Object.entries(json).filter(([key]) => <% if (model.properties.length > 0) { %>![<%- model.properties.map(p => `'${p.name}'`).join(', ') %>].includes(key)<% } %>
|
|
275
|
+
<%_ if (model.hasPatternProperties && model.patternPropertiesModels.length > 0) { _%>
|
|
276
|
+
<% if (model.properties.length > 0) { %>&& <% } %>!(<%- model.patternPropertiesModels.map(({ pattern }) => matchPattern(pattern, 'key')).join(' || ') %>)
|
|
277
|
+
<%_ } _%>
|
|
278
|
+
)), (additionalProperty) => <%- renderFromJsonValue(model.additionalPropertiesModel, 'additionalProperty', 'any') %>),
|
|
279
|
+
<%_ } _%>
|
|
243
280
|
<%_ model.properties.forEach((property) => { _%>
|
|
244
281
|
<%_ if (!property.isRequired) { _%>
|
|
245
282
|
...(json['<%- property.name %>'] === undefined ? {} : {
|
|
@@ -323,7 +360,7 @@ export class <%- className %> {
|
|
|
323
360
|
private $fetch: typeof fetch = (...args) => (this.$config.fetch ?? fetch)(...args);
|
|
324
361
|
<%_ allOperations.forEach((op) => { _%>
|
|
325
362
|
<%_ const hasTag = op.tags && op.tags.length > 0; _%>
|
|
326
|
-
<%_ const isStreaming =
|
|
363
|
+
<%_ const isStreaming = op.isStreaming; _%>
|
|
327
364
|
<%_ const isInputOptional = (op.parameters.length === 1 && op.parametersBody && !op.parametersBody.isRequired) || op.parameters.length === 0; _%>
|
|
328
365
|
|
|
329
366
|
<%- docString(op, ' ') %> <%- hasTag ? 'private' : 'public' %> async <% if (isStreaming) { %>*<% } %><%- hasTag ? '_' : '' %><%- op.uniqueName %>(<% if (op.parameters.length > 0) { %>input<%- isInputOptional ? '?' : '' %>: <%- op.operationIdPascalCase %>Request<% } %>): <%- isStreaming ? 'AsyncIterableIterator' : 'Promise' %><<%- op.result ? op.result.typescriptType : 'void' %>> {
|
|
@@ -27,13 +27,18 @@ _%>
|
|
|
27
27
|
<%_ } else if (isComposite) { _%>
|
|
28
28
|
<%- docString(model, '') %>export type <%- model.name %> =<% model.properties.forEach((composedType, i) => { %><% if (i > 0) { %><% if (model.export === "all-of") { %> &<% } else { %> |<% } %><% } %> <%- composedType.typescriptType %><% }); %>;
|
|
29
29
|
<%_ } else { _%>
|
|
30
|
-
<%- docString(model, '') %>export type <%= model.name %> = <% if (model.isNullable) { %>null | <% } %>{
|
|
30
|
+
<%- docString(model, '') %>export type <%= model.name %> = <% if (model.isNullable && model.type !== 'null') { %>null | <% } %>{
|
|
31
31
|
<%_ if (model.export === "dictionary" && model.link) { _%>
|
|
32
32
|
<%- docString(model.link, ' ') %> [key: string]: <%- model.link.typescriptType %>;
|
|
33
33
|
<%_ } _%>
|
|
34
34
|
<%_ model.properties.forEach((property) => { _%>
|
|
35
|
-
<%- docString(property, ' ') %> <%= property.isReadOnly ? 'readonly ' : '' %><%= property.typescriptName %><%= property.isRequired ? '' : '?' %>: <%- property.typescriptType %><%= property.isNullable ? ' | null' : '' %>;
|
|
35
|
+
<%- docString(property, ' ') %> <%= property.isReadOnly ? 'readonly ' : '' %><%= property.typescriptName %><%= property.isRequired ? '' : '?' %>: <%- property.typescriptType %><%= (property.isNullable && property.type !== 'null') ? ' | null' : '' %>;
|
|
36
36
|
<%_ }); _%>
|
|
37
|
+
<%_ if (model.hasAdditionalProperties || model.hasPatternProperties) { _%>
|
|
38
|
+
<%_ const keyName = (model.hasAdditionalProperties && model.hasPatternProperties) ? 'additionalAndPatternProperties' : (model.hasAdditionalProperties ? 'additionalProperties' : 'patternProperties'); _%>
|
|
39
|
+
<%_ const typeComment = (model.hasAdditionalProperties && !model.hasPatternProperties && model.additionalPropertiesModel.typescriptType !== 'unknown') ? ` /* ${model.additionalPropertiesModel.typescriptType} */` : '' _%>
|
|
40
|
+
[<%- keyName %>: string]: unknown<%- typeComment %>;
|
|
41
|
+
<%_ } _%>
|
|
37
42
|
};
|
|
38
43
|
<%_ } _%>
|
|
39
44
|
<%_ }); _%>
|