UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

188 lines 8.01 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SdkOperationProgrammer = void 0; const typescript_1 = __importDefault(require("typescript")); const CommentFactory_1 = require("typia/lib/factories/CommentFactory"); const MetadataFactory_1 = require("typia/lib/factories/MetadataFactory"); const TypeFactory_1 = require("typia/lib/factories/TypeFactory"); const Escaper_1 = require("typia/lib/utils/Escaper"); const DtoAnalyzer_1 = require("../analyses/DtoAnalyzer"); const MetadataUtil_1 = require("../utils/MetadataUtil"); var SdkOperationProgrammer; (function (SdkOperationProgrammer) { SdkOperationProgrammer.write = (p) => { var _a, _b, _c; return { parameters: p.node.parameters.map((parameter, index) => writeParameter({ context: p.context, imports: p.imports, parameter, index, })), success: writeResponse({ context: p.context, imports: p.imports, typeNode: p.node.type ? getReturnTypeNode(p.node.type) : null, type: getReturnType({ checker: p.context.checker, signature: p.context.checker.getSignatureFromDeclaration(p.node), }), }), exceptions: p.exceptions.map((e) => writeResponse({ context: p.context, imports: p.imports, typeNode: e, type: p.context.checker.getTypeFromTypeNode(e), })), jsDocTags: (_b = (_a = p.symbol) === null || _a === void 0 ? void 0 : _a.getJsDocTags()) !== null && _b !== void 0 ? _b : [], description: p.symbol ? ((_c = CommentFactory_1.CommentFactory.description(p.symbol)) !== null && _c !== void 0 ? _c : null) : null, }; }; const writeParameter = (props) => { var _a, _b, _c, _d, _e; const symbol = props.context.checker.getSymbolAtLocation(props.parameter); const common = writeResponse({ context: props.context, imports: props.imports, typeNode: (_a = props.parameter.type) !== null && _a !== void 0 ? _a : null, type: (_c = props.context.checker.getTypeFromTypeNode((_b = props.parameter.type) !== null && _b !== void 0 ? _b : TypeFactory_1.TypeFactory.keyword("any"))) !== null && _c !== void 0 ? _c : null, }); const optional = props.parameter.questionToken !== undefined; if (common.primitive.success) common.primitive.data.metadata.optional = optional; if (common.resolved.success) common.resolved.data.metadata.optional = optional; return Object.assign(Object.assign({}, common), { name: props.parameter.name.getText(), index: props.index, description: (_d = (symbol && CommentFactory_1.CommentFactory.description(symbol))) !== null && _d !== void 0 ? _d : null, jsDocTags: (_e = symbol === null || symbol === void 0 ? void 0 : symbol.getJsDocTags()) !== null && _e !== void 0 ? _e : [] }); }; const writeResponse = (p) => { const analyzed = p.typeNode ? DtoAnalyzer_1.DtoAnalyzer.analyzeNode({ checker: p.context.checker, imports: p.imports.get(), typeNode: p.typeNode, }) : p.type ? DtoAnalyzer_1.DtoAnalyzer.analyzeType({ checker: p.context.checker, imports: p.imports.get(), type: p.type, }) : { type: { name: "any" }, imports: [], }; const [primitive, resolved] = [true, false].map((escape) => MetadataFactory_1.MetadataFactory.analyze({ checker: p.context.checker, transformer: p.context.transformer, options: { escape, constant: true, absorb: true, }, collection: p.context.collection, type: p.type, })); return Object.assign(Object.assign({}, (analyzed ? analyzed : { imports: [], type: null, })), { primitive: writeSchema({ collection: p.context.collection, result: primitive, }), resolved: writeSchema({ collection: p.context.collection, result: resolved, }) }); }; const writeSchema = (p) => { if (p.result.success === false) return { success: false, errors: p.result.errors.map((e) => ({ name: e.name, accessor: e.explore.object !== null ? join({ object: e.explore.object, key: e.explore.property, }) : null, messages: e.messages, })), }; const visited = iterateVisited(p.result.data); return { success: true, data: { components: { objects: p.collection .objects() .filter((o) => visited.has(o.name)) .map((o) => o.toJSON()), aliases: p.collection .aliases() .filter((a) => visited.has(a.name)) .map((a) => a.toJSON()), arrays: p.collection .arrays() .filter((a) => visited.has(a.name)) .map((a) => a.toJSON()), tuples: p.collection .tuples() .filter((t) => visited.has(t.name)) .map((t) => t.toJSON()), }, metadata: p.result.data.toJSON(), }, }; }; })(SdkOperationProgrammer || (exports.SdkOperationProgrammer = SdkOperationProgrammer = {})); const iterateVisited = (metadata) => { const names = new Set(); MetadataUtil_1.MetadataUtil.visit((m) => { for (const alias of m.aliases) names.add(alias.type.name); for (const array of m.arrays) names.add(array.type.name); for (const tuple of m.tuples) names.add(tuple.type.name); for (const object of m.objects) names.add(object.type.name); })(metadata); return names; }; const join = ({ object, key, }) => { if (key === null) return object.name; else if (typeof key === "object") return `${object.name}[key]`; else if (Escaper_1.Escaper.variable(key)) return `${object.name}.${key}`; return `${object.name}[${JSON.stringify(key)}]`; }; const getReturnTypeNode = (node) => { var _a, _b; if (typescript_1.default.isTypeReferenceNode(node)) { const typeName = node.typeName.getText(); if (typeName === "Promise") return (_b = (_a = node.typeArguments) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null; } return node; }; const getReturnType = (p) => { var _a, _b, _c; const type = (_a = (p.signature && p.checker.getReturnTypeOfSignature(p.signature))) !== null && _a !== void 0 ? _a : null; if (type === null) return null; else if (((_b = type.symbol) === null || _b === void 0 ? void 0 : _b.name) === "Promise") { const generic = p.checker.getTypeArguments(type); return (_c = generic[0]) !== null && _c !== void 0 ? _c : null; } return type; }; //# sourceMappingURL=SdkOperationProgrammer.js.map