@opra/cli 1.21.0 → 1.22.1

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 (61) hide show
  1. package/package.json +10 -27
  2. package/{esm/ts-generator → ts-generator}/ts-file.js +6 -4
  3. package/{esm/ts-generator → ts-generator}/ts-generator.js +26 -17
  4. package/cjs/code-block.js +0 -17
  5. package/cjs/file-writer.js +0 -11
  6. package/cjs/generator/code-generator.js +0 -7
  7. package/cjs/index.js +0 -4
  8. package/cjs/interfaces/file-writer.interface.js +0 -2
  9. package/cjs/interfaces/logger.interface.js +0 -2
  10. package/cjs/interfaces/service-generation-context.interface.js +0 -2
  11. package/cjs/oprimp-cli.js +0 -40
  12. package/cjs/package.json +0 -3
  13. package/cjs/ts-generator/generators/clean-directory.js +0 -34
  14. package/cjs/ts-generator/generators/generate-data-type.js +0 -338
  15. package/cjs/ts-generator/generators/generate-document.js +0 -73
  16. package/cjs/ts-generator/generators/generate-http-api.js +0 -46
  17. package/cjs/ts-generator/generators/generate-http-controller.js +0 -314
  18. package/cjs/ts-generator/http-controller-node.js +0 -21
  19. package/cjs/ts-generator/index.js +0 -4
  20. package/cjs/ts-generator/ts-file.js +0 -114
  21. package/cjs/ts-generator/ts-generator.js +0 -117
  22. package/cjs/ts-generator/utils/locate-named-type.js +0 -16
  23. package/cjs/ts-generator/utils/string-utils.js +0 -68
  24. package/esm/package.json +0 -3
  25. package/types/index.d.cts +0 -1
  26. /package/{types/code-block.d.ts → code-block.d.ts} +0 -0
  27. /package/{esm/code-block.js → code-block.js} +0 -0
  28. /package/{types/file-writer.d.ts → file-writer.d.ts} +0 -0
  29. /package/{esm/file-writer.js → file-writer.js} +0 -0
  30. /package/{types/generator → generator}/code-generator.d.ts +0 -0
  31. /package/{esm/generator → generator}/code-generator.js +0 -0
  32. /package/{types/index.d.ts → index.d.ts} +0 -0
  33. /package/{esm/index.js → index.js} +0 -0
  34. /package/{types/interfaces → interfaces}/file-writer.interface.d.ts +0 -0
  35. /package/{esm/interfaces → interfaces}/file-writer.interface.js +0 -0
  36. /package/{types/interfaces → interfaces}/logger.interface.d.ts +0 -0
  37. /package/{esm/interfaces → interfaces}/logger.interface.js +0 -0
  38. /package/{types/interfaces → interfaces}/service-generation-context.interface.d.ts +0 -0
  39. /package/{esm/interfaces → interfaces}/service-generation-context.interface.js +0 -0
  40. /package/{types/oprimp-cli.d.ts → oprimp-cli.d.ts} +0 -0
  41. /package/{esm/oprimp-cli.js → oprimp-cli.js} +0 -0
  42. /package/{types/ts-generator → ts-generator}/generators/clean-directory.d.ts +0 -0
  43. /package/{esm/ts-generator → ts-generator}/generators/clean-directory.js +0 -0
  44. /package/{types/ts-generator → ts-generator}/generators/generate-data-type.d.ts +0 -0
  45. /package/{esm/ts-generator → ts-generator}/generators/generate-data-type.js +0 -0
  46. /package/{types/ts-generator → ts-generator}/generators/generate-document.d.ts +0 -0
  47. /package/{esm/ts-generator → ts-generator}/generators/generate-document.js +0 -0
  48. /package/{types/ts-generator → ts-generator}/generators/generate-http-api.d.ts +0 -0
  49. /package/{esm/ts-generator → ts-generator}/generators/generate-http-api.js +0 -0
  50. /package/{types/ts-generator → ts-generator}/generators/generate-http-controller.d.ts +0 -0
  51. /package/{esm/ts-generator → ts-generator}/generators/generate-http-controller.js +0 -0
  52. /package/{types/ts-generator → ts-generator}/http-controller-node.d.ts +0 -0
  53. /package/{esm/ts-generator → ts-generator}/http-controller-node.js +0 -0
  54. /package/{types/ts-generator → ts-generator}/index.d.ts +0 -0
  55. /package/{esm/ts-generator → ts-generator}/index.js +0 -0
  56. /package/{types/ts-generator → ts-generator}/ts-file.d.ts +0 -0
  57. /package/{types/ts-generator → ts-generator}/ts-generator.d.ts +0 -0
  58. /package/{types/ts-generator → ts-generator}/utils/locate-named-type.d.ts +0 -0
  59. /package/{esm/ts-generator → ts-generator}/utils/locate-named-type.js +0 -0
  60. /package/{types/ts-generator → ts-generator}/utils/string-utils.d.ts +0 -0
  61. /package/{esm/ts-generator → ts-generator}/utils/string-utils.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/cli",
