Skip to content

Commit cbeb29c

Browse files
committed
feat: Updated library to support latest TypeScript & ts-node
1 parent 1327824 commit cbeb29c

26 files changed

+19678
-324
lines changed

src/declarations/typescript4.7.d.ts

Lines changed: 19157 additions & 0 deletions
Large diffs are not rendered by default.

src/harmony/harmony-factory.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import TS from "typescript";
2+
import { TsTransformPathsContext } from "../types";
3+
import { TsFourSeven, TsThreeEight } from "./versions";
4+
5+
/* ****************************************************************************************************************** */
6+
// region: Types
7+
/* ****************************************************************************************************************** */
8+
9+
export interface HarmonyFactory extends TS.NodeFactory {}
10+
11+
// endregion
12+
13+
/* ****************************************************************************************************************** */
14+
// region: Utilities
15+
/* ****************************************************************************************************************** */
16+
17+
/**
18+
* Creates a node factory compatible with TS v3+
19+
*/
20+
export function createHarmonyFactory(context: TsTransformPathsContext): HarmonyFactory {
21+
return new Proxy(context.tsFactory ?? context.tsInstance, {
22+
get(target, prop) {
23+
if (TsThreeEight.predicate(context)) {
24+
return TsThreeEight.handler(context, prop);
25+
} else if (TsFourSeven.predicate(context)) {
26+
return TsFourSeven.handler(context, prop);
27+
} else {
28+
return (<any>target)[prop];
29+
}
30+
},
31+
}) as HarmonyFactory;
32+
}
33+
34+
// endregion

src/harmony/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./versions";
2+
export * from "./harmony-factory";

src/harmony/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* ****************************************************************************************************************** */
2+
// region: Utility Types
3+
/* ****************************************************************************************************************** */
4+
// @formatter:off
5+
6+
// @prettier-ignore
7+
export type DownSampleTsTypes<TypeMap extends [any, any][], Tuple extends [...unknown[]]> = {
8+
[i in keyof Tuple]: Tuple[i] extends any[]
9+
? DownSampleTsTypes<TypeMap, Tuple[i]>
10+
: DownSampleTsType<TypeMap, Tuple[i]>;
11+
} & {
12+
length: Tuple["length"];
13+
};
14+
15+
// @prettier-ignore
16+
type DownSampleTsType<TypeMap extends [any, any][], T> = T extends Exclude<TypeMap[number][0], undefined>
17+
? Extract<TypeMap[number], [T, any]>[1]
18+
: T;
19+
20+
// @formatter:on
21+
// endregion

src/harmony/versions/four-seven.ts

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/**
2+
* Changes after this point: https://github.com/microsoft/TypeScript/wiki/API-Breaking-Changes#typescript-48
3+
*/
4+
import TsCurrentModule, {
5+
AssertClause,
6+
ExportDeclaration,
7+
Expression,
8+
ImportClause,
9+
ImportDeclaration,
10+
Modifier,
11+
ModuleBody,
12+
ModuleDeclaration,
13+
ModuleName,
14+
NamedExportBindings,
15+
} from "typescript";
16+
import TsFourSevenModule from "../../declarations/typescript4.7";
17+
import { TsTransformPathsContext } from "../../types";
18+
import { DownSampleTsTypes } from "../utils";
19+
20+
/* ****************************************************************************************************************** */
21+
// region: Mapping
22+
/* ****************************************************************************************************************** */
23+
24+
export namespace TsFourSeven {
25+
export type TypeMap = [
26+
[TsCurrentModule.ImportDeclaration, TsFourSevenModule.ImportDeclaration],
27+
[TsCurrentModule.Modifier, TsFourSevenModule.Modifier],
28+
[TsCurrentModule.ImportClause, TsFourSevenModule.ImportClause],
29+
[TsCurrentModule.Expression, TsFourSevenModule.Expression],
30+
[TsCurrentModule.AssertClause, TsFourSevenModule.AssertClause],
31+
[TsCurrentModule.ExportDeclaration, TsFourSevenModule.ExportDeclaration],
32+
[TsCurrentModule.NamedExportBindings, TsFourSevenModule.NamedExportBindings],
33+
[TsCurrentModule.ModuleDeclaration, TsFourSevenModule.ModuleDeclaration],
34+
[TsCurrentModule.ModuleName, TsFourSevenModule.ModuleName],
35+
[TsCurrentModule.ModuleBody, TsFourSevenModule.ModuleBody]
36+
];
37+
}
38+
39+
// endregion
40+
41+
/* ****************************************************************************************************************** */
42+
// region: Utils
43+
/* ****************************************************************************************************************** */
44+
45+
export namespace TsFourSeven {
46+
export const predicate = ({ tsVersionMajor, tsVersionMinor }: TsTransformPathsContext) =>
47+
tsVersionMajor == 4 && tsVersionMinor < 8;
48+
49+
export function handler(context: TsTransformPathsContext, prop: string | symbol) {
50+
const factory = context.tsFactory as unknown as TsFourSevenModule.NodeFactory;
51+
52+
switch (prop) {
53+
case "updateImportDeclaration":
54+
return function (
55+
node: ImportDeclaration,
56+
modifiers: readonly Modifier[] | undefined,
57+
importClause: ImportClause | undefined,
58+
moduleSpecifier: Expression,
59+
assertClause: AssertClause | undefined
60+
) {
61+
const [dsNode, dsImportClause, dsModuleSpecifier, dsAssertClause] = downSample(
62+
node,
63+
importClause,
64+
moduleSpecifier,
65+
assertClause
66+
);
67+
68+
return factory.updateImportDeclaration(
69+
dsNode,
70+
dsNode.decorators,
71+
dsNode.modifiers,
72+
dsImportClause,
73+
dsModuleSpecifier,
74+
dsAssertClause
75+
);
76+
};
77+
case "updateExportDeclaration":
78+
return function (
79+
node: ExportDeclaration,
80+
modifiers: readonly Modifier[] | undefined,
81+
isTypeOnly: boolean,
82+
exportClause: NamedExportBindings | undefined,
83+
moduleSpecifier: Expression | undefined,
84+
assertClause: AssertClause | undefined
85+
) {
86+
const [dsNode, dsExportClause, dsModuleSpecifier, dsAssertClause] = downSample(
87+
node,
88+
exportClause,
89+
moduleSpecifier,
90+
assertClause
91+
);
92+
93+
return factory.updateExportDeclaration(
94+
dsNode,
95+
dsNode.decorators,
96+
dsNode.modifiers,
97+
isTypeOnly,
98+
dsExportClause,
99+
dsModuleSpecifier,
100+
dsAssertClause
101+
);
102+
};
103+
case "updateModuleDeclaration":
104+
return function (
105+
node: ModuleDeclaration,
106+
modifiers: readonly Modifier[] | undefined,
107+
name: ModuleName,
108+
body: ModuleBody | undefined
109+
) {
110+
const [dsNode, dsName, dsBody] = downSample(node, name, body);
111+
112+
return factory.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody);
113+
};
114+
default:
115+
return (...args: any) => (<any>factory)[prop](...args);
116+
}
117+
}
118+
119+
export function downSample<T extends [...unknown[]]>(...args: T): DownSampleTsTypes<TypeMap, T> {
120+
return <any>args;
121+
}
122+
}
123+
124+
// endregion

src/harmony/versions/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./three-eight";
2+
export * from "./four-seven";

src/harmony/versions/three-eight.ts

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
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

Comments
 (0)