UNPKG

@himenon/openapi-typescript-code-generator

Version:
1,607 lines (1,543 loc) 85.2 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/templates.ts var templates_exports = {}; __export(templates_exports, { ClassApiClient: () => class_api_client_exports, CurryingFunctionalApiClient: () => currying_functional_api_client_exports, FunctionalApiClient: () => functional_api_client_exports }); module.exports = __toCommonJS(templates_exports); // src/code-templates/class-api-client/index.ts var class_api_client_exports = {}; __export(class_api_client_exports, { generator: () => generator }); // src/internal/TsGenerator/index.ts var TsGenerator_exports = {}; __export(TsGenerator_exports, { Factory: () => factory_exports, Utils: () => utils_exports, convertAstToTypeScriptCode: () => convertAstToTypeScriptCode, generate: () => generate }); var import_typescript19 = __toESM(require("typescript"), 1); // src/internal/Exception/index.ts var BaseError = class extends Error { constructor(message) { super(message); Object.setPrototypeOf(this, new.target.prototype); } }; var UnSupportError = class extends BaseError { }; var DevelopmentError = class extends BaseError { }; // src/internal/TsGenerator/factory/index.ts var factory_exports = {}; __export(factory_exports, { create: () => create44 }); var import_typescript16 = __toESM(require("typescript"), 1); // src/internal/TsGenerator/factory/ArrowFunction.ts var create = ({ factory }) => (params) => { const node = factory.createArrowFunction( void 0, params.typeParameters, params.parameters, params.type, params.equalsGreaterThanToken, params.body ); return node; }; var make = (context) => { return { create: create(context) }; }; // src/internal/TsGenerator/factory/BinaryExpression.ts var import_typescript = __toESM(require("typescript"), 1); var operators = { "+": import_typescript.default.SyntaxKind.PlusToken, "=": import_typescript.default.SyntaxKind.EqualsToken }; var create2 = ({ factory }) => (params) => { const node = factory.createBinaryExpression(params.left, operators[params.operator], params.right); return node; }; var make2 = (context) => { return { create: create2(context) }; }; // src/internal/TsGenerator/factory/Block.ts var create3 = ({ factory }) => (params) => { const node = factory.createBlock(params.statements, params.multiLine); return node; }; var make3 = (context) => { return { create: create3(context) }; }; // src/internal/TsGenerator/factory/CallExpression.ts var create4 = ({ factory }) => (params) => { const node = factory.createCallExpression(params.expression, params.typeArguments, params.argumentsArray); return node; }; var make4 = (context) => { return { create: create4(context) }; }; // src/internal/TsGenerator/factory/ClassDeclaration.ts var import_typescript2 = __toESM(require("typescript"), 1); var create5 = ({ factory }) => (params) => { const node = factory.createClassDeclaration( params.export && [factory.createModifier(import_typescript2.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(params.name), params.typeParameterDeclaration, void 0, params.members ); return node; }; var make5 = (context) => { return { create: create5(context) }; }; // src/internal/TsGenerator/factory/ConstructorDeclaration.ts var create6 = ({ factory }) => (params) => { const node = factory.createConstructorDeclaration(void 0, params.parameters || [], params.body); return node; }; var make6 = (context) => { return { create: create6(context) }; }; // src/internal/TsGenerator/factory/ElementAccessExpression.ts var create7 = ({ factory }) => (params) => { const index = typeof params.index === "string" ? factory.createStringLiteral(params.index) : params.index; const node = factory.createElementAccessExpression(params.expression, index); return node; }; var make7 = (context) => { return { create: create7(context) }; }; // src/internal/TsGenerator/factory/ExpressionStatement.ts var create8 = ({ factory }) => (params) => { const node = factory.createExpressionStatement(params.expression); return node; }; var make8 = (context) => { return { create: create8(context) }; }; // src/internal/TsGenerator/factory/FunctionTypeNode.ts var create9 = ({ factory }) => (params) => { const node = factory.createFunctionTypeNode(params.typeParameters, params.parameters, params.type); return node; }; var make9 = (context) => { return { create: create9(context) }; }; // src/internal/TsGenerator/factory/Identifier.ts var create10 = ({ factory }) => (params) => { const node = factory.createIdentifier(params.name); return node; }; var make10 = (context) => { return { create: create10(context) }; }; // src/internal/TsGenerator/factory/IndexSignatureDeclaration.ts var import_typescript3 = __toESM(require("typescript"), 1); var create11 = ({ factory }) => (params) => { const node = factory.createIndexSignature( void 0, // TODO Feature Development: Refactoring [ factory.createParameterDeclaration( void 0, void 0, factory.createIdentifier(params.name), void 0, factory.createKeywordTypeNode(import_typescript3.default.SyntaxKind.StringKeyword), void 0 ) ], params.type ); return node; }; var make11 = (context) => { return { create: create11(context) }; }; // src/internal/TsGenerator/factory/IndexedAccessTypeNode.ts var create12 = ({ factory }) => (params) => { const node = factory.createIndexedAccessTypeNode(params.objectType, params.indexType); return node; }; var make12 = (context) => { return { create: create12(context) }; }; // src/internal/TsGenerator/factory/InterfaceDeclaration.ts var import_typescript4 = __toESM(require("typescript"), 1); // src/internal/TsGenerator/factory/utils.ts var import_os = require("os"); var escapeIdentiferText = (text) => { return text.replace(/-/g, "_"); }; var generateComment = (comment, deprecated) => { const excapedComment = comment.replace(/\*\//, "\\*\\\\/").replace(/\/\*/, "/\\\\*").replace(/\*\/\*/, "\\*\\/\\*"); const splitComments = deprecated ? ["@deprecated"].concat(excapedComment.split(/\r?\n/)) : excapedComment.split(/\r?\n/); const comments = splitComments.filter((comment2, index) => { if (index === splitComments.length - 1 && comment2 === "") { return false; } return true; }); if (comments.length === 1) { return { hasTrailingNewLine: true, value: `* ${comments.join("")} ` }; } return { hasTrailingNewLine: true, value: `*${import_os.EOL}${comments.map((comment2) => ` * ${comment2}`).join(import_os.EOL)}${import_os.EOL} ` }; }; // src/internal/TsGenerator/factory/InterfaceDeclaration.ts var create13 = ({ factory }) => (params) => { const node = import_typescript4.default.factory.createInterfaceDeclaration( params.export && [factory.createModifier(import_typescript4.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(escapeIdentiferText(params.name)), params.typeParameters, void 0, params.members ); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript4.default.addSyntheticLeadingComment(node, import_typescript4.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make13 = (context) => { return { create: create13(context) }; }; // src/internal/TsGenerator/factory/IntersectionTypeNode.ts var create14 = ({ factory }) => (params) => { const node = factory.createIntersectionTypeNode(params.typeNodes); return node; }; var make14 = (context) => { return { create: create14(context) }; }; // src/internal/TsGenerator/factory/LiteralTypeNode.ts var import_typescript5 = __toESM(require("typescript"), 1); var create15 = ({ factory }) => (params) => { const createNode = () => { if (typeof params.value === "string") { const literal = import_typescript5.default.setEmitFlags(factory.createStringLiteral(params.value), import_typescript5.default.EmitFlags.NoAsciiEscaping); return factory.createLiteralTypeNode(literal); } if (typeof params.value === "number") { return factory.createLiteralTypeNode(factory.createNumericLiteral(params.value)); } return factory.createLiteralTypeNode(params.value ? factory.createTrue() : factory.createFalse()); }; const node = createNode(); if (params.comment) { const comment = generateComment(params.comment); return import_typescript5.default.addSyntheticLeadingComment(node, import_typescript5.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make15 = (context) => { return { create: create15(context) }; }; // src/internal/TsGenerator/factory/MethodDeclaration.ts var import_typescript6 = __toESM(require("typescript"), 1); var create16 = ({ factory }) => (params) => { const modifiers = []; if (params.private) { modifiers.push(factory.createModifier(import_typescript6.default.SyntaxKind.PrivateKeyword)); } else { modifiers.push(factory.createModifier(import_typescript6.default.SyntaxKind.PublicKeyword)); } if (params.async) { modifiers.push(factory.createModifier(import_typescript6.default.SyntaxKind.AsyncKeyword)); } const node = factory.createMethodDeclaration( modifiers, void 0, factory.createIdentifier(params.name), void 0, params.typeParameters, params.parameters || [], params.type, params.body ); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript6.default.addSyntheticLeadingComment(node, import_typescript6.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make16 = (context) => { return { create: create16(context) }; }; // src/internal/TsGenerator/factory/Namespace.ts var import_typescript7 = __toESM(require("typescript"), 1); // src/internal/TsGenerator/factory/ModuleBlock.ts var update = ({ factory }) => (params) => { const { node, statements } = params; return factory.updateModuleBlock(node, statements); }; // src/internal/TsGenerator/factory/Namespace.ts var findStatement = (_context) => (params) => { let statement; params.node.forEachChild((node) => { if (import_typescript7.default.isModuleDeclaration(node) && node.name.text === params.name) { statement = node; } }); return statement; }; var create17 = ({ factory }) => (params) => { const node = factory.createModuleDeclaration( params.export && [factory.createModifier(import_typescript7.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(params.name), factory.createModuleBlock(params.statements), import_typescript7.default.NodeFlags.Namespace ); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript7.default.addSyntheticLeadingComment(node, import_typescript7.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var createMultiple = (context) => (params) => { const names = params.names.reverse(); const firstName = names[0]; const restNames = names.slice(1, names.length); const child = create17(context)({ export: true, name: firstName, statements: params.statements, comment: params.comment, deprecated: params.deprecated }); return restNames.reduce((previousStatement, currentName) => { return create17(context)({ export: true, name: currentName, statements: [previousStatement] }); }, child); }; var update2 = (context) => (params) => { const { factory } = context; const { node, statements } = params; if (node.body && import_typescript7.default.isModuleBlock(node.body)) { const body = update(context)({ node: node.body, statements }); return factory.updateModuleDeclaration(node, node.modifiers, node.name, body); } return factory.updateModuleDeclaration(node, node.modifiers, node.name, node.body); }; var addStatements = (context) => (params) => { const { factory } = context; const { node, statements } = params; if (node.body && import_typescript7.default.isModuleBlock(node.body)) { const body = update(context)({ node: node.body, statements: node.body.statements.concat(statements) }); return factory.updateModuleDeclaration(node, node.modifiers, node.name, body); } return factory.updateModuleDeclaration(node, node.modifiers, node.name, node.body); }; var make17 = (context) => { return { findNamespace: findStatement(context), create: create17(context), update: update2(context), createMultiple: createMultiple(context), addStatements: addStatements(context) }; }; // src/internal/TsGenerator/factory/NoSubstitutionTemplateLiteral.ts var create18 = ({ factory }) => (params) => { const node = factory.createNoSubstitutionTemplateLiteral(params.text, params.rawText); return node; }; var make18 = (context) => { return { create: create18(context) }; }; // src/internal/TsGenerator/factory/ObjectLiteralExpression.ts var create19 = ({ factory }) => (params) => { const node = factory.createObjectLiteralExpression(params.properties, params.multiLine); return node; }; var make19 = (context) => { return { create: create19(context) }; }; // src/internal/TsGenerator/factory/ParameterDeclaration.ts var import_typescript8 = __toESM(require("typescript"), 1); var create20 = ({ factory }) => (params) => { const modifiers = (() => { if (params.modifiers === "private") { return [factory.createModifier(import_typescript8.default.SyntaxKind.PrivateKeyword)]; } if (params.modifiers === "public") { return [factory.createModifier(import_typescript8.default.SyntaxKind.PublicKeyword)]; } return; })(); const node = factory.createParameterDeclaration( modifiers, void 0, factory.createIdentifier(params.name), params.optional && factory.createToken(import_typescript8.default.SyntaxKind.QuestionToken), params.type, void 0 ); return node; }; var make20 = (context) => { return { create: create20(context) }; }; // src/internal/TsGenerator/factory/PropertyAccessExpression.ts var generateExpression = (factory) => { return { this: factory.createThis() }; }; var create21 = ({ factory }) => (params) => { let expression = typeof params.expression === "string" ? factory.createIdentifier(params.expression) : params.expression; const expressionMap = generateExpression(factory); if (typeof params.expression === "string" && params.expression in expressionMap) { expression = generateExpression(factory)[params.expression]; } const node = factory.createPropertyAccessExpression(expression, factory.createIdentifier(params.name)); return node; }; var make21 = (context) => { return { create: create21(context) }; }; // src/internal/TsGenerator/factory/PropertyAssignment.ts var import_typescript9 = __toESM(require("typescript"), 1); var create22 = ({ factory }) => (params) => { const node = factory.createPropertyAssignment(params.name, params.initializer); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript9.default.addSyntheticLeadingComment(node, import_typescript9.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make22 = (context) => { return { create: create22(context) }; }; // src/internal/TsGenerator/factory/PropertyDeclaration.ts var create23 = ({ factory }) => (params) => { const node = factory.createPropertyDeclaration( params.modifiers, params.name, params.questionOrExclamationToken, params.type, params.initializer ); return node; }; var make23 = (context) => { return { create: create23(context) }; }; // src/internal/TsGenerator/factory/PropertySignature.ts var import_typescript10 = __toESM(require("typescript"), 1); var create24 = ({ factory }) => (params) => { const node = factory.createPropertySignature( params.readOnly ? [factory.createModifier(import_typescript10.default.SyntaxKind.ReadonlyKeyword)] : void 0, params.name, params.optional ? factory.createToken(import_typescript10.default.SyntaxKind.QuestionToken) : void 0, params.type ); if (params.comment) { const comment = generateComment(params.comment); return import_typescript10.default.addSyntheticLeadingComment(node, import_typescript10.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make24 = (context) => { return { create: create24(context) }; }; // src/internal/TsGenerator/factory/RegularExpressionLiteral.ts var create25 = ({ factory }) => (params) => { return factory.createRegularExpressionLiteral(params.text); }; var make25 = (context) => { return { create: create25(context) }; }; // src/internal/TsGenerator/factory/ReturnStatement.ts var create26 = ({ factory }) => (params) => { const node = factory.createReturnStatement(params.expression); return node; }; var make26 = (context) => { return { create: create26(context) }; }; // src/internal/TsGenerator/factory/ShorthandPropertyAssignment.ts var create27 = ({ factory }) => (params) => { const node = factory.createShorthandPropertyAssignment(params.name, void 0); return node; }; var make27 = (context) => { return { create: create27(context) }; }; // src/internal/TsGenerator/factory/StringLiteral.ts var create28 = ({ factory }) => (params) => { const node = factory.createStringLiteral(params.text, params.isSingleQuote); return node; }; var make28 = (context) => { return { create: create28(context) }; }; // src/internal/TsGenerator/factory/TemplateExpression.ts var create29 = ({ factory }) => (params) => { const node = factory.createTemplateExpression(params.head, params.templateSpans); return node; }; var make29 = (context) => { return { create: create29(context) }; }; // src/internal/TsGenerator/factory/TemplateHead.ts var create30 = ({ factory }) => (params) => { const node = factory.createTemplateHead(params.text, params.rawText, void 0); return node; }; var make30 = (context) => { return { create: create30(context) }; }; // src/internal/TsGenerator/factory/TemplateMiddle.ts var create31 = ({ factory }) => (params) => { const node = factory.createTemplateMiddle(params.text, params.rawText, void 0); return node; }; var make31 = (context) => { return { create: create31(context) }; }; // src/internal/TsGenerator/factory/TemplateSpan.ts var create32 = ({ factory }) => (params) => { const node = factory.createTemplateSpan(params.expression, params.literal); return node; }; var make32 = (context) => { return { create: create32(context) }; }; // src/internal/TsGenerator/factory/TemplateTail.ts var create33 = ({ factory }) => (params) => { const node = factory.createTemplateTail(params.text, params.rawText); return node; }; var make33 = (context) => { return { create: create33(context) }; }; // src/internal/TsGenerator/factory/TypeAliasDeclaration.ts var import_typescript11 = __toESM(require("typescript"), 1); var create34 = ({ factory }) => (params) => { const node = factory.createTypeAliasDeclaration( params.export && [factory.createModifier(import_typescript11.default.SyntaxKind.ExportKeyword)], factory.createIdentifier(params.name), void 0, params.type ); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript11.default.addSyntheticLeadingComment(node, import_typescript11.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make34 = (context) => { return { create: create34(context) }; }; // src/internal/TsGenerator/factory/TypeLiteralNode.ts var create35 = ({ factory }) => (params) => { const node = factory.createTypeLiteralNode(params.members); return node; }; var make35 = (context) => { return { create: create35(context) }; }; // src/internal/TsGenerator/factory/TypeNode.ts var import_typescript12 = __toESM(require("typescript"), 1); // src/internal/TsGenerator/factory/UnionTypeNode.ts var create36 = ({ factory }) => (params) => { const node = factory.createUnionTypeNode(params.typeNodes); return node; }; var make36 = (context) => { return { create: create36(context) }; }; // src/internal/TsGenerator/factory/TypeNode.ts var create37 = (context) => (params) => { const { factory } = context; const literalTypeNode = create15(context); const unionTypeNode = create36(context); const createNode = () => { switch (params.type) { case "string": if (params.enum) { return unionTypeNode({ typeNodes: params.enum.map((value) => literalTypeNode({ value })) }); } return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.StringKeyword); case "number": case "integer": if (params.enum) { return unionTypeNode({ typeNodes: params.enum.map((value) => literalTypeNode({ value })) }); } return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.NumberKeyword); case "boolean": { if (params.enum) { return unionTypeNode({ typeNodes: params.enum.map((value) => literalTypeNode({ value })) }); } return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.BooleanKeyword); } case "object": return factory.createTypeLiteralNode(params.value); case "undefined": return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.UndefinedKeyword); case "null": return factory.createLiteralTypeNode(factory.createNull()); case "array": return factory.createArrayTypeNode(params.value); case "never": return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.NeverKeyword); case "void": return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.VoidKeyword); case "any": return factory.createKeywordTypeNode(import_typescript12.default.SyntaxKind.AnyKeyword); default: throw new UnSupportError(`UnSupport Type: ${JSON.stringify(params)}`); } }; const node = createNode(); return node; }; var make37 = (context) => { return { create: create37(context) }; }; // src/internal/TsGenerator/factory/TypeOperatorNode.ts var import_typescript13 = __toESM(require("typescript"), 1); var syntaxKinds = { keyof: import_typescript13.default.SyntaxKind.KeyOfKeyword, unique: import_typescript13.default.SyntaxKind.UniqueKeyword, readonly: import_typescript13.default.SyntaxKind.ReadonlyKeyword }; var create38 = ({ factory }) => (params) => { const node = factory.createTypeOperatorNode(syntaxKinds[params.syntaxKind], params.type); return node; }; var make38 = (context) => { return { create: create38(context) }; }; // src/internal/TsGenerator/factory/TypeParameterDeclaration.ts var create39 = ({ factory }) => (params) => { const node = factory.createTypeParameterDeclaration([], factory.createIdentifier(params.name), params.constraint, params.defaultType); return node; }; var make39 = (context) => { return { create: create39(context) }; }; // src/internal/TsGenerator/factory/TypeReferenceNode.ts var create40 = ({ factory }) => (params) => { const node = factory.createTypeReferenceNode(factory.createIdentifier(params.name), params.typeArguments); return node; }; var make40 = (context) => { return { create: create40(context) }; }; // src/internal/TsGenerator/factory/VariableDeclaration.ts var create41 = ({ factory }) => (params) => { const node = factory.createVariableDeclaration(params.name, void 0, params.type, params.initializer); return node; }; var make41 = (context) => { return { create: create41(context) }; }; // src/internal/TsGenerator/factory/VariableDeclarationList.ts var import_typescript14 = __toESM(require("typescript"), 1); var flags = { const: import_typescript14.default.NodeFlags.Const }; var create42 = ({ factory }) => (params) => { const node = factory.createVariableDeclarationList(params.declarations, flags[params.flag]); return node; }; var make42 = (context) => { return { create: create42(context) }; }; // src/internal/TsGenerator/factory/VariableStatement.ts var import_typescript15 = __toESM(require("typescript"), 1); var create43 = ({ factory }) => (params) => { const node = factory.createVariableStatement(params.modifiers, params.declarationList); if (params.comment) { const comment = generateComment(params.comment, params.deprecated); return import_typescript15.default.addSyntheticLeadingComment(node, import_typescript15.default.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine); } return node; }; var make43 = (context) => { return { create: create43(context) }; }; // src/internal/TsGenerator/factory/index.ts var create44 = () => { const context = { factory: import_typescript16.default.factory }; return { ArrowFunction: make(context), Block: make3(context), ClassDeclaration: make5(context), ParameterDeclaration: make20(context), InterfaceDeclaration: make13(context), IndexedAccessTypeNode: make12(context), Namespace: make17(context), PropertySignature: make24(context), PropertyDeclaration: make23(context), TypeAliasDeclaration: make34(context), TypeNode: make37(context), LiteralTypeNode: make15(context), IndexSignatureDeclaration: make11(context), UnionTypeNode: make36(context), IntersectionTypeNode: make14(context), TypeReferenceNode: make40(context), TypeParameterDeclaration: make39(context), TypeOperatorNode: make38(context), MethodDeclaration: make16(context), ConstructorDeclaration: make6(context), ReturnStatement: make26(context), VariableDeclaration: make41(context), VariableDeclarationList: make42(context), VariableStatement: make43(context), BinaryExpression: make2(context), PropertyAccessExpression: make21(context), RegularExpressionLiteral: make25(context), NoSubstitutionTemplateLiteral: make18(context), TemplateSpan: make32(context), TemplateExpression: make29(context), TemplateHead: make30(context), TemplateMiddle: make31(context), TemplateTail: make33(context), Identifier: make10(context), ShorthandPropertyAssignment: make27(context), PropertyAssignment: make22(context), ObjectLiteralExpression: make19(context), ElementAccessExpression: make7(context), ExpressionStatement: make8(context), CallExpression: make4(context), StringLiteral: make28(context), FunctionTypeNode: make9(context), TypeLiteralNode: make35(context) }; }; // src/internal/TsGenerator/traverse.ts var import_typescript17 = __toESM(require("typescript"), 1); var traverse = (create61) => (context) => (rootNode) => { const visit = (node) => { if (!import_typescript17.default.isSourceFile(node)) { return node; } return context.factory.updateSourceFile( node, create61(context), node.isDeclarationFile, node.referencedFiles, node.typeReferenceDirectives, node.hasNoDefaultLib, node.libReferenceDirectives ); }; return import_typescript17.default.visitNode(rootNode, visit); }; // src/internal/TsGenerator/utils.ts var utils_exports = {}; __export(utils_exports, { convertIntermediateCodes: () => convertIntermediateCodes, stringToStatements: () => stringToStatements }); var import_typescript18 = __toESM(require("typescript"), 1); var stringToStatements = (code) => { const source = import_typescript18.default.createSourceFile("", code, import_typescript18.default.ScriptTarget.ESNext, false, import_typescript18.default.ScriptKind.TS); return Array.from(source.statements); }; var convertIntermediateCodes = (intermediateCodes) => { return intermediateCodes.reduce((result, intermediateCode) => { if (typeof intermediateCode === "string") { return [...result, ...stringToStatements(intermediateCode)]; } return result.concat(intermediateCode); }, []); }; // src/internal/TsGenerator/index.ts var convertAstToTypeScriptCode = (sourceFile) => { const printer = import_typescript19.default.createPrinter(); return printer.printFile(sourceFile); }; var generate = (createFunction) => { const source = import_typescript19.default.createSourceFile("", "", import_typescript19.default.ScriptTarget.ESNext); const transformers = [traverse(createFunction)]; const result = import_typescript19.default.transform(source, transformers); result.dispose(); if (result.transformed.length > 1) { throw new DevelopmentError("Invalid length"); } return convertAstToTypeScriptCode(result.transformed[0]); }; // src/utils.ts var isAvailableVariableName = (text) => { return /^[A-Za-z_0-9]+$/.test(text); }; var isFirstCharacterIsValidText = (text) => { return /^[A-Za-z]+/.test(text); }; var escapeText = (text) => { if (isAvailableVariableName(text) && isFirstCharacterIsValidText(text)) { return text; } return `"${text}"`; }; var escapeText2 = (text) => { if (isAvailableVariableName(text)) { return { escaped: false, text }; } return { escaped: true, text: `"${text}"` }; }; // src/code-templates/_shared/ApiClientArgument.ts var createRequestContentTypeReference = (factory, { convertedParams }) => { return factory.TypeAliasDeclaration.create({ export: true, name: convertedParams.requestContentTypeName, type: factory.TypeOperatorNode.create({ syntaxKind: "keyof", type: factory.TypeReferenceNode.create({ name: convertedParams.requestBodyName }) }) }); }; var createResponseContentTypeReference = (factory, { convertedParams }) => { if (convertedParams.has2OrMoreSuccessResponseContentTypes) { return factory.TypeAliasDeclaration.create({ export: true, name: convertedParams.responseContentTypeName, type: factory.UnionTypeNode.create({ typeNodes: convertedParams.responseSuccessNames.map((item) => { return factory.TypeOperatorNode.create({ syntaxKind: "keyof", type: factory.TypeReferenceNode.create({ name: item }) }); }) }) }); } return factory.TypeAliasDeclaration.create({ export: true, name: convertedParams.responseContentTypeName, type: factory.TypeOperatorNode.create({ syntaxKind: "keyof", type: factory.TypeReferenceNode.create({ name: convertedParams.responseSuccessNames[0] }) }) }); }; var createHeaders = (factory, { convertedParams }) => { const members = []; if (convertedParams.has2OrMoreRequestContentTypes) { members.push( factory.PropertySignature.create({ readOnly: false, name: `"Content-Type"`, optional: false, type: factory.TypeReferenceNode.create({ name: "T" }) }) ); } if (convertedParams.has2OrMoreSuccessResponseContentTypes) { members.push( factory.PropertySignature.create({ readOnly: false, name: "Accept", optional: false, type: factory.TypeReferenceNode.create({ name: "U" }) }) ); } if (members.length === 0) { return void 0; } return factory.TypeLiteralNode.create({ members }); }; var create45 = (factory, params) => { const { convertedParams } = params; const typeParameters = []; const members = []; if (convertedParams.hasRequestBody && convertedParams.has2OrMoreRequestContentTypes) { typeParameters.push( factory.TypeParameterDeclaration.create({ name: "T", constraint: factory.TypeReferenceNode.create({ name: convertedParams.requestContentTypeName }) }) ); } if (convertedParams.has2OrMoreSuccessResponseContentTypes) { typeParameters.push( factory.TypeParameterDeclaration.create({ name: "U", constraint: factory.TypeReferenceNode.create({ name: convertedParams.responseContentTypeName }) }) ); } const headerDeclaration = createHeaders(factory, params); if (headerDeclaration) { const extraHeader = factory.PropertySignature.create({ readOnly: false, name: "headers", optional: false, type: headerDeclaration }); members.push(extraHeader); } if (convertedParams.hasParameter) { const parameter = factory.PropertySignature.create({ readOnly: false, name: "parameter", optional: false, type: factory.TypeReferenceNode.create({ name: convertedParams.parameterName }) }); members.push(parameter); } if (convertedParams.hasRequestBody) { const requestBody = factory.PropertySignature.create({ readOnly: false, name: "requestBody", optional: false, type: factory.IndexedAccessTypeNode.create({ objectType: factory.TypeReferenceNode.create({ name: convertedParams.requestBodyName }), indexType: factory.TypeReferenceNode.create({ name: convertedParams.requestFirstContentType ? `"${convertedParams.requestFirstContentType}"` : "T" }) }) }); members.push(requestBody); } if (members.length === 0) { return; } return factory.InterfaceDeclaration.create({ export: true, name: convertedParams.argumentParamsTypeDeclaration, members, typeParameters }); }; // src/code-templates/_shared/ApiClientInterface.ts var import_typescript20 = __toESM(require("typescript"), 1); var httpMethodList = ["GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD", "PATCH", "TRACE"]; var createErrorResponsesTypeAlias = (typeName, factory, errorResponseNames) => { if (errorResponseNames.length === 0) { return factory.TypeAliasDeclaration.create({ export: true, name: typeName, type: import_typescript20.default.factory.createToken(import_typescript20.default.SyntaxKind.VoidKeyword) }); } return factory.TypeAliasDeclaration.create({ export: true, name: typeName, type: factory.UnionTypeNode.create({ typeNodes: errorResponseNames.map((name) => { return factory.TypeReferenceNode.create({ name }); }) }) }); }; var createSuccessResponseTypeAlias = (typeName, factory, successResponseNames) => { if (successResponseNames.length === 0) { return factory.TypeAliasDeclaration.create({ export: true, name: typeName, type: import_typescript20.default.factory.createToken(import_typescript20.default.SyntaxKind.VoidKeyword) }); } return factory.TypeAliasDeclaration.create({ export: true, name: typeName, type: factory.UnionTypeNode.create({ typeNodes: successResponseNames.map((name) => { return factory.TypeReferenceNode.create({ name }); }) }) }); }; var createHttpMethod = (factory) => { return factory.TypeAliasDeclaration.create({ export: true, name: "HttpMethod", type: factory.TypeNode.create({ type: "string", enum: httpMethodList }) }); }; var createQueryParamsDeclarations = (factory) => { const queryParameterDeclaration = factory.InterfaceDeclaration.create({ export: true, name: "QueryParameter", members: [ factory.PropertySignature.create({ readOnly: false, name: "value", optional: false, type: factory.TypeNode.create({ type: "any" }) }), factory.PropertySignature.create({ readOnly: false, name: "style", optional: true, type: factory.TypeNode.create({ type: "string", enum: ["form", "spaceDelimited", "pipeDelimited", "deepObject"] }) }), factory.PropertySignature.create({ readOnly: false, name: "explode", optional: false, type: factory.TypeNode.create({ type: "boolean" }) }) ] }); const queryParametersDeclaration = factory.InterfaceDeclaration.create({ export: true, name: "QueryParameters", members: [ factory.IndexSignatureDeclaration.create({ name: "key", type: factory.TypeReferenceNode.create({ name: "QueryParameter" }) }) ] }); return [queryParameterDeclaration, queryParametersDeclaration]; }; var createObjectLikeInterface = (factory) => { return factory.InterfaceDeclaration.create({ export: true, name: "ObjectLike", members: [ factory.IndexSignatureDeclaration.create({ name: "key", type: factory.TypeNode.create({ type: "any" }) }) ] }); }; var createEncodingInterface = (factory) => { return factory.InterfaceDeclaration.create({ export: true, name: "Encoding", members: [ factory.PropertySignature.create({ name: "contentType", readOnly: true, optional: true, type: factory.TypeReferenceNode.create({ name: "string" }) }), factory.PropertySignature.create({ name: "headers", readOnly: false, optional: true, type: factory.TypeReferenceNode.create({ name: "Record<string, any>" }) }), factory.PropertySignature.create({ name: "style", readOnly: true, optional: true, type: factory.TypeNode.create({ type: "string", enum: ["form", "spaceDelimited", "pipeDelimited", "deepObject"] }) }), factory.PropertySignature.create({ name: "explode", readOnly: true, optional: true, type: factory.TypeReferenceNode.create({ name: "boolean" }) }), factory.PropertySignature.create({ name: "allowReserved", readOnly: true, optional: true, type: factory.TypeReferenceNode.create({ name: "boolean" }) }) ] }); }; var create46 = (factory, list, methodType, option) => { const objectLikeOrAnyType = factory.UnionTypeNode.create({ typeNodes: [ factory.TypeReferenceNode.create({ name: "ObjectLike" }), factory.TypeNode.create({ type: "any" }) ] }); const encodingInterface = createEncodingInterface(factory); const requestArgs = factory.ParameterDeclaration.create({ name: "requestArgs", type: factory.TypeReferenceNode.create({ name: "RequestArgs" }) }); const options = factory.ParameterDeclaration.create({ name: "options", optional: true, type: factory.TypeReferenceNode.create({ name: "RequestOption" }) }); const successResponseNames = list.flatMap((item) => item.convertedParams.responseSuccessNames); const errorResponseNamespace = factory.Namespace.create({ export: true, name: "ErrorResponse", statements: list.map((item) => { return createErrorResponsesTypeAlias(`${item.convertedParams.escapedOperationId}`, factory, item.convertedParams.responseErrorNames); }) }); const returnType = option.sync ? factory.TypeReferenceNode.create({ name: "T" }) : factory.TypeReferenceNode.create({ name: "Promise", typeArguments: [ factory.TypeReferenceNode.create({ name: "T" }) ] }); const functionType = factory.FunctionTypeNode.create({ typeParameters: [ factory.TypeParameterDeclaration.create({ name: "T", defaultType: factory.TypeReferenceNode.create({ name: "SuccessResponses" }) }) ], parameters: [requestArgs, options], type: returnType }); const requestFunction = factory.PropertySignature.create({ readOnly: false, name: "request", optional: false, type: functionType }); const requestArgsInterfaceDeclaration = factory.InterfaceDeclaration.create({ export: true, name: "RequestArgs", members: [ factory.PropertySignature.create({ name: "httpMethod", readOnly: true, optional: false, type: factory.TypeReferenceNode.create({ name: "HttpMethod" }) }), factory.PropertySignature.create({ name: methodType === "currying-function" ? "uri" : "url", readOnly: true, optional: false, type: factory.TypeReferenceNode.create({ name: "string" }) }), factory.PropertySignature.create({ name: "headers", readOnly: false, optional: false, type: objectLikeOrAnyType }), factory.PropertySignature.create({ name: "requestBody", readOnly: false, optional: true, type: objectLikeOrAnyType }), factory.PropertySignature.create({ name: "requestBodyEncoding", readOnly: false, optional: true, type: factory.TypeReferenceNode.create({ name: "Record<string, Encoding>" }) }), factory.PropertySignature.create({ name: "queryParameters", optional: true, readOnly: false, type: factory.UnionTypeNode.create({ typeNodes: [ factory.TypeReferenceNode.create({ name: "QueryParameters" }), factory.TypeNode.create({ type: "undefined" }) ] }) }) ], typeParameters: [] }); return [ createHttpMethod(factory), createObjectLikeInterface(factory), ...createQueryParamsDeclarations(factory), createSuccessResponseTypeAlias("SuccessResponses", factory, successResponseNames), errorResponseNamespace, encodingInterface, requestArgsInterfaceDeclaration, factory.InterfaceDeclaration.create({ export: true, name: "ApiClient", members: [requestFunction], typeParameters: [ factory.TypeParameterDeclaration.create({ name: "RequestOption" }) ] }) ]; }; // src/code-templates/class-api-client/ApiClientClass/Class.ts var import_typescript21 = __toESM(require("typescript"), 1); var create47 = (factory, members) => { return factory.ClassDeclaration.create({ name: "Client", export: true, members: [ factory.PropertyDeclaration.create({ modifiers: [import_typescript21.default.factory.createModifier(import_typescript21.default.SyntaxKind.PrivateKeyword)], name: "baseUrl", type: import_typescript21.default.factory.createKeywordTypeNode(import_typescript21.default.SyntaxKind.StringKeyword) }), ...members ], typeParameterDeclaration: [ factory.TypeParameterDeclaration.create({ name: "RequestOption" }) ] }); }; // src/code-templates/class-api-client/ApiClientClass/Constructor.ts var create48 = (factory) => { const parameter1 = factory.ParameterDeclaration.create({ modifiers: "private", name: "apiClient", type: factory.TypeReferenceNode.create({ name: "ApiClient", typeArguments: [ factory.TypeReferenceNode.create({ name: "RequestOption" }) ] }) }); const parameter2 = factory.ParameterDeclaration.create({ name: "baseUrl", type: factory.TypeNode.create({ type: "string" }) }); return factory.ConstructorDeclaration.create({ parameters: [parameter1, parameter2], body: factory.Block.create({ statements: [ factory.ExpressionStatement.create({ expression: factory.BinaryExpression.create({ left: factory.PropertyAccessExpression.create({ expression: "this", name: "baseUrl" }), operator: "=", right: factory.CallExpression.create({ expression: factory.PropertyAccessExpression.create({ expression: "baseUrl", name: "replace" }), argumentsArray: [factory.RegularExpressionLiteral.create({ text: "/\\/$/" }), factory.StringLiteral.create({ text: "" })] }) }) }) ], multiLine: false }) }); }; // src/code-templates/class-api-client/ApiClientClass/Method.ts var import_os2 = require("os"); // src/code-templates/_shared/utils.ts var getTemplateSpan = (factory, currentIndex, nextIndex, lastIndex, currentItem, nextItem) => { if (!nextItem) { return [ factory.TemplateSpan.create({ expression: currentItem.value, literal: factory.TemplateTail.create({ text: "" }) }) ]; } if (nextItem.type === "property") { if (lastIndex === nextIndex) { return [ factory.TemplateSpan.create({ expression: currentItem.value, literal: factory.TemplateTail.create({ text: "" }) }), factory.TemplateSpan.create({ expression: nextItem.value, literal: factory.TemplateTail.create({ text: "" }) }) ]; } return [ factory.TemplateSpan.create({ expression: currentItem.value, literal: factory.TemplateTail.create({ text: "" }) }), factory.TemplateSpan.create({ expression: nextItem.value, literal: factory.TemplateMiddle.create({ text: "" }) }) ]; } if (lastIndex === nextIndex) { return [ factory.TemplateSpan.create({ expression: currentItem.value, literal: factory.TemplateTail.create({ text: nextItem.value }) }) ]; } return [ factory.TemplateSpan.create({ expression: currentItem.value, literal: factory.TemplateMiddle.create({ text: nextItem.value }) }) ]; }; var generateTemplateExpression = (factory, list) => { if (list.length === 0) { return factory.NoSubstitutionTemplateLiteral.create({ text: "" }); } const templateHead = factory.TemplateHead.create({ text: list[0].type === "property" ? "" : list[0].value }); const spanList = list.splice(1, list.length); if (spanList.length === 0 && list[0].type === "string") { return factory.NoSubstitutionTemplateLiteral.create({ text: list[0].value }); } const lastIndex = spanList.length - 1; const restValue = lastIndex % 2; let templateSpans = []; for (let i = 0; i <= (lastIndex - restValue) / 2; i++) { if (spanList.length === 0) { continue; } const currentIndex = 2 * i; const nextIndex = 2 * i + 1; const currentItem = spanList[currentIndex]; const nextItem = spanList[nextIndex]; if (currentItem.type === "string") { throw new Error("Logic Error"); } templateSpans = templateSpans.concat(getTemplateSpan(factory, currentIndex, nextIndex, lastIndex, currentItem, nextItem)); } return factory.TemplateExpression.create({ head: templateHead, templateSpans }); }; var splitVariableText = (text) => { const pattern = '["[a-zA-Z_0-9.]+"]'; const splitTexts = text.split(/(\["[a-zA-Z_0-9\\.]+"\])/g); return splitTexts.reduce((splitList, value) => { if (value === "") { return splitList; } if (new RegExp(pattern).test(value)) { const matchedValue = value.match(/[a-zA-Z_0-9\\.]+/); if (matchedValue) { splitList.push({ kind: "element-access", value: matchedValue[0] }); } return splitList; } const dotSplited = value.split("."); const items = dotSplited.map((childValue) => ({ kind: "string", value: childValue })); return splitList.concat(items); }, []); }; var generateVariableIdentifier = (factory, name) => { if (name.startsWith("/")) { throw new Error(`can't start '/'. name=${name}`); } const list = splitVariableText(name); if (list.length === 1) { return factory.Identifier.create({ name }); } const [n1, n2, ...rest] = list; const first = factory.PropertyAccessExpression.create({ expression: n1.value, name: n2.value }); return rest.reduce((previous, current) => { if (current.kind === "string" && isAvailableVariableName(cu