|
| 1 | +/** |
| 2 | + * Changes after this point: https://github.com/microsoft/TypeScript/wiki/API-Breaking-Changes#typescript-40 |
| 3 | + */ |
| 4 | +import TsCurrentModule, { |
| 5 | + EntityName, |
| 6 | + ExportDeclaration, |
| 7 | + Expression, |
| 8 | + Identifier, |
| 9 | + ImportClause, |
| 10 | + ImportDeclaration, |
| 11 | + ImportTypeAssertionContainer, |
| 12 | + ImportTypeNode, |
| 13 | + Modifier, |
| 14 | + ModuleBody, |
| 15 | + ModuleDeclaration, |
| 16 | + ModuleName, |
| 17 | + NamedExportBindings, |
| 18 | + NamedImportBindings, |
| 19 | + TypeNode, |
| 20 | +} from "typescript"; |
| 21 | +import * as TsThreeEightModule from "../../declarations/typescript3"; |
| 22 | +import { TsTransformPathsContext } from "../../types"; |
| 23 | +import { DownSampleTsTypes } from "../utils"; |
| 24 | + |
| 25 | +/* ****************************************************************************************************************** */ |
| 26 | +// region: Mapping |
| 27 | +/* ****************************************************************************************************************** */ |
| 28 | + |
| 29 | +export namespace TsThreeEight { |
| 30 | + export type TypeMap = [ |
| 31 | + [TsCurrentModule.SourceFile, TsThreeEightModule.SourceFile], |
| 32 | + [TsCurrentModule.StringLiteral, TsThreeEightModule.StringLiteral], |
| 33 | + [TsCurrentModule.CompilerOptions, TsThreeEightModule.CompilerOptions], |
| 34 | + [TsCurrentModule.EmitResolver, TsThreeEightModule.EmitResolver], |
| 35 | + [TsCurrentModule.CallExpression, TsThreeEightModule.CallExpression], |
| 36 | + [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], |
| 37 | + [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], |
| 38 | + [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], |
| 39 | + [TsCurrentModule.ImportTypeNode, TsThreeEightModule.ImportTypeNode], |
| 40 | + [TsCurrentModule.EntityName, TsThreeEightModule.EntityName], |
| 41 | + [TsCurrentModule.TypeNode, TsThreeEightModule.TypeNode], |
| 42 | + [readonly TsCurrentModule.TypeNode[], readonly TsThreeEightModule.TypeNode[]], |
| 43 | + [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], |
| 44 | + [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], |
| 45 | + [TsCurrentModule.ImportClause, TsThreeEightModule.ImportClause], |
| 46 | + [TsCurrentModule.Identifier, TsThreeEightModule.Identifier], |
| 47 | + [TsCurrentModule.NamedImportBindings, TsThreeEightModule.NamedImportBindings], |
| 48 | + [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], |
| 49 | + [TsCurrentModule.ExportDeclaration, TsThreeEightModule.ExportDeclaration], |
| 50 | + [TsCurrentModule.ModuleDeclaration, TsThreeEightModule.ModuleDeclaration], |
| 51 | + [TsCurrentModule.Expression, TsThreeEightModule.Expression], |
| 52 | + [TsCurrentModule.ModuleBody, TsThreeEightModule.ModuleBody], |
| 53 | + [TsCurrentModule.ModuleName, TsThreeEightModule.ModuleName], |
| 54 | + [TsCurrentModule.ExportDeclaration["exportClause"], TsThreeEightModule.ExportDeclaration["exportClause"]] |
| 55 | + ]; |
| 56 | +} |
| 57 | + |
| 58 | +// endregion |
| 59 | + |
| 60 | +/* ****************************************************************************************************************** */ |
| 61 | +// region: Utils |
| 62 | +/* ****************************************************************************************************************** */ |
| 63 | + |
| 64 | +export namespace TsThreeEight { |
| 65 | + export const predicate = (context: TsTransformPathsContext) => context.tsVersionMajor < 4; |
| 66 | + |
| 67 | + export function handler(context: TsTransformPathsContext, prop: string | symbol) { |
| 68 | + const ts = context.tsInstance as unknown as typeof TsThreeEightModule; |
| 69 | + |
| 70 | + switch (prop) { |
| 71 | + case "updateCallExpression": |
| 72 | + return (...args: any) => ts.updateCall.apply(void 0, args); |
| 73 | + case "updateImportClause": |
| 74 | + return function ( |
| 75 | + node: ImportClause, |
| 76 | + isTypeOnly: boolean, |
| 77 | + name: Identifier | undefined, |
| 78 | + namedBindings: NamedImportBindings | undefined |
| 79 | + ) { |
| 80 | + return ts.updateImportClause.apply(void 0, downSample(node, name, namedBindings)); |
| 81 | + }; |
| 82 | + case "updateImportDeclaration": |
| 83 | + return function ( |
| 84 | + node: ImportDeclaration, |
| 85 | + modifiers: readonly Modifier[] | undefined, |
| 86 | + importClause: ImportClause | undefined, |
| 87 | + moduleSpecifier: Expression |
| 88 | + ) { |
| 89 | + const [dsNode, dsImportClause, dsModuleSpecifier] = downSample(node, importClause, moduleSpecifier); |
| 90 | + |
| 91 | + return ts.updateImportDeclaration( |
| 92 | + dsNode, |
| 93 | + dsNode.decorators, |
| 94 | + dsNode.modifiers, |
| 95 | + dsImportClause, |
| 96 | + dsModuleSpecifier |
| 97 | + ); |
| 98 | + }; |
| 99 | + case "updateExportDeclaration": |
| 100 | + return function ( |
| 101 | + node: ExportDeclaration, |
| 102 | + modifiers: readonly Modifier[] | undefined, |
| 103 | + isTypeOnly: boolean, |
| 104 | + exportClause: NamedExportBindings | undefined, |
| 105 | + moduleSpecifier: Expression | undefined |
| 106 | + ) { |
| 107 | + const [dsNode, dsModuleSpecifier, dsExportClause] = downSample(node, moduleSpecifier, exportClause); |
| 108 | + return ts.updateExportDeclaration( |
| 109 | + dsNode, |
| 110 | + dsNode.decorators, |
| 111 | + dsNode.modifiers, |
| 112 | + dsExportClause, |
| 113 | + dsModuleSpecifier, |
| 114 | + // @ts-ignore - This was added in later versions of 3.x |
| 115 | + dsNode.isTypeOnly |
| 116 | + ); |
| 117 | + }; |
| 118 | + case "updateModuleDeclaration": |
| 119 | + return function ( |
| 120 | + node: ModuleDeclaration, |
| 121 | + modifiers: readonly Modifier[] | undefined, |
| 122 | + name: ModuleName, |
| 123 | + body: ModuleBody | undefined |
| 124 | + ) { |
| 125 | + const [dsNode, dsName, dsBody] = downSample(node, name, body); |
| 126 | + |
| 127 | + return ts.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody); |
| 128 | + }; |
| 129 | + case "updateImportTypeNode": |
| 130 | + return function ( |
| 131 | + node: ImportTypeNode, |
| 132 | + argument: TypeNode, |
| 133 | + assertions: ImportTypeAssertionContainer | undefined, |
| 134 | + qualifier: EntityName | undefined, |
| 135 | + typeArguments: readonly TypeNode[] | undefined, |
| 136 | + isTypeOf?: boolean |
| 137 | + ) { |
| 138 | + const [dsNode, dsArgument, dsQualifier, dsTypeArguments] = downSample( |
| 139 | + node, |
| 140 | + argument, |
| 141 | + qualifier, |
| 142 | + typeArguments |
| 143 | + ); |
| 144 | + |
| 145 | + return ts.updateImportTypeNode(dsNode, dsArgument, dsQualifier, dsTypeArguments, isTypeOf); |
| 146 | + }; |
| 147 | + default: |
| 148 | + return (...args: any) => (<any>ts)[prop](...args); |
| 149 | + } |
| 150 | + } |
| 151 | + |
| 152 | + export function downSample<T extends [...unknown[]]>(...args: T): DownSampleTsTypes<TypeMap, T> { |
| 153 | + return <any>args; |
| 154 | + } |
| 155 | +} |
| 156 | + |
| 157 | +// endregion |
0 commit comments