@himenon/openapi-typescript-code-generator
Version:
OpenAPI Code Generator using TypeScript AST.
1 lines • 366 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/internal/TsGenerator/index.ts","../src/internal/Exception/index.ts","../src/internal/TsGenerator/factory/index.ts","../src/internal/TsGenerator/factory/ArrowFunction.ts","../src/internal/TsGenerator/factory/BinaryExpression.ts","../src/internal/TsGenerator/factory/Block.ts","../src/internal/TsGenerator/factory/CallExpression.ts","../src/internal/TsGenerator/factory/ClassDeclaration.ts","../src/internal/TsGenerator/factory/ConstructorDeclaration.ts","../src/internal/TsGenerator/factory/ElementAccessExpression.ts","../src/internal/TsGenerator/factory/ExpressionStatement.ts","../src/internal/TsGenerator/factory/FunctionTypeNode.ts","../src/internal/TsGenerator/factory/Identifier.ts","../src/internal/TsGenerator/factory/IndexSignatureDeclaration.ts","../src/internal/TsGenerator/factory/IndexedAccessTypeNode.ts","../src/internal/TsGenerator/factory/InterfaceDeclaration.ts","../src/internal/TsGenerator/factory/utils.ts","../src/internal/TsGenerator/factory/IntersectionTypeNode.ts","../src/internal/TsGenerator/factory/LiteralTypeNode.ts","../src/internal/TsGenerator/factory/MethodDeclaration.ts","../src/internal/TsGenerator/factory/Namespace.ts","../src/internal/TsGenerator/factory/ModuleBlock.ts","../src/internal/TsGenerator/factory/NoSubstitutionTemplateLiteral.ts","../src/internal/TsGenerator/factory/ObjectLiteralExpression.ts","../src/internal/TsGenerator/factory/ParameterDeclaration.ts","../src/internal/TsGenerator/factory/PropertyAccessExpression.ts","../src/internal/TsGenerator/factory/PropertyAssignment.ts","../src/internal/TsGenerator/factory/PropertyDeclaration.ts","../src/internal/TsGenerator/factory/PropertySignature.ts","../src/internal/TsGenerator/factory/RegularExpressionLiteral.ts","../src/internal/TsGenerator/factory/ReturnStatement.ts","../src/internal/TsGenerator/factory/ShorthandPropertyAssignment.ts","../src/internal/TsGenerator/factory/StringLiteral.ts","../src/internal/TsGenerator/factory/TemplateExpression.ts","../src/internal/TsGenerator/factory/TemplateHead.ts","../src/internal/TsGenerator/factory/TemplateMiddle.ts","../src/internal/TsGenerator/factory/TemplateSpan.ts","../src/internal/TsGenerator/factory/TemplateTail.ts","../src/internal/TsGenerator/factory/TypeAliasDeclaration.ts","../src/internal/TsGenerator/factory/TypeLiteralNode.ts","../src/internal/TsGenerator/factory/TypeNode.ts","../src/internal/TsGenerator/factory/UnionTypeNode.ts","../src/internal/TsGenerator/factory/TypeOperatorNode.ts","../src/internal/TsGenerator/factory/TypeParameterDeclaration.ts","../src/internal/TsGenerator/factory/TypeReferenceNode.ts","../src/internal/TsGenerator/factory/VariableDeclaration.ts","../src/internal/TsGenerator/factory/VariableDeclarationList.ts","../src/internal/TsGenerator/factory/VariableStatement.ts","../src/internal/TsGenerator/traverse.ts","../src/internal/TsGenerator/utils.ts","../src/internal/OpenApiTools/index.ts","../src/internal/OpenApiTools/Comment.ts","../package.json","../src/meta.ts","../src/internal/OpenApiTools/ConverterContext.ts","../src/utils.ts","../src/internal/OpenApiTools/Extractor.ts","../src/internal/OpenApiTools/TypeNodeContext.ts","../node_modules/.pnpm/dot-prop@9.0.0/node_modules/dot-prop/index.js","../src/internal/OpenApiTools/Guard.ts","../src/internal/OpenApiTools/components/Reference.ts","../src/internal/FileSystem/index.ts","../src/internal/Logger/index.ts","../src/internal/OpenApiTools/InferredType.ts","../src/internal/OpenApiTools/toTypeNode.ts","../src/internal/OpenApiTools/Walker/Store.ts","../node_modules/.pnpm/@himenon+path-oriented-data-structure@1.0.2/node_modules/@himenon/path-oriented-data-structure/src/Node.ts","../node_modules/.pnpm/@himenon+path-oriented-data-structure@1.0.2/node_modules/@himenon/path-oriented-data-structure/dist/chunk-CSAU5B4Q.js","../node_modules/.pnpm/@himenon+path-oriented-data-structure@1.0.2/node_modules/@himenon/path-oriented-data-structure/src/Utils.ts","../node_modules/.pnpm/@himenon+path-oriented-data-structure@1.0.2/node_modules/@himenon/path-oriented-data-structure/src/Tree.ts","../node_modules/.pnpm/@himenon+path-oriented-data-structure@1.0.2/node_modules/@himenon/path-oriented-data-structure/src/Operator.ts","../src/internal/OpenApiTools/Walker/Definition.ts","../src/internal/OpenApiTools/Walker/Operation.ts","../src/internal/OpenApiTools/Walker/State.ts","../src/internal/OpenApiTools/Walker/structure/InterfaceNode.ts","../src/internal/OpenApiTools/Walker/structure/NamespaceTree.ts","../src/internal/OpenApiTools/Walker/structure/TypeAliasNode.ts","../src/internal/OpenApiTools/Walker/structure/DataStructure.ts","../src/internal/OpenApiTools/Walker/structure/index.ts","../src/internal/OpenApiTools/Name.ts","../src/internal/OpenApiTools/components/Header.ts","../src/internal/OpenApiTools/components/ExternalDocumentation.ts","../src/internal/OpenApiTools/components/Schema.ts","../src/internal/OpenApiTools/components/Headers.ts","../src/internal/OpenApiTools/components/Parameter.ts","../src/internal/OpenApiTools/components/Parameters.ts","../src/internal/OpenApiTools/components/RequestBodies.ts","../src/internal/OpenApiTools/components/MediaType.ts","../src/internal/OpenApiTools/components/RequestBody.ts","../src/internal/OpenApiTools/components/Responses.ts","../src/internal/OpenApiTools/components/Response.ts","../src/internal/OpenApiTools/components/Schemas.ts","../src/internal/OpenApiTools/components/Operation.ts","../src/internal/OpenApiTools/components/PathItem.ts","../src/internal/OpenApiTools/paths/index.ts","../src/internal/OpenApiTools/Parser.ts","../src/internal/ResolveReference/index.ts","../src/internal/Validator/index.ts","../src/internal/Validator/openapi.json","../src/generateValidRootSchema.ts"],"sourcesContent":["import { EOL } from \"os\";\n\nimport * as Api from \"./api\";\nimport type * as Types from \"./types\";\nimport { generateValidRootSchema } from \"./generateValidRootSchema\";\n\nexport interface Option {\n allowOperationIds?: string[];\n convertOption: Api.OpenApiTools.ConvertContext.Options;\n}\n\nexport class CodeGenerator {\n private rootSchema: Types.OpenApi.Document;\n private resolvedReferenceDocument: Types.OpenApi.Document;\n private parser: Api.OpenApiTools.Parser;\n constructor(\n private readonly entryPointOrDocument: string | Types.OpenApi.Document,\n private option?: Option,\n ) {\n if (typeof entryPointOrDocument === \"string\") {\n this.rootSchema = generateValidRootSchema(Api.FileSystem.loadJsonOrYaml(entryPointOrDocument));\n this.resolvedReferenceDocument = Api.ResolveReference.resolve(\n entryPointOrDocument,\n entryPointOrDocument,\n JSON.parse(JSON.stringify(this.rootSchema)),\n );\n } else {\n this.rootSchema = entryPointOrDocument;\n this.resolvedReferenceDocument = Api.ResolveReference.resolve(\".\", \".\", JSON.parse(JSON.stringify(this.rootSchema)));\n }\n this.parser = this.createParser();\n }\n\n private createParser(): Api.OpenApiTools.Parser {\n const entryPoint = typeof this.entryPointOrDocument === \"string\" ? this.entryPointOrDocument : \".\";\n return new Api.OpenApiTools.Parser(entryPoint, this.rootSchema, this.resolvedReferenceDocument, this.option?.convertOption);\n }\n\n /**\n * Validate the OpenAPI Schema\n */\n public validateOpenApiSchema(option?: Types.Validator.Option) {\n if (!option) {\n Api.Validator.validate(this.resolvedReferenceDocument);\n } else {\n Api.Validator.validate(this.resolvedReferenceDocument, option.logger);\n }\n }\n\n /**\n * Provides TypeScript typedefs generated from OpenAPI Schema.\n *\n * @param generatorTemplate Template for when you want to change the code following a type definition\n * @returns String of generated code\n */\n public generateTypeDefinition(generatorTemplates?: Types.CodeGenerator.CustomGenerator<any>[], allowOperationIds?: string[]): string {\n const create = () => {\n const statements = this.parser.getOpenApiTypeDefinitionStatements();\n generatorTemplates?.forEach(generatorTemplate => {\n const payload = this.parser.getCodeGeneratorParamsArray(allowOperationIds);\n const extraStatements = Api.TsGenerator.Utils.convertIntermediateCodes(generatorTemplate.generator(payload, generatorTemplate.option));\n statements.push(...extraStatements);\n });\n return statements;\n };\n return [Api.OpenApiTools.Comment.generateLeading(this.resolvedReferenceDocument), Api.TsGenerator.generate(create)].join(EOL + EOL + EOL);\n }\n\n /**\n * Generate code using a template\n *\n * @param generatorTemplate\n * @returns String of generated code\n */\n public generateCode(generatorTemplates: Types.CodeGenerator.CustomGenerator<any>[], allowOperationIds?: string[]): string {\n const payload = this.parser.getCodeGeneratorParamsArray(allowOperationIds);\n const create = () => {\n return generatorTemplates.flatMap(generatorTemplate => {\n return Api.TsGenerator.Utils.convertIntermediateCodes(generatorTemplate?.generator(payload, generatorTemplate.option));\n });\n };\n return [Api.OpenApiTools.Comment.generateLeading(this.resolvedReferenceDocument), Api.TsGenerator.generate(create)].join(EOL + EOL + EOL);\n }\n\n /**\n * Provides parameters extracted from OpenApi Schema\n */\n public getCodeGeneratorParamsArray(allowOperationIds?: string[]): Types.CodeGenerator.Params[] {\n return this.parser.getCodeGeneratorParamsArray(allowOperationIds);\n }\n\n /**\n * Provides types for parameters for Templates.FunctionalApiClient.\n *\n * This API will be moved to Templates in the future.\n */\n public getAdditionalTypeDefinitionCustomCodeGenerator(): Types.CodeGenerator.CustomGenerator<undefined> {\n return {\n generator: () => this.parser.getAdditionalTypeStatements(),\n };\n }\n}\n","import ts from \"typescript\";\n\nimport { DevelopmentError } from \"../Exception\";\nimport * as Factory from \"./factory\";\nimport { CreateFunction, traverse } from \"./traverse\";\n\nexport * as Utils from \"./utils\";\n\nexport { type CreateFunction, Factory };\n\nexport type TransformerFactory<T extends ts.Node> = ts.TransformerFactory<T>;\n\nexport const convertAstToTypeScriptCode = (sourceFile: ts.SourceFile): string => {\n const printer = ts.createPrinter(); // AST -> TypeScriptに変換\n return printer.printFile(sourceFile);\n};\n\nexport const generate = (createFunction: CreateFunction): string => {\n const source = ts.createSourceFile(\"\", \"\", ts.ScriptTarget.ESNext);\n const transformers: TransformerFactory<ts.SourceFile>[] = [traverse(createFunction)];\n const result = ts.transform(source, transformers);\n result.dispose();\n if (result.transformed.length > 1) {\n throw new DevelopmentError(\"Invalid length\");\n }\n return convertAstToTypeScriptCode(result.transformed[0]);\n};\n","export abstract class BaseError extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnsetTypeError extends BaseError {}\n\nexport class UnSupportError extends BaseError {}\n\nexport class UnknownError extends BaseError {}\n\nexport class NotFoundFileError extends BaseError {}\n\nexport class NotFoundReference extends BaseError {}\n\nexport class FeatureDevelopmentError extends BaseError {}\n\nexport class SchemaOnlySupportError extends BaseError {}\n\nexport class UndefinedComponent extends BaseError {}\n\nexport class DevelopmentError extends BaseError {}\n","import ts from \"typescript\";\n\nimport * as ArrowFunction from \"./ArrowFunction\";\nimport * as BinaryExpression from \"./BinaryExpression\";\nimport * as Block from \"./Block\";\nimport * as CallExpression from \"./CallExpression\";\nimport * as ClassDeclaration from \"./ClassDeclaration\";\nimport * as ConstructorDeclaration from \"./ConstructorDeclaration\";\nimport * as ElementAccessExpression from \"./ElementAccessExpression\";\nimport * as ExpressionStatement from \"./ExpressionStatement\";\nimport * as FunctionTypeNode from \"./FunctionTypeNode\";\nimport * as Identifier from \"./Identifier\";\nimport * as IndexSignatureDeclaration from \"./IndexSignatureDeclaration\";\nimport * as IndexedAccessTypeNode from \"./IndexedAccessTypeNode\";\nimport * as InterfaceDeclaration from \"./InterfaceDeclaration\";\nimport * as IntersectionTypeNode from \"./IntersectionTypeNode\";\nimport * as LiteralTypeNode from \"./LiteralTypeNode\";\nimport * as MethodDeclaration from \"./MethodDeclaration\";\nimport * as Namespace from \"./Namespace\";\nimport * as NoSubstitutionTemplateLiteral from \"./NoSubstitutionTemplateLiteral\";\nimport * as ObjectLiteralExpression from \"./ObjectLiteralExpression\";\nimport * as ParameterDeclaration from \"./ParameterDeclaration\";\nimport * as PropertyAccessExpression from \"./PropertyAccessExpression\";\nimport * as PropertyAssignment from \"./PropertyAssignment\";\nimport * as PropertyDeclaration from \"./PropertyDeclaration\";\nimport * as PropertySignature from \"./PropertySignature\";\nimport * as RegularExpressionLiteral from \"./RegularExpressionLiteral\";\nimport * as ReturnStatement from \"./ReturnStatement\";\nimport * as ShorthandPropertyAssignment from \"./ShorthandPropertyAssignment\";\nimport * as StringLiteral from \"./StringLiteral\";\nimport * as TemplateExpression from \"./TemplateExpression\";\nimport * as TemplateHead from \"./TemplateHead\";\nimport * as TemplateMiddle from \"./TemplateMiddle\";\nimport * as TemplateSpan from \"./TemplateSpan\";\nimport * as TemplateTail from \"./TemplateTail\";\nimport * as TypeAliasDeclaration from \"./TypeAliasDeclaration\";\nimport * as TypeLiteralNode from \"./TypeLiteralNode\";\nimport * as TypeNode from \"./TypeNode\";\nimport * as TypeOperatorNode from \"./TypeOperatorNode\";\nimport * as TypeParameterDeclaration from \"./TypeParameterDeclaration\";\nimport * as TypeReferenceNode from \"./TypeReferenceNode\";\nimport * as UnionTypeNode from \"./UnionTypeNode\";\nimport * as VariableDeclaration from \"./VariableDeclaration\";\nimport * as VariableDeclarationList from \"./VariableDeclarationList\";\nimport * as VariableStatement from \"./VariableStatement\";\nexport interface Type {\n ArrowFunction: ArrowFunction.Factory;\n Block: Block.Factory;\n ClassDeclaration: ClassDeclaration.Factory;\n InterfaceDeclaration: InterfaceDeclaration.Factory;\n ParameterDeclaration: ParameterDeclaration.Factory;\n IndexedAccessTypeNode: IndexedAccessTypeNode.Factory;\n MethodDeclaration: MethodDeclaration.Factory;\n TypeOperatorNode: TypeOperatorNode.Factory;\n Namespace: Namespace.Factory;\n PropertySignature: PropertySignature.Factory;\n PropertyDeclaration: PropertyDeclaration.Factory;\n RegularExpressionLiteral: RegularExpressionLiteral.Factory;\n TypeAliasDeclaration: TypeAliasDeclaration.Factory;\n TypeNode: TypeNode.Factory;\n LiteralTypeNode: LiteralTypeNode.Factory;\n IndexSignatureDeclaration: IndexSignatureDeclaration.Factory;\n UnionTypeNode: UnionTypeNode.Factory;\n IntersectionTypeNode: IntersectionTypeNode.Factory;\n TypeReferenceNode: TypeReferenceNode.Factory;\n TypeParameterDeclaration: TypeParameterDeclaration.Factory;\n ConstructorDeclaration: ConstructorDeclaration.Factory;\n ReturnStatement: ReturnStatement.Factory;\n VariableDeclaration: VariableDeclaration.Factory;\n VariableDeclarationList: VariableDeclarationList.Factory;\n VariableStatement: VariableStatement.Factory;\n BinaryExpression: BinaryExpression.Factory;\n PropertyAccessExpression: PropertyAccessExpression.Factory;\n NoSubstitutionTemplateLiteral: NoSubstitutionTemplateLiteral.Factory;\n TemplateSpan: TemplateSpan.Factory;\n TemplateExpression: TemplateExpression.Factory;\n TemplateHead: TemplateHead.Factory;\n TemplateMiddle: TemplateMiddle.Factory;\n TemplateTail: TemplateTail.Factory;\n Identifier: Identifier.Factory;\n PropertyAssignment: PropertyAssignment.Factory;\n ObjectLiteralExpression: ObjectLiteralExpression.Factory;\n ElementAccessExpression: ElementAccessExpression.Factory;\n ExpressionStatement: ExpressionStatement.Factory;\n CallExpression: CallExpression.Factory;\n StringLiteral: StringLiteral.Factory;\n FunctionTypeNode: FunctionTypeNode.Factory;\n TypeLiteralNode: TypeLiteralNode.Factory;\n ShorthandPropertyAssignment: ShorthandPropertyAssignment.Factory;\n}\n\nexport const create = (): Type => {\n const context: Pick<ts.TransformationContext, \"factory\"> = {\n factory: ts.factory,\n };\n return {\n ArrowFunction: ArrowFunction.make(context),\n Block: Block.make(context),\n ClassDeclaration: ClassDeclaration.make(context),\n ParameterDeclaration: ParameterDeclaration.make(context),\n InterfaceDeclaration: InterfaceDeclaration.make(context),\n IndexedAccessTypeNode: IndexedAccessTypeNode.make(context),\n Namespace: Namespace.make(context),\n PropertySignature: PropertySignature.make(context),\n PropertyDeclaration: PropertyDeclaration.make(context),\n TypeAliasDeclaration: TypeAliasDeclaration.make(context),\n TypeNode: TypeNode.make(context),\n LiteralTypeNode: LiteralTypeNode.make(context),\n IndexSignatureDeclaration: IndexSignatureDeclaration.make(context),\n UnionTypeNode: UnionTypeNode.make(context),\n IntersectionTypeNode: IntersectionTypeNode.make(context),\n TypeReferenceNode: TypeReferenceNode.make(context),\n TypeParameterDeclaration: TypeParameterDeclaration.make(context),\n TypeOperatorNode: TypeOperatorNode.make(context),\n MethodDeclaration: MethodDeclaration.make(context),\n ConstructorDeclaration: ConstructorDeclaration.make(context),\n ReturnStatement: ReturnStatement.make(context),\n VariableDeclaration: VariableDeclaration.make(context),\n VariableDeclarationList: VariableDeclarationList.make(context),\n VariableStatement: VariableStatement.make(context),\n BinaryExpression: BinaryExpression.make(context),\n PropertyAccessExpression: PropertyAccessExpression.make(context),\n RegularExpressionLiteral: RegularExpressionLiteral.make(context),\n NoSubstitutionTemplateLiteral: NoSubstitutionTemplateLiteral.make(context),\n TemplateSpan: TemplateSpan.make(context),\n TemplateExpression: TemplateExpression.make(context),\n TemplateHead: TemplateHead.make(context),\n TemplateMiddle: TemplateMiddle.make(context),\n TemplateTail: TemplateTail.make(context),\n Identifier: Identifier.make(context),\n ShorthandPropertyAssignment: ShorthandPropertyAssignment.make(context),\n PropertyAssignment: PropertyAssignment.make(context),\n ObjectLiteralExpression: ObjectLiteralExpression.make(context),\n ElementAccessExpression: ElementAccessExpression.make(context),\n ExpressionStatement: ExpressionStatement.make(context),\n CallExpression: CallExpression.make(context),\n StringLiteral: StringLiteral.make(context),\n FunctionTypeNode: FunctionTypeNode.make(context),\n TypeLiteralNode: TypeLiteralNode.make(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n typeParameters: ts.TypeParameterDeclaration[] | undefined;\n parameters: ts.ParameterDeclaration[];\n type?: ts.TypeNode;\n equalsGreaterThanToken?: ts.EqualsGreaterThanToken;\n body: ts.ConciseBody;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ArrowFunction;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ArrowFunction => {\n const node = factory.createArrowFunction(\n undefined,\n params.typeParameters,\n params.parameters,\n params.type,\n params.equalsGreaterThanToken,\n params.body,\n );\n\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nconst operators = {\n \"+\": ts.SyntaxKind.PlusToken,\n \"=\": ts.SyntaxKind.EqualsToken,\n} as const;\n\nexport interface Params {\n left: ts.Expression;\n operator: keyof typeof operators;\n right: ts.Expression;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.BinaryExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.BinaryExpression => {\n const node = factory.createBinaryExpression(params.left, operators[params.operator], params.right);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n statements: readonly ts.Statement[];\n multiLine: boolean;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.Block;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.Block => {\n const node = factory.createBlock(params.statements, params.multiLine);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n expression: ts.Expression;\n typeArguments?: readonly ts.TypeNode[] | undefined;\n argumentsArray: readonly ts.Expression[];\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.CallExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.CallExpression => {\n const node = factory.createCallExpression(params.expression, params.typeArguments, params.argumentsArray);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n name: string;\n export?: true;\n members: readonly ts.ClassElement[];\n typeParameterDeclaration: readonly ts.TypeParameterDeclaration[];\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ClassDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ClassDeclaration => {\n const node = factory.createClassDeclaration(\n params.export && [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(params.name),\n params.typeParameterDeclaration,\n undefined,\n params.members,\n );\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n parameters?: ts.ParameterDeclaration[];\n body?: ts.Block;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ConstructorDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ConstructorDeclaration => {\n const node = factory.createConstructorDeclaration(undefined, params.parameters || [], params.body);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n expression: ts.Expression;\n index: number | string | ts.Expression;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ElementAccessExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ElementAccessExpression => {\n const index = typeof params.index === \"string\" ? factory.createStringLiteral(params.index) : params.index;\n const node = factory.createElementAccessExpression(params.expression, index);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n expression: ts.Expression;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ExpressionStatement;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ExpressionStatement => {\n const node = factory.createExpressionStatement(params.expression);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n typeParameters: readonly ts.TypeParameterDeclaration[] | undefined;\n parameters: readonly ts.ParameterDeclaration[];\n type: ts.TypeNode;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.FunctionTypeNode;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.FunctionTypeNode => {\n const node = factory.createFunctionTypeNode(params.typeParameters, params.parameters, params.type);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n name: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.Identifier;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.Identifier => {\n const node = factory.createIdentifier(params.name);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n name: string;\n type: ts.TypeNode;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.IndexSignatureDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.IndexSignatureDeclaration => {\n const node = factory.createIndexSignature(\n undefined,\n // TODO Feature Development: Refactoring\n [\n factory.createParameterDeclaration(\n undefined,\n undefined,\n factory.createIdentifier(params.name),\n undefined,\n factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n undefined,\n ),\n ],\n params.type,\n );\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n objectType: ts.TypeNode;\n indexType: ts.TypeNode;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.IndexedAccessTypeNode;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.IndexedAccessTypeNode => {\n const node = factory.createIndexedAccessTypeNode(params.objectType, params.indexType);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nimport { escapeIdentiferText, generateComment } from \"./utils\";\n\nexport interface Params$Create {\n export?: true;\n deprecated?: boolean;\n name: string;\n members: readonly ts.TypeElement[];\n typeParameters?: readonly ts.TypeParameterDeclaration[];\n comment?: string;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.InterfaceDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.InterfaceDeclaration => {\n const node = ts.factory.createInterfaceDeclaration(\n params.export && [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(escapeIdentiferText(params.name)),\n params.typeParameters,\n undefined,\n params.members,\n );\n if (params.comment) {\n const comment = generateComment(params.comment, params.deprecated);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import { EOL } from \"os\";\n\nexport interface Comment {\n hasTrailingNewLine: boolean;\n value: string;\n}\n\nexport const isOnlyAlphabetText = (text: string): boolean => {\n return new RegExp(/^[a-zA-Z]+$/).test(text);\n};\n\nexport const escapeIdentiferText = (text: string): string => {\n return text.replace(/-/g, \"_\");\n};\n\nexport const generateComment = (comment: string, deprecated?: boolean): Comment => {\n const excapedComment = comment\n .replace(/\\*\\//, \"\\\\*\\\\\\\\/\") // */ -> \\*\\/\n .replace(/\\/\\*/, \"/\\\\\\\\*\") // /* -> \\/\\*\n .replace(/\\*\\/\\*/, \"\\\\*\\\\/\\\\*\"); // */* -> \\*\\/\\*\n const splitComments = deprecated ? [\"@deprecated\"].concat(excapedComment.split(/\\r?\\n/)) : excapedComment.split(/\\r?\\n/);\n const comments = splitComments.filter((comment, index) => {\n if (index === splitComments.length - 1 && comment === \"\") {\n return false;\n }\n return true;\n });\n if (comments.length === 1) {\n return {\n hasTrailingNewLine: true,\n value: `* ${comments.join(\"\")} `,\n };\n }\n return {\n hasTrailingNewLine: true,\n value: `*${EOL}${comments.map(comment => ` * ${comment}`).join(EOL)}${EOL} `,\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n typeNodes: ts.TypeNode[];\n}\n\nexport interface Factory {\n create: (params: Params) => ts.IntersectionTypeNode;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.IntersectionTypeNode => {\n const node = factory.createIntersectionTypeNode(params.typeNodes);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nimport { generateComment } from \"./utils\";\n\nexport interface Params {\n value: string | boolean | number;\n comment?: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.LiteralTypeNode;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.LiteralTypeNode => {\n const createNode = () => {\n if (typeof params.value === \"string\") {\n const literal = ts.setEmitFlags(factory.createStringLiteral(params.value), ts.EmitFlags.NoAsciiEscaping);\n return factory.createLiteralTypeNode(literal);\n }\n\n if (typeof params.value === \"number\") {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(params.value));\n }\n return factory.createLiteralTypeNode(params.value ? factory.createTrue() : factory.createFalse());\n };\n const node = createNode();\n if (params.comment) {\n const comment = generateComment(params.comment);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nimport { generateComment } from \"./utils\";\n\nexport interface Params$Create {\n name: string;\n async?: boolean;\n private?: boolean;\n typeParameters?: readonly ts.TypeParameterDeclaration[];\n parameters?: ts.ParameterDeclaration[];\n type?: ts.TypeNode;\n body?: ts.Block;\n comment?: string;\n deprecated?: boolean;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.MethodDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.MethodDeclaration => {\n const modifiers: ts.Modifier[] = [];\n if (params.private) {\n modifiers.push(factory.createModifier(ts.SyntaxKind.PrivateKeyword));\n } else {\n modifiers.push(factory.createModifier(ts.SyntaxKind.PublicKeyword));\n }\n if (params.async) {\n modifiers.push(factory.createModifier(ts.SyntaxKind.AsyncKeyword));\n }\n const node = factory.createMethodDeclaration(\n modifiers,\n undefined,\n factory.createIdentifier(params.name),\n undefined,\n params.typeParameters,\n params.parameters || [],\n params.type,\n params.body,\n );\n if (params.comment) {\n const comment = generateComment(params.comment, params.deprecated);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nimport * as ModuleBlock from \"./ModuleBlock\";\nimport { generateComment } from \"./utils\";\n\nexport interface Params$FindStatement {\n node: ts.ModuleDeclaration;\n name: string;\n}\n\nexport interface Params$Create {\n export?: true;\n name: string;\n statements: ts.Statement[];\n comment?: string;\n deprecated?: boolean;\n}\n\nexport interface Params$CreateMulti extends Omit<Params$Create, \"name\"> {\n names: string[];\n}\nexport interface Params$Update {\n node: ts.ModuleDeclaration;\n statements: ts.Statement[];\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ModuleDeclaration;\n findNamespace: (params: Params$FindStatement) => ts.Statement | undefined;\n createMultiple: (params: Params$CreateMulti) => ts.ModuleDeclaration;\n update: (params: Params$Update) => ts.ModuleDeclaration;\n addStatements: (params: Params$Update) => ts.ModuleDeclaration;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport const findStatement =\n (_context: Pick<ts.TransformationContext, \"factory\">): Factory[\"findNamespace\"] =>\n (params: Params$FindStatement): ts.Statement | undefined => {\n let statement: ts.Statement | undefined;\n params.node.forEachChild(node => {\n if (ts.isModuleDeclaration(node) && node.name.text === params.name) {\n statement = node;\n }\n });\n return statement;\n };\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ModuleDeclaration => {\n const node = factory.createModuleDeclaration(\n params.export && [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(params.name),\n factory.createModuleBlock(params.statements),\n ts.NodeFlags.Namespace,\n );\n if (params.comment) {\n const comment = generateComment(params.comment, params.deprecated);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const createMultiple =\n (context: Pick<ts.TransformationContext, \"factory\">): Factory[\"createMultiple\"] =>\n (params: Params$CreateMulti): ts.ModuleDeclaration => {\n const names = params.names.reverse();\n const firstName = names[0];\n const restNames = names.slice(1, names.length);\n const child = create(context)({\n export: true,\n name: firstName,\n statements: params.statements,\n comment: params.comment,\n deprecated: params.deprecated,\n });\n return restNames.reduce<ts.ModuleDeclaration>((previousStatement, currentName) => {\n return create(context)({\n export: true,\n name: currentName,\n statements: [previousStatement],\n });\n }, child);\n };\n\nexport const update =\n (context: Pick<ts.TransformationContext, \"factory\">): Factory[\"update\"] =>\n (params: Params$Update): ts.ModuleDeclaration => {\n const { factory } = context;\n const { node, statements } = params;\n if (node.body && ts.isModuleBlock(node.body)) {\n const body = ModuleBlock.update(context)({ node: node.body, statements });\n return factory.updateModuleDeclaration(node, node.modifiers, node.name, body);\n }\n return factory.updateModuleDeclaration(node, node.modifiers, node.name, node.body);\n };\n\nexport const addStatements =\n (context: Pick<ts.TransformationContext, \"factory\">): Factory[\"addStatements\"] =>\n (params: Params$Update): ts.ModuleDeclaration => {\n const { factory } = context;\n const { node, statements } = params;\n if (node.body && ts.isModuleBlock(node.body)) {\n const body = ModuleBlock.update(context)({ node: node.body, statements: node.body.statements.concat(statements) });\n return factory.updateModuleDeclaration(node, node.modifiers, node.name, body);\n }\n return factory.updateModuleDeclaration(node, node.modifiers, node.name, node.body);\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n findNamespace: findStatement(context),\n create: create(context),\n update: update(context),\n createMultiple: createMultiple(context),\n addStatements: addStatements(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface UpdateParams {\n node: ts.ModuleBlock;\n statements: ts.Statement[];\n}\n\nexport interface Factory {\n update: (params: UpdateParams) => ts.ModuleBlock;\n}\n\nexport const update =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"update\"] =>\n (params: UpdateParams): ts.ModuleBlock => {\n const { node, statements } = params;\n return factory.updateModuleBlock(node, statements);\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n update: update(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n text: string;\n rawText?: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.NoSubstitutionTemplateLiteral;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.NoSubstitutionTemplateLiteral => {\n const node = factory.createNoSubstitutionTemplateLiteral(params.text, params.rawText);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n properties: ts.ObjectLiteralElementLike[];\n multiLine?: boolean;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.ObjectLiteralExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.ObjectLiteralExpression => {\n const node = factory.createObjectLiteralExpression(params.properties, params.multiLine);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n name: string;\n optional?: true;\n modifiers?: \"private\" | \"public\";\n type?: ts.TypeNode;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ParameterDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ParameterDeclaration => {\n const modifiers = (() => {\n if (params.modifiers === \"private\") {\n return [factory.createModifier(ts.SyntaxKind.PrivateKeyword)];\n }\n if (params.modifiers === \"public\") {\n return [factory.createModifier(ts.SyntaxKind.PublicKeyword)];\n }\n return;\n })();\n const node = factory.createParameterDeclaration(\n modifiers,\n undefined,\n factory.createIdentifier(params.name),\n params.optional && factory.createToken(ts.SyntaxKind.QuestionToken),\n params.type,\n undefined,\n );\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nconst generateExpression = (factory: ts.NodeFactory) => {\n return {\n this: factory.createThis(),\n };\n};\n\nexport interface Params$Create {\n expression: string | \"this\" | ts.Expression;\n name: string;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.PropertyAccessExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.PropertyAccessExpression => {\n let expression: ts.Expression = typeof params.expression === \"string\" ? factory.createIdentifier(params.expression) : params.expression;\n const expressionMap = generateExpression(factory);\n if (typeof params.expression === \"string\" && params.expression in expressionMap) {\n expression = generateExpression(factory)[params.expression as \"this\"];\n }\n const node = factory.createPropertyAccessExpression(expression, factory.createIdentifier(params.name));\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\nimport { generateComment } from \"./utils\";\n\nexport interface Params {\n name: string;\n initializer: ts.Expression;\n comment?: string;\n deprecated?: boolean;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.PropertyAssignment;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.PropertyAssignment => {\n const node = factory.createPropertyAssignment(params.name, params.initializer);\n if (params.comment) {\n const comment = generateComment(params.comment, params.deprecated);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n modifiers: readonly ts.Modifier[] | undefined;\n name: string | ts.PropertyName;\n questionOrExclamationToken?: ts.QuestionToken | ts.ExclamationToken | undefined;\n type: ts.TypeNode | undefined;\n initializer?: ts.Expression | undefined;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.PropertyDeclaration;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.PropertyDeclaration => {\n const node = factory.createPropertyDeclaration(\n params.modifiers,\n params.name,\n params.questionOrExclamationToken,\n params.type,\n params.initializer,\n );\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nimport { generateComment } from \"./utils\";\n\nexport interface Params {\n name: string;\n readOnly: boolean;\n optional: boolean;\n type: ts.TypeNode;\n comment?: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.PropertySignature;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.PropertySignature => {\n const node = factory.createPropertySignature(\n params.readOnly ? [factory.createModifier(ts.SyntaxKind.ReadonlyKeyword)] : undefined,\n params.name,\n params.optional ? factory.createToken(ts.SyntaxKind.QuestionToken) : undefined,\n params.type,\n );\n if (params.comment) {\n const comment = generateComment(params.comment);\n return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.value, comment.hasTrailingNewLine);\n }\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n text: string;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.RegularExpressionLiteral;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.RegularExpressionLiteral => {\n return factory.createRegularExpressionLiteral(params.text);\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n expression?: ts.Expression;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ReturnStatement;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ReturnStatement => {\n const node = factory.createReturnStatement(params.expression);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params$Create {\n name: string;\n}\n\nexport interface Factory {\n create: (params: Params$Create) => ts.ShorthandPropertyAssignment;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params$Create): ts.ShorthandPropertyAssignment => {\n const node = factory.createShorthandPropertyAssignment(params.name, undefined);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n text: string;\n isSingleQuote?: boolean;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.StringLiteral;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.StringLiteral => {\n const node = factory.createStringLiteral(params.text, params.isSingleQuote);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n head: ts.TemplateHead;\n templateSpans: readonly ts.TemplateSpan[];\n}\n\nexport interface Factory {\n create: (params: Params) => ts.TemplateExpression;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.TemplateExpression => {\n const node = factory.createTemplateExpression(params.head, params.templateSpans);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n text: string;\n rawText?: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.TemplateHead;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.TemplateHead => {\n const node = factory.createTemplateHead(params.text, params.rawText, undefined);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: create(context),\n };\n};\n","import ts from \"typescript\";\n\nexport interface Params {\n text: string;\n rawText?: string;\n}\n\nexport interface Factory {\n create: (params: Params) => ts.TemplateMiddle;\n}\n\nexport const create =\n ({ factory }: Pick<ts.TransformationContext, \"factory\">): Factory[\"create\"] =>\n (params: Params): ts.TemplateMiddle => {\n const node = factory.createTemplateMiddle(params.text, params.rawText, undefined);\n return node;\n };\n\nexport const make = (context: Pick<ts.TransformationContext, \"factory\">): Factory => {\n return {\n create: