@nestia/sdk
Version:
Nestia SDK and Swagger generator
188 lines • 8.01 kB
JavaScript
;
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