@nestia/sdk
Version:
Nestia SDK and Swagger generator
173 lines • 14.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SdkHttpNamespaceProgrammer = void 0;
const factory_1 = require("@ttsc/factory");
const utils_1 = require("@typia/utils");
const ExpressionFactory_1 = require("../../factories/ExpressionFactory");
const IdentifierFactory_1 = require("../../factories/IdentifierFactory");
const LiteralFactory_1 = require("../../factories/LiteralFactory");
const TypeFactory_1 = require("../../factories/TypeFactory");
const legacy_1 = require("../../internal/legacy");
const FilePrinter_1 = require("./FilePrinter");
const SdkAliasCollection_1 = require("./SdkAliasCollection");
const SdkHttpParameterProgrammer_1 = require("./SdkHttpParameterProgrammer");
const SdkHttpSimulationProgrammer_1 = require("./SdkHttpSimulationProgrammer");
const SdkImportWizard_1 = require("./SdkImportWizard");
var SdkHttpNamespaceProgrammer;
(function (SdkHttpNamespaceProgrammer) {
SdkHttpNamespaceProgrammer.write = (project) => (importer) => (route) => {
const types = writeTypes(project)(importer)(route);
return factory_1.factory.createModuleDeclaration([factory_1.factory.createToken(factory_1.SyntaxKind.ExportKeyword)], factory_1.factory.createIdentifier(route.name), factory_1.factory.createModuleBlock([
...types,
...(types.length ? [FilePrinter_1.FilePrinter.enter()] : []),
writeMetadata(project)(importer)(route),
FilePrinter_1.FilePrinter.enter(),
writePath(project)(importer)(route),
...(project.config.simulate
? [
SdkHttpSimulationProgrammer_1.SdkHttpSimulationProgrammer.random(project)(importer)(route),
SdkHttpSimulationProgrammer_1.SdkHttpSimulationProgrammer.simulate(project)(importer)(route),
]
: []),
...(project.config.json &&
route.body &&
(route.body.contentType === "application/json" ||
route.body.encrypted === true)
? [writeStringify(project)(importer)]
: []),
]), factory_1.NodeFlags.Namespace);
};
const writeTypes = (project) => (importer) => (route) => {
const array = [];
const declare = (name, type) => array.push(factory_1.factory.createTypeAliasDeclaration([factory_1.factory.createModifier(factory_1.SyntaxKind.ExportKeyword)], name, undefined, type));
if (project.config.keyword === true &&
SdkHttpParameterProgrammer_1.SdkHttpParameterProgrammer.getSignificant(route, true).length !== 0)
declare("Props", SdkAliasCollection_1.SdkAliasCollection.httpProps(project)(importer)(route));
if (route.headerObject)
declare("Headers", SdkAliasCollection_1.SdkAliasCollection.headers(project)(importer)(route.headerObject));
if (route.queryObject)
declare("Query", SdkAliasCollection_1.SdkAliasCollection.query(project)(importer)(route.queryObject));
if (route.body)
declare("Body", SdkAliasCollection_1.SdkAliasCollection.body(project)(importer)(route.body));
if (project.config.propagate === true ||
route.success.binary === true ||
(0, legacy_1.sizeOf)(route.success.metadata) !== 0)
declare("Output", SdkAliasCollection_1.SdkAliasCollection.response(project)(importer)(route));
return array;
};
const writeMetadata = (project) => (importer) => (route) => constant("METADATA")(factory_1.factory.createAsExpression(factory_1.factory.createObjectLiteralExpression([
factory_1.factory.createPropertyAssignment("method", factory_1.factory.createStringLiteral(route.method)),
factory_1.factory.createPropertyAssignment("path", factory_1.factory.createStringLiteral(route.path)),
factory_1.factory.createPropertyAssignment("request", route.body
? LiteralFactory_1.LiteralFactory.write(route.body !== undefined
? {
type: route.body.contentType,
encrypted: !!route.body.encrypted,
}
: {
type: "application/json",
encrypted: false,
})
: factory_1.factory.createNull()),
factory_1.factory.createPropertyAssignment("response", route.method !== "HEAD"
? LiteralFactory_1.LiteralFactory.write({
type: route.success.contentType,
encrypted: !!route.success.encrypted,
})
: factory_1.factory.createNull()),
factory_1.factory.createPropertyAssignment("status", route.success.status !== null
? ExpressionFactory_1.ExpressionFactory.number(route.success.status)
: factory_1.factory.createNull()),
...(route.success.contentType ===
"application/x-www-form-urlencoded"
? [
factory_1.factory.createPropertyAssignment("parseQuery", factory_1.factory.createCallExpression(factory_1.factory.createIdentifier(`${SdkImportWizard_1.SdkImportWizard.typia(importer)}.http.createAssertQuery`), [
(project.config.clone === true
? SdkAliasCollection_1.SdkAliasCollection.from(project)(importer)(route.success.metadata)
: SdkAliasCollection_1.SdkAliasCollection.name(route.success)),
], undefined)),
]
: []),
], true), factory_1.factory.createTypeReferenceNode(factory_1.factory.createIdentifier("const"))));
const writePath = (project) => (importer) => (route) => {
const out = (body) => constant("path")(factory_1.factory.createArrowFunction([], [], SdkHttpParameterProgrammer_1.SdkHttpParameterProgrammer.getParameterDeclarations({
project,
importer,
route,
body: false,
prefix: false,
}), undefined, undefined, body));
const parameters = SdkHttpParameterProgrammer_1.SdkHttpParameterProgrammer.getSignificant(route, false);
if (parameters.length === 0)
return out(factory_1.factory.createStringLiteral(route.path));
const access = (name) => project.config.keyword === true ? `props.${name}` : name;
const template = () => {
const split = route.path.split(":");
if (split.length === 1)
return factory_1.factory.createStringLiteral(route.path);
return factory_1.factory.createTemplateExpression(factory_1.factory.createTemplateHead(split[0]), split.slice(1).map((s, i, arr) => {
const name = s.split("/")[0];
return factory_1.factory.createTemplateSpan(factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("encodeURIComponent"), undefined, [
factory_1.factory.createBinaryExpression(factory_1.factory.createCallChain(factory_1.factory.createPropertyAccessChain(factory_1.factory.createIdentifier(access(route.pathParameters.find((p) => p.field === name)
.name)), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionDotToken), "toString"), undefined, undefined, []), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionQuestionToken), factory_1.factory.createStringLiteral("null")),
]), (i !== arr.length - 1
? factory_1.factory.createTemplateMiddle
: factory_1.factory.createTemplateTail)(s.substring(name.length)));
}));
};
if (route.queryObject === null && route.queryParameters.length === 0)
return out(template());
const block = (expr) => {
const computeName = (str) => parameters.find((p) => p.name === str) !== undefined
? computeName("_" + str)
: str;
const variables = computeName("variables");
return factory_1.factory.createBlock([
local(variables)("URLSearchParams")(factory_1.factory.createNewExpression(factory_1.factory.createIdentifier("URLSearchParams"), [], [])),
factory_1.factory.createForOfStatement(undefined, factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(factory_1.factory.createArrayBindingPattern([
factory_1.factory.createBindingElement(undefined, undefined, factory_1.factory.createIdentifier("key"), undefined),
factory_1.factory.createBindingElement(undefined, undefined, factory_1.factory.createIdentifier("value"), undefined),
]), undefined, undefined, undefined),
], factory_1.NodeFlags.Const), factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("Object.entries"), undefined, [factory_1.factory.createAsExpression(expr, TypeFactory_1.TypeFactory.keyword("any"))]), factory_1.factory.createIfStatement(factory_1.factory.createStrictEquality(factory_1.factory.createIdentifier("undefined"), factory_1.factory.createIdentifier("value")), factory_1.factory.createContinueStatement(), factory_1.factory.createIfStatement(factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("Array.isArray"), undefined, [factory_1.factory.createIdentifier("value")]), factory_1.factory.createExpressionStatement(factory_1.factory.createCallExpression(factory_1.factory.createPropertyAccessExpression(factory_1.factory.createIdentifier("value"), factory_1.factory.createIdentifier("forEach")), undefined, [
factory_1.factory.createArrowFunction(undefined, undefined, [IdentifierFactory_1.IdentifierFactory.parameter("elem")], undefined, undefined, factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "append"), undefined, [
factory_1.factory.createIdentifier("key"),
factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("String"), undefined, [factory_1.factory.createIdentifier("elem")]),
])),
])), factory_1.factory.createExpressionStatement(factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "set"), undefined, [
factory_1.factory.createIdentifier("key"),
factory_1.factory.createCallExpression(factory_1.factory.createIdentifier("String"), undefined, [factory_1.factory.createIdentifier("value")]),
]))))),
local("location")("string")(template()),
factory_1.factory.createReturnStatement(factory_1.factory.createConditionalExpression(factory_1.factory.createStrictEquality(ExpressionFactory_1.ExpressionFactory.number(0), IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "size")), undefined, factory_1.factory.createIdentifier("location"), undefined, factory_1.factory.createTemplateExpression(factory_1.factory.createTemplateHead(""), [
factory_1.factory.createTemplateSpan(factory_1.factory.createIdentifier("location"), factory_1.factory.createTemplateMiddle("?")),
factory_1.factory.createTemplateSpan(factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(variables), "toString"), undefined, undefined), factory_1.factory.createTemplateTail("")),
]))),
], true);
};
if (route.queryObject !== null && route.queryParameters.length === 0)
return out(block(route.queryObject.metadata.required === false
? factory_1.factory.createBinaryExpression(factory_1.factory.createIdentifier(route.queryObject.name), factory_1.factory.createToken(factory_1.SyntaxKind.QuestionQuestionToken), factory_1.factory.createObjectLiteralExpression([], false))
: factory_1.factory.createIdentifier(access(route.queryObject.name))));
return out(block(factory_1.factory.createObjectLiteralExpression([
...(route.queryObject
? [
factory_1.factory.createSpreadAssignment(factory_1.factory.createIdentifier(access(route.queryObject.name))),
]
: []),
...route.queryParameters.map((q) => factory_1.factory.createPropertyAssignment(utils_1.NamingConvention.variable(q.field)
? q.field
: factory_1.factory.createStringLiteral(q.field), factory_1.factory.createIdentifier(access(q.name)))),
], true)));
};
const writeStringify = (project) => (importer) => constant("stringify")(factory_1.factory.createArrowFunction([], undefined, [
IdentifierFactory_1.IdentifierFactory.parameter("input", factory_1.factory.createTypeReferenceNode("Body")),
], undefined, undefined, factory_1.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(IdentifierFactory_1.IdentifierFactory.access(factory_1.factory.createIdentifier(SdkImportWizard_1.SdkImportWizard.typia(importer)), "json"), project.config.assert ? "stringify" : "assertStringify"), undefined, [factory_1.factory.createIdentifier("input")])));
})(SdkHttpNamespaceProgrammer || (exports.SdkHttpNamespaceProgrammer = SdkHttpNamespaceProgrammer = {}));
const local = (name) => (type) => (expression) => factory_1.factory.createVariableStatement([], factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(name, undefined, factory_1.factory.createTypeReferenceNode(type), expression),
], factory_1.NodeFlags.Const));
const constant = (name) => (expression) => factory_1.factory.createVariableStatement([factory_1.factory.createModifier(factory_1.SyntaxKind.ExportKeyword)], factory_1.factory.createVariableDeclarationList([
factory_1.factory.createVariableDeclaration(name, undefined, undefined, expression),
], factory_1.NodeFlags.Const));
//# sourceMappingURL=SdkHttpNamespaceProgrammer.js.map