@opra/cli 1.19.5 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/ts-generator/generators/generate-data-type.js +111 -57
- package/cjs/ts-generator/generators/generate-document.js +1 -1
- package/cjs/ts-generator/ts-generator.js +4 -2
- package/esm/ts-generator/generators/generate-data-type.js +107 -55
- package/esm/ts-generator/generators/generate-document.js +1 -1
- package/esm/ts-generator/ts-generator.js +5 -3
- package/package.json +4 -4
- package/types/ts-generator/generators/generate-data-type.d.ts +12 -4
- package/types/ts-generator/ts-generator.d.ts +5 -3
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateDataType = generateDataType;
|
|
4
4
|
exports._generateTypeCode = _generateTypeCode;
|
|
5
|
-
exports.
|
|
5
|
+
exports._generateArrayTypeCode = _generateArrayTypeCode;
|
|
6
6
|
exports._generateComplexTypeCode = _generateComplexTypeCode;
|
|
7
|
-
exports.
|
|
8
|
-
exports._generateMixinTypeCode = _generateMixinTypeCode;
|
|
7
|
+
exports._generateEnumTypeCode = _generateEnumTypeCode;
|
|
9
8
|
exports._generateMappedTypeCode = _generateMappedTypeCode;
|
|
9
|
+
exports._generateMixinTypeCode = _generateMixinTypeCode;
|
|
10
|
+
exports._generateSimpleTypeCode = _generateSimpleTypeCode;
|
|
11
|
+
exports._generateUnionTypeCode = _generateUnionTypeCode;
|
|
10
12
|
const tslib_1 = require("tslib");
|
|
11
13
|
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
12
14
|
const common_1 = require("@opra/common");
|
|
@@ -85,14 +87,14 @@ async function _generateTypeCode(currentFile, dataType, intent) {
|
|
|
85
87
|
if (intent === 'root' && !dataType.name) {
|
|
86
88
|
throw new TypeError(`Name required to generate data type code to root intent`);
|
|
87
89
|
}
|
|
88
|
-
if (dataType instanceof common_1.
|
|
89
|
-
return await this.
|
|
90
|
+
if (dataType instanceof common_1.ArrayType) {
|
|
91
|
+
return await this._generateArrayTypeCode(currentFile, dataType, intent);
|
|
90
92
|
}
|
|
91
93
|
if (dataType instanceof common_1.ComplexType) {
|
|
92
94
|
return await this._generateComplexTypeCode(currentFile, dataType, intent);
|
|
93
95
|
}
|
|
94
|
-
if (dataType instanceof common_1.
|
|
95
|
-
return await this.
|
|
96
|
+
if (dataType instanceof common_1.EnumType) {
|
|
97
|
+
return await this._generateEnumTypeCode(currentFile, dataType, intent);
|
|
96
98
|
}
|
|
97
99
|
if (dataType instanceof common_1.MappedType) {
|
|
98
100
|
return await this._generateMappedTypeCode(currentFile, dataType, intent);
|
|
@@ -100,36 +102,34 @@ async function _generateTypeCode(currentFile, dataType, intent) {
|
|
|
100
102
|
if (dataType instanceof common_1.MixinType) {
|
|
101
103
|
return await this._generateMixinTypeCode(currentFile, dataType, intent);
|
|
102
104
|
}
|
|
105
|
+
if (dataType instanceof common_1.SimpleType) {
|
|
106
|
+
return await this._generateSimpleTypeCode(currentFile, dataType, intent);
|
|
107
|
+
}
|
|
108
|
+
if (dataType instanceof common_1.UnionType) {
|
|
109
|
+
return await this._generateUnionTypeCode(currentFile, dataType, intent);
|
|
110
|
+
}
|
|
103
111
|
/* istanbul ignore next */
|
|
104
112
|
throw new TypeError(`${dataType.kind} data types can not be directly exported`);
|
|
105
113
|
}
|
|
106
114
|
/**
|
|
107
115
|
*
|
|
108
116
|
*/
|
|
109
|
-
async function
|
|
110
|
-
if (intent === '
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
out +=
|
|
120
|
-
`${info.alias || value} = ` +
|
|
121
|
-
(typeof value === 'number'
|
|
122
|
-
? value
|
|
123
|
-
: "'" + String(value).replace("'", "\\'") + "'");
|
|
124
|
-
out += ',\n\n';
|
|
125
|
-
}
|
|
126
|
-
return out + '\b}';
|
|
117
|
+
async function _generateArrayTypeCode(currentFile, dataType, intent) {
|
|
118
|
+
if (intent === 'extends')
|
|
119
|
+
throw new TypeError('Array types can not be extended');
|
|
120
|
+
let out = '';
|
|
121
|
+
const x = await this.generateDataType(dataType.type, 'typeDef', currentFile);
|
|
122
|
+
if (x.kind === 'embedded') {
|
|
123
|
+
out =
|
|
124
|
+
x.code.includes('|') || x.code.includes('&')
|
|
125
|
+
? '(' + x.code + ')'
|
|
126
|
+
: x.code;
|
|
127
127
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
else
|
|
129
|
+
out = x.typeName;
|
|
130
|
+
if (intent === 'root')
|
|
131
|
+
return `type ${dataType.name} = ${out}[]`;
|
|
132
|
+
return `${out}[]`;
|
|
133
133
|
}
|
|
134
134
|
/**
|
|
135
135
|
*
|
|
@@ -180,17 +180,20 @@ async function _generateComplexTypeCode(currentFile, dataType, intent) {
|
|
|
180
180
|
if (field.readonly)
|
|
181
181
|
out += 'readonly ';
|
|
182
182
|
out += `${field.name}${field.required ? '' : '?'}: `;
|
|
183
|
+
let typ = '';
|
|
183
184
|
if (field.fixed) {
|
|
184
185
|
const t = typeof field.fixed;
|
|
185
|
-
|
|
186
|
+
typ = `${t === 'number' || t === 'boolean' || t === 'bigint' ? field.fixed : "'" + field.fixed + "'"}\n`;
|
|
186
187
|
}
|
|
187
188
|
else {
|
|
188
189
|
const x = await this.generateDataType(field.type, 'typeDef', currentFile);
|
|
189
|
-
|
|
190
|
-
if (field.isArray) {
|
|
191
|
-
out += /[a-zA-Z]\w*/.test(s) ? s + '[]' : '(' + s + ')[]';
|
|
192
|
-
}
|
|
190
|
+
typ = x.kind === 'embedded' ? x.code : x.typeName;
|
|
193
191
|
}
|
|
192
|
+
if (field.isArray && !(field.type instanceof common_1.ArrayType)) {
|
|
193
|
+
out += /[a-zA-Z]\w*/.test(typ) ? typ + '[];\n' : '(' + typ + ')[];\n';
|
|
194
|
+
}
|
|
195
|
+
else
|
|
196
|
+
out += typ + ';\n';
|
|
194
197
|
}
|
|
195
198
|
if (dataType.additionalFields)
|
|
196
199
|
out += '[key: string]: any;\n';
|
|
@@ -199,30 +202,30 @@ async function _generateComplexTypeCode(currentFile, dataType, intent) {
|
|
|
199
202
|
/**
|
|
200
203
|
*
|
|
201
204
|
*/
|
|
202
|
-
async function
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
*
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
205
|
+
async function _generateEnumTypeCode(currentFile, dataType, intent) {
|
|
206
|
+
if (intent === 'root') {
|
|
207
|
+
let out = `enum ${dataType.name} {\n\t`;
|
|
208
|
+
for (const [value, info] of Object.entries(dataType.attributes)) {
|
|
209
|
+
// Print JSDoc
|
|
210
|
+
let jsDoc = '';
|
|
211
|
+
if (dataType.attributes[value].description)
|
|
212
|
+
jsDoc += ` * ${dataType.attributes[value].description}\n`;
|
|
213
|
+
if (jsDoc)
|
|
214
|
+
out += `/**\n${jsDoc} */\n`;
|
|
215
|
+
out +=
|
|
216
|
+
`${info.alias || value} = ` +
|
|
217
|
+
(typeof value === 'number'
|
|
218
|
+
? value
|
|
219
|
+
: "'" + String(value).replace("'", "\\'") + "'");
|
|
220
|
+
out += ',\n\n';
|
|
217
221
|
}
|
|
218
|
-
|
|
219
|
-
outArray.push(x.typeName);
|
|
222
|
+
return out + '\b}';
|
|
220
223
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
return ('(' +
|
|
225
|
+
Object.keys(dataType.attributes)
|
|
226
|
+
.map(t => `'${t}'`)
|
|
227
|
+
.join(' | ') +
|
|
228
|
+
')');
|
|
226
229
|
}
|
|
227
230
|
/**
|
|
228
231
|
*
|
|
@@ -282,3 +285,54 @@ async function _generateMappedTypeCode(currentFile, dataType, intent) {
|
|
|
282
285
|
}
|
|
283
286
|
return out;
|
|
284
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
*
|
|
290
|
+
*/
|
|
291
|
+
async function _generateMixinTypeCode(currentFile, dataType, intent) {
|
|
292
|
+
const outArray = [];
|
|
293
|
+
for (const t of dataType.types) {
|
|
294
|
+
const x = await this.generateDataType(t, 'typeDef', currentFile);
|
|
295
|
+
if (x.kind === 'embedded') {
|
|
296
|
+
outArray.push(x.code.includes('|') || x.code.includes('&')
|
|
297
|
+
? '(' + x.code + ')'
|
|
298
|
+
: x.code);
|
|
299
|
+
}
|
|
300
|
+
else
|
|
301
|
+
outArray.push(x.typeName);
|
|
302
|
+
}
|
|
303
|
+
if (intent === 'root')
|
|
304
|
+
return `type ${dataType.name} = ${outArray.join(' & ')}`;
|
|
305
|
+
if (intent === 'extends')
|
|
306
|
+
return outArray.join(', ');
|
|
307
|
+
return outArray.join(' & ');
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
*
|
|
311
|
+
*/
|
|
312
|
+
async function _generateSimpleTypeCode(currentFile, dataType, intent) {
|
|
313
|
+
let out = intent === 'root' ? `type ${dataType.name} = ` : '';
|
|
314
|
+
const nameMapping = dataType.nameMappings.js || 'any';
|
|
315
|
+
out += nameMapping === 'Date' ? 'string' : nameMapping;
|
|
316
|
+
return intent === 'root' ? out + ';' : out;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
*
|
|
320
|
+
*/
|
|
321
|
+
async function _generateUnionTypeCode(currentFile, dataType, intent) {
|
|
322
|
+
if (intent === 'extends')
|
|
323
|
+
throw new TypeError('Union types can not be extended');
|
|
324
|
+
const outArray = [];
|
|
325
|
+
for (const t of dataType.types) {
|
|
326
|
+
const x = await this.generateDataType(t, 'typeDef', currentFile);
|
|
327
|
+
if (x.kind === 'embedded') {
|
|
328
|
+
outArray.push(x.code.includes('|') || x.code.includes('&')
|
|
329
|
+
? '(' + x.code + ')'
|
|
330
|
+
: x.code);
|
|
331
|
+
}
|
|
332
|
+
else
|
|
333
|
+
outArray.push(x.typeName);
|
|
334
|
+
}
|
|
335
|
+
if (intent === 'root')
|
|
336
|
+
return `type ${dataType.name} = ${outArray.join(' | ')}`;
|
|
337
|
+
return outArray.join(' | ');
|
|
338
|
+
}
|
|
@@ -43,7 +43,7 @@ async function generateDocument(document, options) {
|
|
|
43
43
|
? (0, putil_varhelpers_1.pascalCase)(ref.info.title)
|
|
44
44
|
: `Reference${refIdGenerator++}`);
|
|
45
45
|
generator._documentRoot = '/references/' + typesNamespace;
|
|
46
|
-
generator._typesRoot = node_path_1.default.join(generator._documentRoot, 'models');
|
|
46
|
+
generator._typesRoot = node_path_1.default.posix.join(generator._documentRoot, 'models');
|
|
47
47
|
generator._typesNamespace =
|
|
48
48
|
!this.options.referenceNamespaces || ref[common_1.BUILTIN] ? '' : typesNamespace;
|
|
49
49
|
await generator.generateDocument(ref, {
|
|
@@ -105,11 +105,13 @@ exports.TsGenerator = TsGenerator;
|
|
|
105
105
|
TsGenerator.prototype.generateDocument = generate_document_js_1.generateDocument;
|
|
106
106
|
TsGenerator.prototype.generateDataType = generate_data_type_js_1.generateDataType;
|
|
107
107
|
TsGenerator.prototype._generateTypeCode = generate_data_type_js_1._generateTypeCode;
|
|
108
|
-
TsGenerator.prototype.
|
|
108
|
+
TsGenerator.prototype._generateArrayTypeCode = generate_data_type_js_1._generateArrayTypeCode;
|
|
109
109
|
TsGenerator.prototype._generateComplexTypeCode = generate_data_type_js_1._generateComplexTypeCode;
|
|
110
|
-
TsGenerator.prototype.
|
|
110
|
+
TsGenerator.prototype._generateEnumTypeCode = generate_data_type_js_1._generateEnumTypeCode;
|
|
111
111
|
TsGenerator.prototype._generateMappedTypeCode = generate_data_type_js_1._generateMappedTypeCode;
|
|
112
112
|
TsGenerator.prototype._generateMixinTypeCode = generate_data_type_js_1._generateMixinTypeCode;
|
|
113
|
+
TsGenerator.prototype._generateSimpleTypeCode = generate_data_type_js_1._generateSimpleTypeCode;
|
|
114
|
+
TsGenerator.prototype._generateUnionTypeCode = generate_data_type_js_1._generateUnionTypeCode;
|
|
113
115
|
TsGenerator.prototype.generateHttpApi = generate_http_api_js_1.generateHttpApi;
|
|
114
116
|
TsGenerator.prototype.generateHttpController = generate_http_controller_js_1.generateHttpController;
|
|
115
117
|
})();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { ComplexType, EnumType, MappedType, MixinType, SimpleType, } from '@opra/common';
|
|
2
|
+
import { ArrayType, ComplexType, EnumType, MappedType, MixinType, SimpleType, UnionType, } from '@opra/common';
|
|
3
3
|
import { CodeBlock } from '../../code-block.js';
|
|
4
4
|
import { wrapJSDocString } from '../utils/string-utils.js';
|
|
5
5
|
const internalTypeNames = [
|
|
@@ -75,14 +75,14 @@ export async function _generateTypeCode(currentFile, dataType, intent) {
|
|
|
75
75
|
if (intent === 'root' && !dataType.name) {
|
|
76
76
|
throw new TypeError(`Name required to generate data type code to root intent`);
|
|
77
77
|
}
|
|
78
|
-
if (dataType instanceof
|
|
79
|
-
return await this.
|
|
78
|
+
if (dataType instanceof ArrayType) {
|
|
79
|
+
return await this._generateArrayTypeCode(currentFile, dataType, intent);
|
|
80
80
|
}
|
|
81
81
|
if (dataType instanceof ComplexType) {
|
|
82
82
|
return await this._generateComplexTypeCode(currentFile, dataType, intent);
|
|
83
83
|
}
|
|
84
|
-
if (dataType instanceof
|
|
85
|
-
return await this.
|
|
84
|
+
if (dataType instanceof EnumType) {
|
|
85
|
+
return await this._generateEnumTypeCode(currentFile, dataType, intent);
|
|
86
86
|
}
|
|
87
87
|
if (dataType instanceof MappedType) {
|
|
88
88
|
return await this._generateMappedTypeCode(currentFile, dataType, intent);
|
|
@@ -90,36 +90,34 @@ export async function _generateTypeCode(currentFile, dataType, intent) {
|
|
|
90
90
|
if (dataType instanceof MixinType) {
|
|
91
91
|
return await this._generateMixinTypeCode(currentFile, dataType, intent);
|
|
92
92
|
}
|
|
93
|
+
if (dataType instanceof SimpleType) {
|
|
94
|
+
return await this._generateSimpleTypeCode(currentFile, dataType, intent);
|
|
95
|
+
}
|
|
96
|
+
if (dataType instanceof UnionType) {
|
|
97
|
+
return await this._generateUnionTypeCode(currentFile, dataType, intent);
|
|
98
|
+
}
|
|
93
99
|
/* istanbul ignore next */
|
|
94
100
|
throw new TypeError(`${dataType.kind} data types can not be directly exported`);
|
|
95
101
|
}
|
|
96
102
|
/**
|
|
97
103
|
*
|
|
98
104
|
*/
|
|
99
|
-
export async function
|
|
100
|
-
if (intent === '
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
out +=
|
|
110
|
-
`${info.alias || value} = ` +
|
|
111
|
-
(typeof value === 'number'
|
|
112
|
-
? value
|
|
113
|
-
: "'" + String(value).replace("'", "\\'") + "'");
|
|
114
|
-
out += ',\n\n';
|
|
115
|
-
}
|
|
116
|
-
return out + '\b}';
|
|
105
|
+
export async function _generateArrayTypeCode(currentFile, dataType, intent) {
|
|
106
|
+
if (intent === 'extends')
|
|
107
|
+
throw new TypeError('Array types can not be extended');
|
|
108
|
+
let out = '';
|
|
109
|
+
const x = await this.generateDataType(dataType.type, 'typeDef', currentFile);
|
|
110
|
+
if (x.kind === 'embedded') {
|
|
111
|
+
out =
|
|
112
|
+
x.code.includes('|') || x.code.includes('&')
|
|
113
|
+
? '(' + x.code + ')'
|
|
114
|
+
: x.code;
|
|
117
115
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
else
|
|
117
|
+
out = x.typeName;
|
|
118
|
+
if (intent === 'root')
|
|
119
|
+
return `type ${dataType.name} = ${out}[]`;
|
|
120
|
+
return `${out}[]`;
|
|
123
121
|
}
|
|
124
122
|
/**
|
|
125
123
|
*
|
|
@@ -170,17 +168,20 @@ export async function _generateComplexTypeCode(currentFile, dataType, intent) {
|
|
|
170
168
|
if (field.readonly)
|
|
171
169
|
out += 'readonly ';
|
|
172
170
|
out += `${field.name}${field.required ? '' : '?'}: `;
|
|
171
|
+
let typ = '';
|
|
173
172
|
if (field.fixed) {
|
|
174
173
|
const t = typeof field.fixed;
|
|
175
|
-
|
|
174
|
+
typ = `${t === 'number' || t === 'boolean' || t === 'bigint' ? field.fixed : "'" + field.fixed + "'"}\n`;
|
|
176
175
|
}
|
|
177
176
|
else {
|
|
178
177
|
const x = await this.generateDataType(field.type, 'typeDef', currentFile);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
178
|
+
typ = x.kind === 'embedded' ? x.code : x.typeName;
|
|
179
|
+
}
|
|
180
|
+
if (field.isArray && !(field.type instanceof ArrayType)) {
|
|
181
|
+
out += /[a-zA-Z]\w*/.test(typ) ? typ + '[];\n' : '(' + typ + ')[];\n';
|
|
183
182
|
}
|
|
183
|
+
else
|
|
184
|
+
out += typ + ';\n';
|
|
184
185
|
}
|
|
185
186
|
if (dataType.additionalFields)
|
|
186
187
|
out += '[key: string]: any;\n';
|
|
@@ -189,30 +190,30 @@ export async function _generateComplexTypeCode(currentFile, dataType, intent) {
|
|
|
189
190
|
/**
|
|
190
191
|
*
|
|
191
192
|
*/
|
|
192
|
-
export async function
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
*
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
193
|
+
export async function _generateEnumTypeCode(currentFile, dataType, intent) {
|
|
194
|
+
if (intent === 'root') {
|
|
195
|
+
let out = `enum ${dataType.name} {\n\t`;
|
|
196
|
+
for (const [value, info] of Object.entries(dataType.attributes)) {
|
|
197
|
+
// Print JSDoc
|
|
198
|
+
let jsDoc = '';
|
|
199
|
+
if (dataType.attributes[value].description)
|
|
200
|
+
jsDoc += ` * ${dataType.attributes[value].description}\n`;
|
|
201
|
+
if (jsDoc)
|
|
202
|
+
out += `/**\n${jsDoc} */\n`;
|
|
203
|
+
out +=
|
|
204
|
+
`${info.alias || value} = ` +
|
|
205
|
+
(typeof value === 'number'
|
|
206
|
+
? value
|
|
207
|
+
: "'" + String(value).replace("'", "\\'") + "'");
|
|
208
|
+
out += ',\n\n';
|
|
207
209
|
}
|
|
208
|
-
|
|
209
|
-
outArray.push(x.typeName);
|
|
210
|
+
return out + '\b}';
|
|
210
211
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
212
|
+
return ('(' +
|
|
213
|
+
Object.keys(dataType.attributes)
|
|
214
|
+
.map(t => `'${t}'`)
|
|
215
|
+
.join(' | ') +
|
|
216
|
+
')');
|
|
216
217
|
}
|
|
217
218
|
/**
|
|
218
219
|
*
|
|
@@ -272,3 +273,54 @@ export async function _generateMappedTypeCode(currentFile, dataType, intent) {
|
|
|
272
273
|
}
|
|
273
274
|
return out;
|
|
274
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
*
|
|
278
|
+
*/
|
|
279
|
+
export async function _generateMixinTypeCode(currentFile, dataType, intent) {
|
|
280
|
+
const outArray = [];
|
|
281
|
+
for (const t of dataType.types) {
|
|
282
|
+
const x = await this.generateDataType(t, 'typeDef', currentFile);
|
|
283
|
+
if (x.kind === 'embedded') {
|
|
284
|
+
outArray.push(x.code.includes('|') || x.code.includes('&')
|
|
285
|
+
? '(' + x.code + ')'
|
|
286
|
+
: x.code);
|
|
287
|
+
}
|
|
288
|
+
else
|
|
289
|
+
outArray.push(x.typeName);
|
|
290
|
+
}
|
|
291
|
+
if (intent === 'root')
|
|
292
|
+
return `type ${dataType.name} = ${outArray.join(' & ')}`;
|
|
293
|
+
if (intent === 'extends')
|
|
294
|
+
return outArray.join(', ');
|
|
295
|
+
return outArray.join(' & ');
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
*
|
|
299
|
+
*/
|
|
300
|
+
export async function _generateSimpleTypeCode(currentFile, dataType, intent) {
|
|
301
|
+
let out = intent === 'root' ? `type ${dataType.name} = ` : '';
|
|
302
|
+
const nameMapping = dataType.nameMappings.js || 'any';
|
|
303
|
+
out += nameMapping === 'Date' ? 'string' : nameMapping;
|
|
304
|
+
return intent === 'root' ? out + ';' : out;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
*
|
|
308
|
+
*/
|
|
309
|
+
export async function _generateUnionTypeCode(currentFile, dataType, intent) {
|
|
310
|
+
if (intent === 'extends')
|
|
311
|
+
throw new TypeError('Union types can not be extended');
|
|
312
|
+
const outArray = [];
|
|
313
|
+
for (const t of dataType.types) {
|
|
314
|
+
const x = await this.generateDataType(t, 'typeDef', currentFile);
|
|
315
|
+
if (x.kind === 'embedded') {
|
|
316
|
+
outArray.push(x.code.includes('|') || x.code.includes('&')
|
|
317
|
+
? '(' + x.code + ')'
|
|
318
|
+
: x.code);
|
|
319
|
+
}
|
|
320
|
+
else
|
|
321
|
+
outArray.push(x.typeName);
|
|
322
|
+
}
|
|
323
|
+
if (intent === 'root')
|
|
324
|
+
return `type ${dataType.name} = ${outArray.join(' | ')}`;
|
|
325
|
+
return outArray.join(' | ');
|
|
326
|
+
}
|
|
@@ -39,7 +39,7 @@ export async function generateDocument(document, options) {
|
|
|
39
39
|
? pascalCase(ref.info.title)
|
|
40
40
|
: `Reference${refIdGenerator++}`);
|
|
41
41
|
generator._documentRoot = '/references/' + typesNamespace;
|
|
42
|
-
generator._typesRoot = path.join(generator._documentRoot, 'models');
|
|
42
|
+
generator._typesRoot = path.posix.join(generator._documentRoot, 'models');
|
|
43
43
|
generator._typesNamespace =
|
|
44
44
|
!this.options.referenceNamespaces || ref[BUILTIN] ? '' : typesNamespace;
|
|
45
45
|
await generator.generateDocument(ref, {
|
|
@@ -5,7 +5,7 @@ import process from 'node:process';
|
|
|
5
5
|
import colors from 'ansi-colors';
|
|
6
6
|
import { FileWriter } from '../file-writer.js';
|
|
7
7
|
import { cleanDirectory } from './generators/clean-directory.js';
|
|
8
|
-
import { _generateComplexTypeCode, _generateEnumTypeCode, _generateMappedTypeCode, _generateMixinTypeCode, _generateSimpleTypeCode, _generateTypeCode, generateDataType, } from './generators/generate-data-type.js';
|
|
8
|
+
import { _generateArrayTypeCode, _generateComplexTypeCode, _generateEnumTypeCode, _generateMappedTypeCode, _generateMixinTypeCode, _generateSimpleTypeCode, _generateTypeCode, _generateUnionTypeCode, generateDataType, } from './generators/generate-data-type.js';
|
|
9
9
|
import { generateDocument } from './generators/generate-document.js';
|
|
10
10
|
import { generateHttpApi } from './generators/generate-http-api.js';
|
|
11
11
|
import { generateHttpController } from './generators/generate-http-controller.js';
|
|
@@ -100,11 +100,13 @@ export class TsGenerator extends EventEmitter {
|
|
|
100
100
|
TsGenerator.prototype.generateDocument = generateDocument;
|
|
101
101
|
TsGenerator.prototype.generateDataType = generateDataType;
|
|
102
102
|
TsGenerator.prototype._generateTypeCode = _generateTypeCode;
|
|
103
|
-
TsGenerator.prototype.
|
|
103
|
+
TsGenerator.prototype._generateArrayTypeCode = _generateArrayTypeCode;
|
|
104
104
|
TsGenerator.prototype._generateComplexTypeCode = _generateComplexTypeCode;
|
|
105
|
-
TsGenerator.prototype.
|
|
105
|
+
TsGenerator.prototype._generateEnumTypeCode = _generateEnumTypeCode;
|
|
106
106
|
TsGenerator.prototype._generateMappedTypeCode = _generateMappedTypeCode;
|
|
107
107
|
TsGenerator.prototype._generateMixinTypeCode = _generateMixinTypeCode;
|
|
108
|
+
TsGenerator.prototype._generateSimpleTypeCode = _generateSimpleTypeCode;
|
|
109
|
+
TsGenerator.prototype._generateUnionTypeCode = _generateUnionTypeCode;
|
|
108
110
|
TsGenerator.prototype.generateHttpApi = generateHttpApi;
|
|
109
111
|
TsGenerator.prototype.generateHttpController = generateHttpController;
|
|
110
112
|
})();
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opra/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "Opra CLI tools",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@browsery/type-is": "^2.0.1",
|
|
9
9
|
"ansi-colors": "^4.1.3",
|
|
10
|
-
"commander": "^14.0.
|
|
10
|
+
"commander": "^14.0.2",
|
|
11
11
|
"js-string-escape": "^1.0.1",
|
|
12
12
|
"putil-flattentext": "^2.1.1",
|
|
13
13
|
"putil-varhelpers": "^1.6.5",
|
|
14
14
|
"tslib": "^2.8.1"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"@opra/client": "^1.
|
|
18
|
-
"@opra/common": "^1.
|
|
17
|
+
"@opra/client": "^1.20.0",
|
|
18
|
+
"@opra/common": "^1.20.0"
|
|
19
19
|
},
|
|
20
20
|
"type": "module",
|
|
21
21
|
"exports": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ComplexType, DataType, EnumType, MappedType, MixinType, SimpleType } from '@opra/common';
|
|
1
|
+
import { ArrayType, ComplexType, DataType, EnumType, MappedType, MixinType, SimpleType, UnionType } from '@opra/common';
|
|
2
2
|
import { TsFile } from '../ts-file.js';
|
|
3
3
|
import type { TsGenerator } from '../ts-generator';
|
|
4
4
|
type Intent = 'root' | 'extends' | 'typeDef';
|
|
@@ -21,7 +21,7 @@ export declare function _generateTypeCode(this: TsGenerator, currentFile: TsFile
|
|
|
21
21
|
/**
|
|
22
22
|
*
|
|
23
23
|
*/
|
|
24
|
-
export declare function
|
|
24
|
+
export declare function _generateArrayTypeCode(this: TsGenerator, currentFile: TsFile, dataType: ArrayType, intent?: Intent): Promise<string>;
|
|
25
25
|
/**
|
|
26
26
|
*
|
|
27
27
|
*/
|
|
@@ -29,7 +29,11 @@ export declare function _generateComplexTypeCode(this: TsGenerator, currentFile:
|
|
|
29
29
|
/**
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
|
-
export declare function
|
|
32
|
+
export declare function _generateEnumTypeCode(this: TsGenerator, currentFile: TsFile, dataType: EnumType, intent?: Intent): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
export declare function _generateMappedTypeCode(this: TsGenerator, currentFile: TsFile, dataType: MappedType, intent?: Intent): Promise<string>;
|
|
33
37
|
/**
|
|
34
38
|
*
|
|
35
39
|
*/
|
|
@@ -37,5 +41,9 @@ export declare function _generateMixinTypeCode(this: TsGenerator, currentFile: T
|
|
|
37
41
|
/**
|
|
38
42
|
*
|
|
39
43
|
*/
|
|
40
|
-
export declare function
|
|
44
|
+
export declare function _generateSimpleTypeCode(this: TsGenerator, currentFile: TsFile, dataType: SimpleType, intent?: Intent): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
export declare function _generateUnionTypeCode(this: TsGenerator, currentFile: TsFile, dataType: UnionType, intent?: Intent): Promise<string>;
|
|
41
49
|
export {};
|
|
@@ -3,7 +3,7 @@ import { ApiDocument } from '@opra/common';
|
|
|
3
3
|
import type { IFileWriter } from '../interfaces/file-writer.interface.js';
|
|
4
4
|
import type { ILogger } from '../interfaces/logger.interface.js';
|
|
5
5
|
import { cleanDirectory } from './generators/clean-directory.js';
|
|
6
|
-
import { _generateComplexTypeCode, _generateEnumTypeCode, _generateMappedTypeCode, _generateMixinTypeCode, _generateSimpleTypeCode, _generateTypeCode, generateDataType } from './generators/generate-data-type.js';
|
|
6
|
+
import { _generateArrayTypeCode, _generateComplexTypeCode, _generateEnumTypeCode, _generateMappedTypeCode, _generateMixinTypeCode, _generateSimpleTypeCode, _generateTypeCode, _generateUnionTypeCode, generateDataType } from './generators/generate-data-type.js';
|
|
7
7
|
import { generateDocument } from './generators/generate-document.js';
|
|
8
8
|
import { generateHttpApi } from './generators/generate-http-api.js';
|
|
9
9
|
import { generateHttpController } from './generators/generate-http-controller.js';
|
|
@@ -31,11 +31,13 @@ export declare class TsGenerator extends EventEmitter {
|
|
|
31
31
|
protected generateDocument: typeof generateDocument;
|
|
32
32
|
protected generateDataType: typeof generateDataType;
|
|
33
33
|
protected _generateTypeCode: typeof _generateTypeCode;
|
|
34
|
-
protected
|
|
34
|
+
protected _generateArrayTypeCode: typeof _generateArrayTypeCode;
|
|
35
35
|
protected _generateComplexTypeCode: typeof _generateComplexTypeCode;
|
|
36
|
-
protected
|
|
36
|
+
protected _generateEnumTypeCode: typeof _generateEnumTypeCode;
|
|
37
37
|
protected _generateMappedTypeCode: typeof _generateMappedTypeCode;
|
|
38
38
|
protected _generateMixinTypeCode: typeof _generateMixinTypeCode;
|
|
39
|
+
protected _generateSimpleTypeCode: typeof _generateSimpleTypeCode;
|
|
40
|
+
protected _generateUnionTypeCode: typeof _generateUnionTypeCode;
|
|
39
41
|
protected generateHttpApi: typeof generateHttpApi;
|
|
40
42
|
protected generateHttpController: typeof generateHttpController;
|
|
41
43
|
protected _documentRoot: string;
|