3
- "version": "1.21.0",
3
+ "version": "1.22.1",
4
4
  "description": "Opra CLI tools",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -14,27 +14,22 @@
14
14
  "tslib": "^2.8.1"
15
15
  },
16
16
  "peerDependencies": {
17
- "@opra/client": "^1.21.0",
18
- "@opra/common": "^1.21.0"
17
+ "@opra/client": "^1.22.1",
18
+ "@opra/common": "^1.22.1"
19
19
  },
20
20
  "type": "module",
21
+ "module": "./index.js",
22
+ "types": "./index.d.ts",
21
23
  "exports": {
22
24
  ".": {
23
- "import": {
24
- "types": "./types/index.d.ts",
25
- "default": "./esm/index.js"
26
- },
27
- "require": {
28
- "types": "./types/index.d.cts",
29
- "default": "./cjs/index.js"
30
- },
31
- "default": "./esm/index.js"
25
+ "types": "./index.d.ts",
26
+ "default": "./index.js"
32
27
  },
33
28
  "./package.json": "./package.json"
34
29
  },
35
- "main": "./cjs/index.js",
36
- "module": "./esm/index.js",
37
- "types": "./types/index.d.ts",
30
+ "engines": {
31
+ "node": ">=20.0"
32
+ },
38
33
  "bin": {
39
34
  "oprimp": "bin/oprimp.mjs"
40
35
  },
@@ -43,18 +38,6 @@
43
38
  "url": "git+https://github.com/panates/opra.git",
44
39
  "directory": "packages/client"
45
40
  },
