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