UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

157 lines 6.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SdkOperationProgrammer = void 0; 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 ImportAnalyzer_1 = require("../analyses/ImportAnalyzer"); 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, generics: p.generics, parameter, index, })), success: writeResponse({ context: p.context, generics: p.generics, type: getReturnType({ checker: p.context.checker, signature: p.context.checker.getSignatureFromDeclaration(p.node), }), }), exceptions: p.exceptions.map((e) => writeResponse({ context: p.context, generics: p.generics, 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; const symbol = props.context.checker.getSymbolAtLocation(props.parameter); const common = writeResponse({ context: props.context, generics: props.generics, type: (_b = props.context.checker.getTypeFromTypeNode((_a = props.parameter.type) !== null && _a !== void 0 ? _a : TypeFactory_1.TypeFactory.keyword("any"))) !== null && _b !== void 0 ? _b : 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: (_c = (symbol && CommentFactory_1.CommentFactory.description(symbol))) !== null && _c !== void 0 ? _c : null, jsDocTags: (_d = symbol === null || symbol === void 0 ? void 0 : symbol.getJsDocTags()) !== null && _d !== void 0 ? _d : [] }); }; const writeResponse = (p) => { const analyzed = p.type ? ImportAnalyzer_1.ImportAnalyzer.analyze(p.context.checker, p.generics, 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), { 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(), }, }; }; 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; }; })(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)}]`; }; //# sourceMappingURL=SdkOperationProgrammer.js.map