46
- "engines": {
47
- "node": ">=18.0",
48
- "npm": ">=7.0.0"
49
- },
50
- "files": [
51
- "bin/",
52
- "cjs/",
53
- "esm/",
54
- "types/",
55
- "LICENSE",
56
- "README.md"
57
- ],
58
41
  "keywords": [
59
42
  "opra",
60
43
  "cli",
@@ -2,12 +2,14 @@ import path from 'node:path';
2
2
  import flattenText from 'putil-flattentext';
3
3
  import { CodeBlock } from '../code-block.js';
4
4
  export class TsFile {
5
+ filename;
6
+ dirname;
7
+ imports = {};
8
+ exportFiles = {};
9
+ exportTypes = [];
10
+ code = new CodeBlock();
5
11
  constructor(filename) {
6
12
  this.filename = filename;
7
- this.imports = {};
8
- this.exportFiles = {};
9
- this.exportTypes = [];
10
- this.code = new CodeBlock();
11
13
  this.dirname = path.dirname(filename);
12
14
  this.code.header = '';
13
15
  this.code.imports = '';
@@ -14,14 +14,23 @@ import { TsFile } from './ts-file.js';
14
14
  * @class TsGenerator
15
15
  */
16
16
  export class TsGenerator extends EventEmitter {
17
+ _files = {};
18
+ _started = false;
19
+ _document;
20
+ _documentsMap;
21
+ _filesMap;
22
+ serviceUrl;
23
+ outDir;
24
+ cwd;
25
+ writer;
26
+ options;
27
+ fileHeader;
17
28
  /**
18
29
  *
19
30
  * @constructor
20
31
  */
21
32
  constructor(init) {
22
33
  super();
23
- this._files = {};
24
- this._started = false;
25
34
  this.serviceUrl = init.serviceUrl;
26
35
  this.cwd = init.cwd || process.cwd();
27
36
  this.outDir = init.outDir ? path.resolve(this.cwd, init.outDir) : this.cwd;
@@ -94,19 +103,19 @@ export class TsGenerator extends EventEmitter {
94
103
  Object.setPrototypeOf(instance, this);
95
104
  return instance;
96
105
  }
106
+ static {
107
+ TsGenerator.prototype.cleanDirectory = cleanDirectory;
108
+ TsGenerator.prototype.generateDocument = generateDocument;
109
+ TsGenerator.prototype.generateDataType = generateDataType;
110
+ TsGenerator.prototype._generateTypeCode = _generateTypeCode;
111
+ TsGenerator.prototype._generateArrayTypeCode = _generateArrayTypeCode;
112
+ TsGenerator.prototype._generateComplexTypeCode = _generateComplexTypeCode;
113
+ TsGenerator.prototype._generateEnumTypeCode = _generateEnumTypeCode;
114
+ TsGenerator.prototype._generateMappedTypeCode = _generateMappedTypeCode;
115
+ TsGenerator.prototype._generateMixinTypeCode = _generateMixinTypeCode;
116
+ TsGenerator.prototype._generateSimpleTypeCode = _generateSimpleTypeCode;
117
+ TsGenerator.prototype._generateUnionTypeCode = _generateUnionTypeCode;
118
+ TsGenerator.prototype.generateHttpApi = generateHttpApi;
119
+ TsGenerator.prototype.generateHttpController = generateHttpController;
120
+ }
97
121
  }
98
- (() => {
99
- TsGenerator.prototype.cleanDirectory = cleanDirectory;
100
- TsGenerator.prototype.generateDocument = generateDocument;
101
- TsGenerator.prototype.generateDataType = generateDataType;
102
- TsGenerator.prototype._generateTypeCode = _generateTypeCode;
103
- TsGenerator.prototype._generateArrayTypeCode = _generateArrayTypeCode;
104
- TsGenerator.prototype._generateComplexTypeCode = _generateComplexTypeCode;
105
- TsGenerator.prototype._generateEnumTypeCode = _generateEnumTypeCode;
106
- TsGenerator.prototype._generateMappedTypeCode = _generateMappedTypeCode;
107
- TsGenerator.prototype._generateMixinTypeCode = _generateMixinTypeCode;
108
- TsGenerator.prototype._generateSimpleTypeCode = _generateSimpleTypeCode;
109
- TsGenerator.prototype._generateUnionTypeCode = _generateUnionTypeCode;
110
- TsGenerator.prototype.generateHttpApi = generateHttpApi;
111
- TsGenerator.prototype.generateHttpController = generateHttpController;
112
- })();
package/cjs/code-block.js DELETED
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeBlock = void 0;
4
- class CodeBlock {
5
- toString() {
6
- // if (this.content) return this.content;
7
- let out = '';
8
- for (const x of Object.values(this)) {
9
- out += String(x);
10
- }
11
- return out;
12
- }
13
- [Symbol.toStringTag]() {
14
- return this.toString();
15
- }
16
- }
17
- exports.CodeBlock = CodeBlock;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FileWriter = void 0;
4
- const tslib_1 = require("tslib");
5
- const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
6
- class FileWriter {
7
- writeFile(filename, contents) {
8
- node_fs_1.default.writeFileSync(filename, contents, 'utf-8');
9
- }
10
- }
11
- exports.FileWriter = FileWriter;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeGenerator = void 0;
4
- const node_events_1 = require("node:events");
5
- class CodeGenerator extends node_events_1.EventEmitter {
6
- }
7
- exports.CodeGenerator = CodeGenerator;
package/cjs/index.js DELETED
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./ts-generator/index.js"), exports);
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
package/cjs/oprimp-cli.js DELETED
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const console = tslib_1.__importStar(require("node:console"));
5
- const fs = tslib_1.__importStar(require("node:fs"));
6
- const node_path_1 = tslib_1.__importDefault(require("node:path"));
7
- const process = tslib_1.__importStar(require("node:process"));
8
- const common_1 = require("@opra/common");
9
- const ansi_colors_1 = tslib_1.__importDefault(require("ansi-colors"));
10
- const commander_1 = require("commander");
11
- const ts_generator_js_1 = require("./ts-generator/ts-generator.js");
12
- const dirname = node_path_1.default.dirname((0, common_1.getStackFileName)());
13
- const pkgJson = JSON.parse(fs.readFileSync(node_path_1.default.resolve(dirname, '../package.json'), 'utf-8'));
14
- commander_1.program
15
- .version(pkgJson.version)
16
- .argument('<serviceUrl>', 'OPRA service url')
17
- .argument('<outDir>', 'Output directory')
18
- .option('--ext', 'Adds js extension to imports')
19
- .option('--refns', 'Exports references with namespaces')
20
- .option('--no-color', 'Disables colors in logs messages')
21
- .action(async (serviceUrl, outDir, options) => {
22
- if (!options.color)
23
- ansi_colors_1.default.enabled = false;
24
- const generator = new ts_generator_js_1.TsGenerator({
25
- serviceUrl,
26
- logger: console,
27
- outDir,
28
- importExt: options.ext,
29
- referenceNamespaces: options.refns,
30
- fileHeader: `/* Generated by OPRA Code Generator, Version ${pkgJson.version} */`,
31
- });
32
- await generator
33
- .generate()
34
- .then(() => console.log(ansi_colors_1.default.greenBright('Completed')))
35
- .catch(e => console.error(e.message));
36
- });
37
- if (process.argv.length < 3)
38
- commander_1.program.help();
39
- else
40
- commander_1.program.parse(process.argv);
package/cjs/package.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "type": "commonjs"
3
- }
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cleanDirectory = cleanDirectory;
4
- const tslib_1 = require("tslib");
5
- const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
6
- const node_path_1 = tslib_1.__importDefault(require("node:path"));
7
- const ansi_colors_1 = tslib_1.__importDefault(require("ansi-colors"));
8
- function cleanDirectory(dirname) {
9
- const rootDir = dirname;
10
- const _cleanDirectory = (targetDir) => {
11
- if (!node_fs_1.default.existsSync(targetDir))
12
- return;
13
- const files = node_fs_1.default.readdirSync(targetDir);
14
- for (const f of files) {
15
- const absolutePath = node_path_1.default.join(targetDir, f);
16
- if (node_fs_1.default.statSync(absolutePath).isDirectory()) {
17
- _cleanDirectory(absolutePath);
18
- if (!node_fs_1.default.readdirSync(absolutePath).length) {
19
- this.emit('verbose', ansi_colors_1.default.cyan(`Removing directory ${node_path_1.default.relative(absolutePath, rootDir)}`));
20
- node_fs_1.default.rmdirSync(absolutePath);
21
- }
22
- continue;
23
- }
24
- if (node_path_1.default.extname(f) === '.ts') {
25
- const contents = node_fs_1.default.readFileSync(absolutePath, 'utf-8');
26
- if (contents.includes('#!oprimp_auto_generated!#')) {
27
- this.emit('verbose', ansi_colors_1.default.cyan(`Removing file ${node_path_1.default.relative(absolutePath, rootDir)}`));
28
- node_fs_1.default.unlinkSync(absolutePath);
29
- }
30
- }
31
- }
32
- };
33
- _cleanDirectory(dirname);
34
- }
@@ -1,338 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateDataType = generateDataType;
4
- exports._generateTypeCode = _generateTypeCode;
5
- exports._generateArrayTypeCode = _generateArrayTypeCode;
6
- exports._generateComplexTypeCode = _generateComplexTypeCode;
7
- exports._generateEnumTypeCode = _generateEnumTypeCode;
8
- exports._generateMappedTypeCode = _generateMappedTypeCode;
9
- exports._generateMixinTypeCode = _generateMixinTypeCode;
10
- exports._generateSimpleTypeCode = _generateSimpleTypeCode;
11
- exports._generateUnionTypeCode = _generateUnionTypeCode;
12
- const tslib_1 = require("tslib");
13
- const node_path_1 = tslib_1.__importDefault(require("node:path"));
14
- const common_1 = require("@opra/common");
15
- const code_block_js_1 = require("../../code-block.js");
16
- const string_utils_js_1 = require("../utils/string-utils.js");
17
- const internalTypeNames = [
18
- 'any',
19
- 'boolean',
20
- 'bigint',
21
- 'number',
22
- 'null',
23
- 'string',
24
- 'object',
25
- ];
26
- async function generateDataType(dataType, intent, currentFile) {
27
- const doc = dataType.node.getDocument();
28
- if (doc.id !== this._document?.id) {
29
- const { generator } = await this.generateDocument(doc);
30
- return await generator.generateDataType(dataType, intent, currentFile);
31
- }
32
- try {
33
- const typeName = dataType.name;
34
- if (typeName) {
35
- if (internalTypeNames.includes(typeName))
36
- return { kind: 'internal', typeName: dataType.name };
37
- let file = this._filesMap.get(dataType);
38
- if (file) {
39
- if (currentFile)
40
- currentFile.addImport(file.filename, [typeName]);
41
- return { kind: 'named', file, typeName: dataType.name };
42
- }
43
- if (dataType instanceof common_1.SimpleType)
44
- file = this.addFile(node_path_1.default.join(this._documentRoot, '/simple-types.ts'), true);
45
- else if (dataType instanceof common_1.EnumType) {
46
- file = this.addFile(node_path_1.default.join(this._typesRoot, 'enums', typeName + '.ts'), true);
47
- }
48
- else
49
- file = this.addFile(node_path_1.default.join(this._typesRoot, 'types', typeName + '.ts'), true);
50
- this._filesMap.set(dataType, file);
51
- if (file.exportTypes.includes(typeName)) {
52
- if (currentFile)
53
- currentFile.addImport(file.filename, [typeName]);
54
- return { kind: 'named', file, typeName: dataType.name };
55
- }
56
- file.exportTypes.push(typeName);
57
- const typesIndexTs = this.addFile(node_path_1.default.join(this._typesRoot, 'index.ts'), true);
58
- const indexTs = this.addFile('/index.ts', true);
59
- indexTs.addExport(typesIndexTs.filename, undefined, this._typesNamespace);
60
- const codeBlock = (file.code['type_' + typeName] = new code_block_js_1.CodeBlock());
61
- codeBlock.head = `/**\n * ${(0, string_utils_js_1.wrapJSDocString)(dataType.description || '')}\n *`;
62
- codeBlock.head += `
63
- * @url ${node_path_1.default.posix.join(doc.url || this.serviceUrl, '$schema', '#types/' + typeName)}
64
- */
65
- export `;
66
- codeBlock.typeDef =
67
- (await this._generateTypeCode(file, dataType, 'root')) + '\n\n';
68
- typesIndexTs.addExport(file.filename);
69
- if (currentFile)
70
- currentFile.addImport(file.filename, [typeName]);
71
- return { kind: 'named', file, typeName };
72
- }
73
- if (!currentFile)
74
- throw new TypeError(`You must provide currentFile to generate data type`);
75
- const code = await this._generateTypeCode(currentFile, dataType, intent);
76
- return { kind: 'embedded', code };
77
- }
78
- catch (e) {
79
- e.message = `(${dataType.name}) ` + e.message;
80
- throw e;
81
- }
82
- }
83
- /**
84
- *
85
- */
86
- async function _generateTypeCode(currentFile, dataType, intent) {
87
- if (intent === 'root' && !dataType.name) {
88
- throw new TypeError(`Name required to generate data type code to root intent`);
89
- }
90
- if (dataType instanceof common_1.ArrayType) {
91
- return await this._generateArrayTypeCode(currentFile, dataType, intent);
92
- }
93
- if (dataType instanceof common_1.ComplexType) {
94
- return await this._generateComplexTypeCode(currentFile, dataType, intent);
95
- }
96
- if (dataType instanceof common_1.EnumType) {
97
- return await this._generateEnumTypeCode(currentFile, dataType, intent);
98
- }
99
- if (dataType instanceof common_1.MappedType) {
100
- return await this._generateMappedTypeCode(currentFile, dataType, intent);
101
- }
102
- if (dataType instanceof common_1.MixinType) {
103
- return await this._generateMixinTypeCode(currentFile, dataType, intent);
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
- }
111
- /* istanbul ignore next */
112
- throw new TypeError(`${dataType.kind} data types can not be directly exported`);
113
- }
114
- /**
115
- *
116
- */
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
- }
128
- else
129
- out = x.typeName;
130
- if (intent === 'root')
131
- return `type ${dataType.name} = ${out}[]`;
132
- return `${out}[]`;
133
- }
134
- /**
135
- *
136
- */
137
- async function _generateComplexTypeCode(currentFile, dataType, intent) {
138
- let out = intent === 'root' ? `interface ${dataType.name} ` : '';
139
- const ownFields = [...dataType.fields('*')].filter(f => f.origin === dataType);
140
- if (dataType.base) {
141
- const base = await this.generateDataType(dataType.base, 'extends', currentFile);
142
- let baseDef = base.kind === 'embedded' ? base.code : base.typeName;
143
- const omitBaseFields = ownFields.filter(f => dataType.base.findField(f.name));
144
- if (omitBaseFields.length)
145
- baseDef = `Omit<${baseDef}, ${omitBaseFields.map(x => "'" + x.name + "'").join(' | ')}>`;
146
- if (intent === 'root')
147
- out += `extends ${baseDef} `;
148
- else {
149
- out += baseDef;
150
- if (!ownFields.length)
151
- return out;
152
- out += ' & ';
153
- }
154
- }
155
- out += '{\n\t';
156
- let i = 0;
157
- for (const field of ownFields) {
158
- if (i++)
159
- out += '\n';
160
- // Print JSDoc
161
- out += `/**\n * ${field.description || ''}\n`;
162
- if (field.default)
163
- out += ` * @default ` + field.default + '\n';
164
- // if (field.format)
165
- // jsDoc += ` * @format ` + field.format + '\n';
166
- if (field.exclusive)
167
- out += ` * @exclusive\n`;
168
- if (field.readonly)
169
- out += ` * @readonly\n`;
170
- if (field.writeonly)
171
- out += ` * @writeonly\n`;
172
- if (field.deprecated) {
173
- out +=
174
- ` * @deprecated ` +
175
- (typeof field.deprecated === 'string' ? field.deprecated : '') +
176
- '\n';
177
- }
178
- out += ' */\n';
179
- // Print field name
180
- if (field.readonly)
181
- out += 'readonly ';
182
- out += `${field.name}${field.required ? '' : '?'}: `;
183
- let typ = '';
184
- if (field.fixed) {
185
- const t = typeof field.fixed;
186
- typ = `${t === 'number' || t === 'boolean' || t === 'bigint' ? field.fixed : "'" + field.fixed + "'"}\n`;
187
- }
188
- else {
189
- const x = await this.generateDataType(field.type, 'typeDef', currentFile);
190
- typ = x.kind === 'embedded' ? x.code : x.typeName;
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';
197
- }
198
- if (dataType.additionalFields)
199
- out += '[key: string]: any;\n';
200
- return out + '\b}';
201
- }
202
- /**
203
- *
204
- */
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';
221
- }
222
- return out + '\b}';
223
- }
224
- return ('(' +
225
- Object.keys(dataType.attributes)
226
- .map(t => `'${t}'`)
227
- .join(' | ') +
228
- ')');
229
- }
230
- /**
231
- *
232
- */
233
- async function _generateMappedTypeCode(currentFile, dataType, intent) {
234
- let out = intent === 'root' ? `type ${dataType.name} = ` : '';
235
- const base = await this.generateDataType(dataType.base, 'typeDef', currentFile);
236
- const typeDef = base.kind === 'embedded' ? base.code : base.typeName;
237
- const pick = dataType.pick?.length ? dataType.pick : undefined;
238
- const omit = !pick && dataType.omit?.length ? dataType.omit : undefined;
239
- const partial = dataType.partial === true ||
240
- (Array.isArray(dataType.partial) && dataType.partial.length > 0)
241
- ? dataType.partial
242
- : undefined;
243
- const required = dataType.required === true ||
244
- (Array.isArray(dataType.required) && dataType.required.length > 0)
245
- ? dataType.required
246
- : undefined;
247
- if (!(pick || omit || partial || required))
248
- return typeDef;
249
- if (partial === true)
250
- out += 'Partial<';
251
- else if (partial) {
252
- out += 'PartialSome<';
253
- currentFile.addExport('ts-gems', ['PartialSome']);
254
- }
255
- if (required === true)
256
- out += 'Partial<';
257
- else if (required) {
258
- out += 'RequiredSome<';
259
- currentFile.addExport('ts-gems', ['RequiredSome']);
260
- }
261
- if (pick)
262
- out += 'Pick<';
263
- else if (omit)
264
- out += 'Omit<';
265
- out += typeDef;
266
- if (omit || pick) {
267
- out +=
268
- ', ' +
269
- (omit || pick)
270
- .filter(x => !!x)
271
- .map(x => `'${x}'`)
272
- .join(' | ') +
273
- '>';
274
- }
275
- if (partial) {
276
- if (Array.isArray(partial)) {
277
- out +=
278
- ', ' +
279
- partial
280
- .filter(x => !!x)
281
- .map(x => `'${x}'`)
282
- .join(' | ');
283
- }
284
- out += '>';
285
- }
286
- return out;
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
- }