From a68654c57a0617e515e55967a455fffa9fade1a3 Mon Sep 17 00:00:00 2001 From: Daniel Perez Alvarez Date: Thu, 8 Aug 2024 01:44:59 -0400 Subject: [PATCH 1/4] refact: remove namespaces in favor of modules --- src/harmony/versions/four-seven.ts | 164 ++++++++++----------- src/harmony/versions/index.ts | 4 +- src/harmony/versions/three-eight.ts | 217 +++++++++++++--------------- 3 files changed, 186 insertions(+), 199 deletions(-) diff --git a/src/harmony/versions/four-seven.ts b/src/harmony/versions/four-seven.ts index 6d0d9f67..5e743e2f 100644 --- a/src/harmony/versions/four-seven.ts +++ b/src/harmony/versions/four-seven.ts @@ -21,20 +21,18 @@ import { DownSampleTsTypes } from "../utils"; // region: Mapping /* ****************************************************************************************************************** */ -export namespace TsFourSeven { - export type TypeMap = [ - [TsCurrentModule.ImportDeclaration, TsFourSevenModule.ImportDeclaration], - [TsCurrentModule.Modifier, TsFourSevenModule.Modifier], - [TsCurrentModule.ImportClause, TsFourSevenModule.ImportClause], - [TsCurrentModule.Expression, TsFourSevenModule.Expression], - [TsCurrentModule.AssertClause, TsFourSevenModule.AssertClause], - [TsCurrentModule.ExportDeclaration, TsFourSevenModule.ExportDeclaration], - [TsCurrentModule.NamedExportBindings, TsFourSevenModule.NamedExportBindings], - [TsCurrentModule.ModuleDeclaration, TsFourSevenModule.ModuleDeclaration], - [TsCurrentModule.ModuleName, TsFourSevenModule.ModuleName], - [TsCurrentModule.ModuleBody, TsFourSevenModule.ModuleBody], - ]; -} +export type TypeMap = [ + [TsCurrentModule.ImportDeclaration, TsFourSevenModule.ImportDeclaration], + [TsCurrentModule.Modifier, TsFourSevenModule.Modifier], + [TsCurrentModule.ImportClause, TsFourSevenModule.ImportClause], + [TsCurrentModule.Expression, TsFourSevenModule.Expression], + [TsCurrentModule.AssertClause, TsFourSevenModule.AssertClause], + [TsCurrentModule.ExportDeclaration, TsFourSevenModule.ExportDeclaration], + [TsCurrentModule.NamedExportBindings, TsFourSevenModule.NamedExportBindings], + [TsCurrentModule.ModuleDeclaration, TsFourSevenModule.ModuleDeclaration], + [TsCurrentModule.ModuleName, TsFourSevenModule.ModuleName], + [TsCurrentModule.ModuleBody, TsFourSevenModule.ModuleBody], +]; // endregion @@ -42,83 +40,81 @@ export namespace TsFourSeven { // region: Utils /* ****************************************************************************************************************** */ -export namespace TsFourSeven { - export const predicate = ({ tsVersionMajor, tsVersionMinor }: TsTransformPathsContext) => - tsVersionMajor == 4 && tsVersionMinor < 8; +export const predicate = ({ tsVersionMajor, tsVersionMinor }: TsTransformPathsContext) => + tsVersionMajor == 4 && tsVersionMinor < 8; - export function handler(context: TsTransformPathsContext, prop: string | symbol) { - const factory = context.tsFactory as unknown as TsFourSevenModule.NodeFactory; +export function handler(context: TsTransformPathsContext, prop: string | symbol) { + const factory = context.tsFactory as unknown as TsFourSevenModule.NodeFactory; - switch (prop) { - case "updateImportDeclaration": - return function ( - node: ImportDeclaration, - modifiers: readonly Modifier[] | undefined, - importClause: ImportClause | undefined, - moduleSpecifier: Expression, - assertClause: AssertClause | undefined, - ) { - const [dsNode, dsImportClause, dsModuleSpecifier, dsAssertClause] = downSample( - node, - importClause, - moduleSpecifier, - assertClause, - ); + switch (prop) { + case "updateImportDeclaration": + return function ( + node: ImportDeclaration, + modifiers: readonly Modifier[] | undefined, + importClause: ImportClause | undefined, + moduleSpecifier: Expression, + assertClause: AssertClause | undefined, + ) { + const [dsNode, dsImportClause, dsModuleSpecifier, dsAssertClause] = downSample( + node, + importClause, + moduleSpecifier, + assertClause, + ); - return factory.updateImportDeclaration( - dsNode, - dsNode.decorators, - dsNode.modifiers, - dsImportClause, - dsModuleSpecifier, - dsAssertClause, - ); - }; - case "updateExportDeclaration": - return function ( - node: ExportDeclaration, - modifiers: readonly Modifier[] | undefined, - isTypeOnly: boolean, - exportClause: NamedExportBindings | undefined, - moduleSpecifier: Expression | undefined, - assertClause: AssertClause | undefined, - ) { - const [dsNode, dsExportClause, dsModuleSpecifier, dsAssertClause] = downSample( - node, - exportClause, - moduleSpecifier, - assertClause, - ); + return factory.updateImportDeclaration( + dsNode, + dsNode.decorators, + dsNode.modifiers, + dsImportClause, + dsModuleSpecifier, + dsAssertClause, + ); + }; + case "updateExportDeclaration": + return function ( + node: ExportDeclaration, + modifiers: readonly Modifier[] | undefined, + isTypeOnly: boolean, + exportClause: NamedExportBindings | undefined, + moduleSpecifier: Expression | undefined, + assertClause: AssertClause | undefined, + ) { + const [dsNode, dsExportClause, dsModuleSpecifier, dsAssertClause] = downSample( + node, + exportClause, + moduleSpecifier, + assertClause, + ); - return factory.updateExportDeclaration( - dsNode, - dsNode.decorators, - dsNode.modifiers, - isTypeOnly, - dsExportClause, - dsModuleSpecifier, - dsAssertClause, - ); - }; - case "updateModuleDeclaration": - return function ( - node: ModuleDeclaration, - modifiers: readonly Modifier[] | undefined, - name: ModuleName, - body: ModuleBody | undefined, - ) { - const [dsNode, dsName, dsBody] = downSample(node, name, body); + return factory.updateExportDeclaration( + dsNode, + dsNode.decorators, + dsNode.modifiers, + isTypeOnly, + dsExportClause, + dsModuleSpecifier, + dsAssertClause, + ); + }; + case "updateModuleDeclaration": + return function ( + node: ModuleDeclaration, + modifiers: readonly Modifier[] | undefined, + name: ModuleName, + body: ModuleBody | undefined, + ) { + const [dsNode, dsName, dsBody] = downSample(node, name, body); - return factory.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody); - }; - default: - return (...args: any) => (factory)[prop](...args); - } + return factory.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody); + }; + default: + return (...args: any) => (factory)[prop](...args); } +} - export function downSample(...args: T): DownSampleTsTypes { - return args; - } +export function downSample(...args: T): DownSampleTsTypes { + return args; } // endregion diff --git a/src/harmony/versions/index.ts b/src/harmony/versions/index.ts index fadb3c34..4fcadcde 100644 --- a/src/harmony/versions/index.ts +++ b/src/harmony/versions/index.ts @@ -1,2 +1,2 @@ -export * from "./three-eight"; -export * from "./four-seven"; +export * as TsThreeEight from "./three-eight"; +export * as TsFourSeven from "./four-seven"; diff --git a/src/harmony/versions/three-eight.ts b/src/harmony/versions/three-eight.ts index 9a99ae34..9684bb75 100644 --- a/src/harmony/versions/three-eight.ts +++ b/src/harmony/versions/three-eight.ts @@ -18,7 +18,7 @@ import TsCurrentModule, { NamedImportBindings, TypeNode, } from "typescript"; -import * as TsThreeEightModule from "../../declarations/typescript3"; +import type TsThreeEightModule from "../../declarations/typescript3"; import { TsTransformPathsContext } from "../../types"; import { DownSampleTsTypes } from "../utils"; @@ -26,34 +26,32 @@ import { DownSampleTsTypes } from "../utils"; // region: Mapping /* ****************************************************************************************************************** */ -export namespace TsThreeEight { - export type TypeMap = [ - [TsCurrentModule.SourceFile, TsThreeEightModule.SourceFile], - [TsCurrentModule.StringLiteral, TsThreeEightModule.StringLiteral], - [TsCurrentModule.CompilerOptions, TsThreeEightModule.CompilerOptions], - [TsCurrentModule.EmitResolver, TsThreeEightModule.EmitResolver], - [TsCurrentModule.CallExpression, TsThreeEightModule.CallExpression], - [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], - [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], - [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], - [TsCurrentModule.ImportTypeNode, TsThreeEightModule.ImportTypeNode], - [TsCurrentModule.EntityName, TsThreeEightModule.EntityName], - [TsCurrentModule.TypeNode, TsThreeEightModule.TypeNode], - [readonly TsCurrentModule.TypeNode[], readonly TsThreeEightModule.TypeNode[]], - [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], - [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], - [TsCurrentModule.ImportClause, TsThreeEightModule.ImportClause], - [TsCurrentModule.Identifier, TsThreeEightModule.Identifier], - [TsCurrentModule.NamedImportBindings, TsThreeEightModule.NamedImportBindings], - [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], - [TsCurrentModule.ExportDeclaration, TsThreeEightModule.ExportDeclaration], - [TsCurrentModule.ModuleDeclaration, TsThreeEightModule.ModuleDeclaration], - [TsCurrentModule.Expression, TsThreeEightModule.Expression], - [TsCurrentModule.ModuleBody, TsThreeEightModule.ModuleBody], - [TsCurrentModule.ModuleName, TsThreeEightModule.ModuleName], - [TsCurrentModule.ExportDeclaration["exportClause"], TsThreeEightModule.ExportDeclaration["exportClause"]], - ]; -} +export type TypeMap = [ + [TsCurrentModule.SourceFile, TsThreeEightModule.SourceFile], + [TsCurrentModule.StringLiteral, TsThreeEightModule.StringLiteral], + [TsCurrentModule.CompilerOptions, TsThreeEightModule.CompilerOptions], + [TsCurrentModule.EmitResolver, TsThreeEightModule.EmitResolver], + [TsCurrentModule.CallExpression, TsThreeEightModule.CallExpression], + [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], + [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], + [TsCurrentModule.ExternalModuleReference, TsThreeEightModule.ExternalModuleReference], + [TsCurrentModule.ImportTypeNode, TsThreeEightModule.ImportTypeNode], + [TsCurrentModule.EntityName, TsThreeEightModule.EntityName], + [TsCurrentModule.TypeNode, TsThreeEightModule.TypeNode], + [readonly TsCurrentModule.TypeNode[], readonly TsThreeEightModule.TypeNode[]], + [TsCurrentModule.LiteralTypeNode, TsThreeEightModule.LiteralTypeNode], + [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], + [TsCurrentModule.ImportClause, TsThreeEightModule.ImportClause], + [TsCurrentModule.Identifier, TsThreeEightModule.Identifier], + [TsCurrentModule.NamedImportBindings, TsThreeEightModule.NamedImportBindings], + [TsCurrentModule.ImportDeclaration, TsThreeEightModule.ImportDeclaration], + [TsCurrentModule.ExportDeclaration, TsThreeEightModule.ExportDeclaration], + [TsCurrentModule.ModuleDeclaration, TsThreeEightModule.ModuleDeclaration], + [TsCurrentModule.Expression, TsThreeEightModule.Expression], + [TsCurrentModule.ModuleBody, TsThreeEightModule.ModuleBody], + [TsCurrentModule.ModuleName, TsThreeEightModule.ModuleName], + [TsCurrentModule.ExportDeclaration["exportClause"], TsThreeEightModule.ExportDeclaration["exportClause"]], +]; // endregion @@ -61,97 +59,90 @@ export namespace TsThreeEight { // region: Utils /* ****************************************************************************************************************** */ -export namespace TsThreeEight { - export const predicate = (context: TsTransformPathsContext) => context.tsVersionMajor < 4; +export const predicate = (context: TsTransformPathsContext) => context.tsVersionMajor < 4; - export function handler(context: TsTransformPathsContext, prop: string | symbol) { - const ts = context.tsInstance as unknown as typeof TsThreeEightModule; +export function handler(context: TsTransformPathsContext, prop: string | symbol) { + const ts = context.tsInstance as unknown as typeof TsThreeEightModule; - switch (prop) { - case "updateCallExpression": - return (...args: any) => ts.updateCall.apply(void 0, args); - case "updateImportClause": - return function ( - node: ImportClause, - isTypeOnly: boolean, - name: Identifier | undefined, - namedBindings: NamedImportBindings | undefined, - ) { - return ts.updateImportClause.apply(void 0, downSample(node, name, namedBindings)); - }; - case "updateImportDeclaration": - return function ( - node: ImportDeclaration, - modifiers: readonly Modifier[] | undefined, - importClause: ImportClause | undefined, - moduleSpecifier: Expression, - ) { - const [dsNode, dsImportClause, dsModuleSpecifier] = downSample(node, importClause, moduleSpecifier); + switch (prop) { + case "updateCallExpression": + return (...args: any) => ts.updateCall.apply(void 0, args); + case "updateImportClause": + return function ( + node: ImportClause, + isTypeOnly: boolean, + name: Identifier | undefined, + namedBindings: NamedImportBindings | undefined, + ) { + return ts.updateImportClause.apply(void 0, downSample(node, name, namedBindings)); + }; + case "updateImportDeclaration": + return function ( + node: ImportDeclaration, + modifiers: readonly Modifier[] | undefined, + importClause: ImportClause | undefined, + moduleSpecifier: Expression, + ) { + const [dsNode, dsImportClause, dsModuleSpecifier] = downSample(node, importClause, moduleSpecifier); - return ts.updateImportDeclaration( - dsNode, - dsNode.decorators, - dsNode.modifiers, - dsImportClause, - dsModuleSpecifier, - ); - }; - case "updateExportDeclaration": - return function ( - node: ExportDeclaration, - modifiers: readonly Modifier[] | undefined, - isTypeOnly: boolean, - exportClause: NamedExportBindings | undefined, - moduleSpecifier: Expression | undefined, - ) { - const [dsNode, dsModuleSpecifier, dsExportClause] = downSample(node, moduleSpecifier, exportClause); - return ts.updateExportDeclaration( - dsNode, - dsNode.decorators, - dsNode.modifiers, - dsExportClause, - dsModuleSpecifier, - // @ts-ignore - This was added in later versions of 3.x - dsNode.isTypeOnly, - ); - }; - case "updateModuleDeclaration": - return function ( - node: ModuleDeclaration, - modifiers: readonly Modifier[] | undefined, - name: ModuleName, - body: ModuleBody | undefined, - ) { - const [dsNode, dsName, dsBody] = downSample(node, name, body); + return ts.updateImportDeclaration( + dsNode, + dsNode.decorators, + dsNode.modifiers, + dsImportClause, + dsModuleSpecifier, + ); + }; + case "updateExportDeclaration": + return function ( + node: ExportDeclaration, + modifiers: readonly Modifier[] | undefined, + isTypeOnly: boolean, + exportClause: NamedExportBindings | undefined, + moduleSpecifier: Expression | undefined, + ) { + const [dsNode, dsModuleSpecifier, dsExportClause] = downSample(node, moduleSpecifier, exportClause); + return ts.updateExportDeclaration( + dsNode, + dsNode.decorators, + dsNode.modifiers, + dsExportClause, + dsModuleSpecifier, + // @ts-ignore - This was added in later versions of 3.x + dsNode.isTypeOnly, + ); + }; + case "updateModuleDeclaration": + return function ( + node: ModuleDeclaration, + modifiers: readonly Modifier[] | undefined, + name: ModuleName, + body: ModuleBody | undefined, + ) { + const [dsNode, dsName, dsBody] = downSample(node, name, body); - return ts.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody); - }; - case "updateImportTypeNode": - return function ( - node: ImportTypeNode, - argument: TypeNode, - assertions: ImportTypeAssertionContainer | undefined, - qualifier: EntityName | undefined, - typeArguments: readonly TypeNode[] | undefined, - isTypeOf?: boolean, - ) { - const [dsNode, dsArgument, dsQualifier, dsTypeArguments] = downSample( - node, - argument, - qualifier, - typeArguments, - ); + return ts.updateModuleDeclaration(dsNode, dsNode.decorators, dsNode.modifiers, dsName, dsBody); + }; + case "updateImportTypeNode": + return function ( + node: ImportTypeNode, + argument: TypeNode, + assertions: ImportTypeAssertionContainer | undefined, + qualifier: EntityName | undefined, + typeArguments: readonly TypeNode[] | undefined, + isTypeOf?: boolean, + ) { + const [dsNode, dsArgument, dsQualifier, dsTypeArguments] = downSample(node, argument, qualifier, typeArguments); - return ts.updateImportTypeNode(dsNode, dsArgument, dsQualifier, dsTypeArguments, isTypeOf); - }; - default: - return (...args: any) => (ts)[prop](...args); - } + return ts.updateImportTypeNode(dsNode, dsArgument, dsQualifier, dsTypeArguments, isTypeOf); + }; + default: + return (...args: any) => (ts)[prop](...args); } +} - export function downSample(...args: T): DownSampleTsTypes { - return args; - } +export function downSample(...args: T): DownSampleTsTypes { + return args; } // endregion From cd0e0a34427554d137ca4745be878629a92fcb33 Mon Sep 17 00:00:00 2001 From: Daniel Perez Alvarez Date: Thu, 8 Aug 2024 11:02:44 -0400 Subject: [PATCH 2/4] turn on no-namespace rule --- eslint.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 45f72c24..657e114b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -13,7 +13,7 @@ export default [ "@typescript-eslint/ban-ts-comment": "warn", "@typescript-eslint/no-empty-object-type": "warn", "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-namespace": "warn", + "@typescript-eslint/no-namespace": ["error", { allowDeclarations: true }], "@typescript-eslint/no-require-imports": "off", "@typescript-eslint/no-unsafe-function-type": "warn", "@typescript-eslint/no-unused-vars": "warn", From f2ffa3b40b23f72f55bdf099b46f6e2bea926da9 Mon Sep 17 00:00:00 2001 From: Daniel Perez Alvarez Date: Thu, 8 Aug 2024 11:16:37 -0400 Subject: [PATCH 3/4] don't lint types/ --- eslint.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 657e114b..87f89c5e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -4,7 +4,7 @@ import tseslint from "typescript-eslint"; export default [ { files: ["**/*.{js,mjs,cjs,ts}"] }, - { ignores: ["**/dist/", "src/declarations/", "test/projects/"] }, + { ignores: ["**/dist/", "src/declarations/", "test/projects/", "types/"] }, { languageOptions: { globals: globals.node } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, From 2414bfad1fc905a7ad5ddfa13229285af5026544 Mon Sep 17 00:00:00 2001 From: Daniel Perez Alvarez Date: Thu, 8 Aug 2024 11:20:14 -0400 Subject: [PATCH 4/4] remove namespace --- src/register.ts | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/register.ts b/src/register.ts index 683d62c8..f683f9ea 100755 --- a/src/register.ts +++ b/src/register.ts @@ -89,33 +89,31 @@ export function register(): TSNode.RegisterOptions | undefined { return registerOptions; } -export namespace register { - export function initialize(): { - tsNode: typeof TSNode; - instanceSymbol: typeof REGISTER_INSTANCE; - tsNodeInstance: TSNode.Service; - } { - let tsNode: typeof TSNode; - try { - tsNode = require("ts-node"); - } catch { - throw new Error( - `Cannot resolve ts-node. Make sure ts-node is installed before using typescript-transform-paths/register`, - ); - } +register.initialize = function initialize(): { + tsNode: typeof TSNode; + instanceSymbol: typeof REGISTER_INSTANCE; + tsNodeInstance: TSNode.Service; +} { + let tsNode: typeof TSNode; + try { + tsNode = require("ts-node"); + } catch { + throw new Error( + `Cannot resolve ts-node. Make sure ts-node is installed before using typescript-transform-paths/register`, + ); + } - const instanceSymbol: typeof REGISTER_INSTANCE = tsNode["REGISTER_INSTANCE"]; + const instanceSymbol: typeof REGISTER_INSTANCE = tsNode["REGISTER_INSTANCE"]; - let tsNodeInstance = global.process[instanceSymbol]; - if (!tsNodeInstance) { - tsNode.register(); // Register initially - tsNodeInstance = global.process[instanceSymbol]; - } - if (!tsNodeInstance) throw new Error(`Could not register ts-node instance!`); - - return { tsNode, instanceSymbol, tsNodeInstance }; + let tsNodeInstance = global.process[instanceSymbol]; + if (!tsNodeInstance) { + tsNode.register(); // Register initially + tsNodeInstance = global.process[instanceSymbol]; } -} + if (!tsNodeInstance) throw new Error(`Could not register ts-node instance!`); + + return { tsNode, instanceSymbol, tsNodeInstance }; +}; export default register;