@frui.ts/generator
Advanced tools
Comparing version 0.15.0-alpha.1 to 0.15.0-alpha.2
@@ -1,10 +0,5 @@ | ||
import Entity from "./models/entity"; | ||
import Enum from "./models/enum"; | ||
import ApiModel from "./models/apiModel"; | ||
export default class ModelProcessor { | ||
process(apiPath: string): Promise<{ | ||
entities: Entity[]; | ||
enums: Enum[]; | ||
}>; | ||
private parseEntities; | ||
private extractEnums; | ||
process(apiPath: string): Promise<ApiModel>; | ||
private parseModel; | ||
} |
@@ -43,5 +43,3 @@ "use strict"; | ||
var swagger_parser_1 = __importDefault(require("@apidevtools/swagger-parser")); | ||
var lodash_1 = require("lodash"); | ||
var progressBar_1 = require("../progressBar"); | ||
var constants_1 = __importDefault(require("./constants")); | ||
var helpers_1 = require("./parsers/helpers"); | ||
@@ -55,3 +53,3 @@ var openApi2Parser_1 = __importDefault(require("./parsers/openApi2Parser")); | ||
return __awaiter(this, void 0, void 0, function () { | ||
var progress, api, entities, enums; | ||
var progress, api, model; | ||
return __generator(this, function (_a) { | ||
@@ -61,3 +59,3 @@ switch (_a.label) { | ||
progress = progressBar_1.createProgressBar("Analysing"); | ||
progress.start(3, 0); | ||
progress.start(2, 0); | ||
return [4, swagger_parser_1.default.parse(apiPath)]; | ||
@@ -67,8 +65,6 @@ case 1: | ||
progress.increment(); | ||
entities = this.parseEntities(api); | ||
model = this.parseModel(api); | ||
progress.increment(); | ||
enums = this.extractEnums(entities); | ||
progress.increment(); | ||
progress.stop(); | ||
return [2, { entities: entities, enums: enums }]; | ||
return [2, model]; | ||
} | ||
@@ -78,3 +74,3 @@ }); | ||
}; | ||
ModelProcessor.prototype.parseEntities = function (api) { | ||
ModelProcessor.prototype.parseModel = function (api) { | ||
if (helpers_1.isOpenAPIv2(api)) { | ||
@@ -91,15 +87,2 @@ return new openApi2Parser_1.default().parse(api); | ||
}; | ||
ModelProcessor.prototype.extractEnums = function (entities) { | ||
var properties = entities.flatMap(function (e) { | ||
return Array.from(e.properties.values(), function (p) { return p.type; }).filter(function (t) { return (t === null || t === void 0 ? void 0 : t.isEnum) && (t === null || t === void 0 ? void 0 : t.definition); }); | ||
}); | ||
return lodash_1.uniqBy(properties, function (t) { return t.definition; }).map(function (t) { | ||
var definition = t.definition; | ||
return { | ||
name: t.name, | ||
definition: definition, | ||
items: definition.split(constants_1.default.enumSeparator), | ||
}; | ||
}); | ||
}; | ||
return ModelProcessor; | ||
@@ -106,0 +89,0 @@ }()); |
export default interface Enum { | ||
name: string; | ||
definition: string; | ||
items: string[]; | ||
} |
@@ -5,4 +5,5 @@ export default interface TypeDefinition { | ||
isArray?: boolean; | ||
isEnum?: boolean; | ||
definition?: string; | ||
innerTypes?: TypeDefinition[]; | ||
enumValues?: string[]; | ||
format?: string; | ||
} |
import { OpenAPIV2 } from "openapi-types"; | ||
import Entity from "../models/entity"; | ||
import TypeDefinition from "../models/typeDefinition"; | ||
import ApiModel from "../models/apiModel"; | ||
export default class OpenApi2Parser { | ||
parse(api: OpenAPIV2.Document): Entity[]; | ||
parse(api: OpenAPIV2.Document): ApiModel; | ||
private parseEntity; | ||
@@ -7,0 +7,0 @@ private parseEntityProperty; |
"use strict"; | ||
var __values = (this && this.__values) || function(o) { | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) return m.call(o); | ||
if (o && typeof o.length === "number") return { | ||
next: function () { | ||
if (o && i >= o.length) o = void 0; | ||
return { value: o && o[i++], done: !o }; | ||
} | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
}; | ||
var __read = (this && this.__read) || function (o, n) { | ||
@@ -18,2 +29,6 @@ var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
}; | ||
var __spread = (this && this.__spread) || function () { | ||
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); | ||
return ar; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -25,6 +40,6 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
var util_1 = require("util"); | ||
var constants_1 = __importDefault(require("../constants")); | ||
var entity_1 = __importDefault(require("../models/entity")); | ||
var entityProperty_1 = __importDefault(require("../models/entityProperty")); | ||
var restriction_1 = __importDefault(require("../models/restriction")); | ||
var apiModel_1 = __importDefault(require("../models/apiModel")); | ||
var OpenApi2Parser = (function () { | ||
@@ -34,12 +49,41 @@ function OpenApi2Parser() { | ||
OpenApi2Parser.prototype.parse = function (api) { | ||
var _this = this; | ||
var e_1, _a; | ||
var entities = []; | ||
var enums = []; | ||
if (api.definitions) { | ||
var definitions = Object.entries(api.definitions); | ||
var entities = definitions.map(function (_a) { | ||
var _b = __read(_a, 2), name = _b[0], definition = _b[1]; | ||
return _this.parseEntity(name, definition); | ||
}); | ||
return entities.filter(function (x) { return x; }); | ||
try { | ||
for (var _b = __values(Object.entries(api.definitions)), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
var _d = __read(_c.value, 2), name_1 = _d[0], definition = _d[1]; | ||
if (definition.enum) { | ||
enums.push({ | ||
name: name_1, | ||
items: definition.enum, | ||
}); | ||
} | ||
else { | ||
var entity = this.parseEntity(name_1, definition); | ||
if (entity) { | ||
var embeddedEnums = entity.properties | ||
.filter(function (x) { return x.type.enumValues; }) | ||
.map(function (x) { | ||
return ({ | ||
name: x.type.name, | ||
items: x.type.enumValues, | ||
}); | ||
}); | ||
enums.push.apply(enums, __spread(embeddedEnums)); | ||
entities.push(entity); | ||
} | ||
} | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
} | ||
return []; | ||
return new apiModel_1.default(entities, enums); | ||
}; | ||
@@ -59,3 +103,3 @@ OpenApi2Parser.prototype.parseEntity = function (name, definition) { | ||
var type = this.parseType(definition); | ||
if (type.isEnum) { | ||
if (type.enumValues) { | ||
type.name = entityName + lodash_1.upperFirst(name); | ||
@@ -93,4 +137,3 @@ } | ||
name: "ENUM", | ||
isEnum: true, | ||
definition: definition.enum.join(constants_1.default.enumSeparator), | ||
enumValues: definition.enum.map(function (x) { return String(x); }), | ||
}; | ||
@@ -101,7 +144,7 @@ } | ||
name: "dateTime", | ||
definition: definition.format, | ||
format: definition.format, | ||
}; | ||
} | ||
if (!typeName) { | ||
console.error("Cannot parse type", definition); | ||
console.error("OpenAPI3 parser cannot parse type. Unknown type: ", definition); | ||
throw new Error("Cannot parse type"); | ||
@@ -111,3 +154,3 @@ } | ||
name: typeName, | ||
definition: definition.format, | ||
format: definition.format, | ||
}; | ||
@@ -114,0 +157,0 @@ }; |
import { OpenAPIV3 } from "openapi-types"; | ||
import Entity from "../models/entity"; | ||
import TypeDefinition from "../models/typeDefinition"; | ||
import ApiModel from "../models/apiModel"; | ||
export default class OpenApi3Parser { | ||
parse(api: OpenAPIV3.Document): Entity[]; | ||
parse(api: OpenAPIV3.Document): ApiModel; | ||
private parseEntity; | ||
@@ -7,0 +7,0 @@ private parseEntityProperty; |
"use strict"; | ||
var __values = (this && this.__values) || function(o) { | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) return m.call(o); | ||
if (o && typeof o.length === "number") return { | ||
next: function () { | ||
if (o && i >= o.length) o = void 0; | ||
return { value: o && o[i++], done: !o }; | ||
} | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
}; | ||
var __read = (this && this.__read) || function (o, n) { | ||
@@ -27,3 +38,2 @@ var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
var lodash_1 = require("lodash"); | ||
var constants_1 = __importDefault(require("../constants")); | ||
var entity_1 = __importDefault(require("../models/entity")); | ||
@@ -33,2 +43,3 @@ var entityProperty_1 = __importDefault(require("../models/entityProperty")); | ||
var helpers_1 = require("./helpers"); | ||
var apiModel_1 = __importDefault(require("../models/apiModel")); | ||
var OpenApi3Parser = (function () { | ||
@@ -38,13 +49,45 @@ function OpenApi3Parser() { | ||
OpenApi3Parser.prototype.parse = function (api) { | ||
var _this = this; | ||
var _a; | ||
if ((_a = api.components) === null || _a === void 0 ? void 0 : _a.schemas) { | ||
var definitions = Object.entries(api.components.schemas); | ||
var entities = definitions.map(function (_a) { | ||
var _b = __read(_a, 2), name = _b[0], definition = _b[1]; | ||
return _this.parseEntity(name, definition); | ||
}); | ||
return entities.filter(function (x) { return x; }); | ||
var e_1, _a; | ||
var _b; | ||
var entities = []; | ||
var enums = []; | ||
if ((_b = api.components) === null || _b === void 0 ? void 0 : _b.schemas) { | ||
try { | ||
for (var _c = __values(Object.entries(api.components.schemas)), _d = _c.next(); !_d.done; _d = _c.next()) { | ||
var _e = __read(_d.value, 2), name_1 = _e[0], definition = _e[1]; | ||
if (helpers_1.isReferenceObject(definition)) { | ||
continue; | ||
} | ||
if (definition.enum) { | ||
enums.push({ | ||
name: name_1, | ||
items: definition.enum, | ||
}); | ||
} | ||
else { | ||
var entity = this.parseEntity(name_1, definition); | ||
if (entity) { | ||
var embeddedEnums = entity.properties | ||
.filter(function (x) { return x.type.enumValues; }) | ||
.map(function (x) { | ||
return ({ | ||
name: x.type.name, | ||
items: x.type.enumValues, | ||
}); | ||
}); | ||
enums.push.apply(enums, __spread(embeddedEnums)); | ||
entities.push(entity); | ||
} | ||
} | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_d && !_d.done && (_a = _c.return)) _a.call(_c); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
} | ||
return []; | ||
return new apiModel_1.default(entities, enums); | ||
}; | ||
@@ -54,3 +97,3 @@ OpenApi3Parser.prototype.parseEntity = function (name, definition) { | ||
var _a; | ||
if (helpers_1.isReferenceObject(definition) || !definition.properties) { | ||
if (!definition.properties) { | ||
return undefined; | ||
@@ -65,3 +108,3 @@ } | ||
var type = this.parseType(definition); | ||
if (type.isEnum) { | ||
if (type.enumValues) { | ||
type.name = entityName + lodash_1.upperFirst(name); | ||
@@ -86,2 +129,3 @@ } | ||
OpenApi3Parser.prototype.parseType = function (definition) { | ||
var _this = this; | ||
if (helpers_1.isReferenceObject(definition)) { | ||
@@ -102,4 +146,3 @@ return { | ||
name: "ENUM", | ||
isEnum: true, | ||
definition: definition.enum.join(constants_1.default.enumSeparator), | ||
enumValues: definition.enum.map(function (x) { return String(x); }), | ||
}; | ||
@@ -110,3 +153,3 @@ } | ||
name: "dateTime", | ||
definition: definition.format, | ||
format: definition.format, | ||
}; | ||
@@ -119,3 +162,15 @@ } | ||
} | ||
console.error("Cannot parse type", definition); | ||
if (definition.oneOf) { | ||
var innerTypes = definition.oneOf.map(function (x) { return _this.parseType(x); }); | ||
if (innerTypes.length === 1) { | ||
return innerTypes[0]; | ||
} | ||
else { | ||
return { | ||
name: innerTypes.map(function (x) { return x.name; }).join(" | "), | ||
innerTypes: innerTypes, | ||
}; | ||
} | ||
} | ||
console.error("OpenAPI3 parser cannot parse type. Unknown type: ", definition); | ||
throw new Error("Cannot parse type"); | ||
@@ -125,3 +180,3 @@ } | ||
name: typeName, | ||
definition: definition.format, | ||
format: definition.format, | ||
}; | ||
@@ -128,0 +183,0 @@ }; |
@@ -18,2 +18,6 @@ "use strict"; | ||
}; | ||
var __spread = (this && this.__spread) || function () { | ||
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); | ||
return ar; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -53,3 +57,7 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
var _this = this; | ||
var requiredImports = definition.properties.filter(function (x) { return x.type.isEntity || x.type.isEnum; }).map(function (x) { return x.type.name; }); | ||
var requiredImports = definition.properties.filter(function (x) { return x.type.isEntity || x.type.enumValues; }).map(function (x) { return x.type.name; }); | ||
requiredImports.push.apply(requiredImports, __spread(definition.properties | ||
.filter(function (x) { return x.type.innerTypes; }) | ||
.flatMap(function (x) { return x.type.innerTypes; }) | ||
.map(function (x) { return x.name; }))); | ||
return this.parentDirectory.createSourceFile(fileName, function (writer) { | ||
@@ -56,0 +64,0 @@ if (requiredImports.length) { |
@@ -9,3 +9,3 @@ import { Directory, SourceFile } from "ts-morph"; | ||
private createFile; | ||
private writeEnumBody; | ||
private writeTypeAlias; | ||
} |
@@ -23,9 +23,4 @@ "use strict"; | ||
var _this = this; | ||
var currentEnum = file.getEnum(definition.name); | ||
if (currentEnum) { | ||
currentEnum.removeText(); | ||
currentEnum.insertText(currentEnum.getEnd() - 1, function (writer) { | ||
return writer.newLineIfLastNot().indent(function () { return _this.writeEnumBody(writer, definition); }); | ||
}); | ||
} | ||
var currentEnum = file.getTypeAliasOrThrow(definition.name); | ||
currentEnum.replaceWithText(function (writer) { return _this.writeTypeAlias(writer, definition); }); | ||
return file; | ||
@@ -36,16 +31,10 @@ }; | ||
return this.parentDirectory.createSourceFile(fileName, function (writer) { | ||
return writer | ||
.writeLine(messages_json_1.entityGeneratedHeader) | ||
.write("const enum ") | ||
.write(definition.name) | ||
.block(function () { return _this.writeEnumBody(writer, definition); }) | ||
.write("export default ") | ||
.write(definition.name) | ||
.write(";") | ||
.newLineIfLastNot(); | ||
writer.writeLine(messages_json_1.entityGeneratedHeader); | ||
_this.writeTypeAlias(writer, definition); | ||
writer.writeLine("export default " + definition.name + ";"); | ||
}, { overwrite: true }); | ||
}; | ||
EnumWriter.prototype.writeEnumBody = function (writer, definition) { | ||
definition.items.forEach(function (x) { return writer.write(x).write(",").newLine(); }); | ||
return writer; | ||
EnumWriter.prototype.writeTypeAlias = function (writer, definition) { | ||
var items = definition.items.map(function (x) { return "\"" + x + "\""; }).join(" | "); | ||
writer.writeLine("type " + definition.name + " = " + items + ";"); | ||
}; | ||
@@ -52,0 +41,0 @@ return EnumWriter; |
@@ -6,3 +6,3 @@ { | ||
}, | ||
"version": "0.15.0-alpha.1", | ||
"version": "0.15.0-alpha.2", | ||
"description": "Frui.ts code generator", | ||
@@ -56,3 +56,3 @@ "keywords": [ | ||
}, | ||
"gitHead": "cacc87f118565a66e67579070fb8186820e097b5" | ||
"gitHead": "c284a116ec1f9f17be366936544e2a07bae554b6" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
182395
99
2051