UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

173 lines 14.1 kB
"use strict"; 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