From 5f572d0f60391285f425ad6dc2fc7c103e001032 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Thu, 19 Sep 2024 17:08:26 +0200 Subject: [PATCH 1/2] fix(cli): fix plugin module resolution --- packages/cli-core/src/services/CliFs.ts | 18 +++++++----------- packages/cli-core/src/utils/loadPlugins.ts | 4 +++- packages/cli/src/bin/tsed.ts | 14 ++++++++++++-- packages/cli/src/loaders/alias.hook.ts | 17 +++++++++-------- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/packages/cli-core/src/services/CliFs.ts b/packages/cli-core/src/services/CliFs.ts index 9ed646ba5..00d3788d3 100644 --- a/packages/cli-core/src/services/CliFs.ts +++ b/packages/cli-core/src/services/CliFs.ts @@ -1,8 +1,9 @@ +import {fileURLToPath} from "node:url"; + import {Injectable} from "@tsed/di"; import {normalizePath} from "@tsed/normalize-path"; import {PathLike, WriteFileOptions} from "fs"; -import Fs from "fs-extra"; -import {EnsureOptions} from "fs-extra"; +import Fs, {EnsureOptions} from "fs-extra"; import {join} from "path"; @Injectable() @@ -66,10 +67,6 @@ export class CliFs { async importModule(mod: string, root: string = process.cwd()) { try { if (process.env.NODE_ENV === "development") { - if (isCommonjs()) { - return require(mod); - } - return await import(mod); } } catch (er) {} @@ -77,13 +74,12 @@ export class CliFs { const path = this.findUpFile(root, join("node_modules", mod)); if (path) { - return import(path); + const pkg = await this.readJson(join(path, "package.json")); + const file = pkg.exports?.["."]?.import || pkg.exports?.["."]?.default || pkg.exports?.["."] || pkg.module || pkg.main; + + return import(join(path, file)); } return import(mod); } } - -function isCommonjs() { - return typeof module !== "undefined" && typeof exports !== "undefined"; -} diff --git a/packages/cli-core/src/utils/loadPlugins.ts b/packages/cli-core/src/utils/loadPlugins.ts index 13d7c0eda..6a390f42b 100644 --- a/packages/cli-core/src/utils/loadPlugins.ts +++ b/packages/cli-core/src/utils/loadPlugins.ts @@ -1,3 +1,5 @@ +import {fileURLToPath} from "node:url"; + import {GlobalProviders, InjectorService} from "@tsed/di"; import chalk from "chalk"; // @ts-ignore @@ -19,7 +21,7 @@ export async function loadPlugins(injector: InjectorService) { .filter((mod) => mod.startsWith(`@${name}/cli-plugin`) || mod.includes(`${name}-cli-plugin`)) .map(async (mod) => { try { - const {default: plugin} = await fs.importModule(mod, rootDir); + const {default: plugin} = await fs.importModule(mod, fileURLToPath(rootDir)); if (!injector.has(plugin)) { const provider = GlobalProviders.get(plugin)?.clone(); diff --git a/packages/cli/src/bin/tsed.ts b/packages/cli/src/bin/tsed.ts index 8d66fe8b8..d7de8ac7e 100644 --- a/packages/cli/src/bin/tsed.ts +++ b/packages/cli/src/bin/tsed.ts @@ -1,8 +1,18 @@ #!/usr/bin/env node import {register} from "node:module"; -import {pathToFileURL} from "node:url"; +import {fileURLToPath, pathToFileURL} from "node:url"; -register(pathToFileURL(`${import.meta.dirname}/../alias.hook.js`)); +register(pathToFileURL(`${import.meta.dirname}/../loaders/alias.hook.js`), { + parentURL: import.meta.dirname, + data: { + "@tsed/core": fileURLToPath(import.meta.resolve("@tsed/core")), + "@tsed/di": fileURLToPath(import.meta.resolve("@tsed/di")), + "@tsed/schema": fileURLToPath(import.meta.resolve("@tsed/schema")), + "@tsed/cli-core": fileURLToPath(import.meta.resolve("@tsed/cli-core")), + "@tsed/cli": fileURLToPath(import.meta.resolve("@tsed/cli")) + }, + transferList: [] +}); const {Cli} = await import("../Cli.js"); diff --git a/packages/cli/src/loaders/alias.hook.ts b/packages/cli/src/loaders/alias.hook.ts index 373c7f57e..5e5bb8038 100644 --- a/packages/cli/src/loaders/alias.hook.ts +++ b/packages/cli/src/loaders/alias.hook.ts @@ -1,11 +1,12 @@ import generateAliasesResolver from "esm-module-alias"; -const aliases = { - "@tsed/core": import.meta.resolve("@tsed/core"), - "@tsed/di": import.meta.resolve("@tsed/di"), - "@tsed/schema": import.meta.resolve("@tsed/schema"), - "@tsed/cli-core": import.meta.resolve("@tsed/cli-core"), - "@tsed/cli": import.meta.resolve("@tsed/cli") -}; +let resolver: any = null; -export const resolve = generateAliasesResolver(aliases); +export async function initialize(aliases: Record) { + // Receives data from `register`. + resolver = generateAliasesResolver(aliases); +} + +export function resolve(specifier: any, context: any, nextResolve: any) { + return resolver(specifier, context, nextResolve); +} From b10cc66ebca1cdfd9abc215f5b484627a4c4761b Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Thu, 19 Sep 2024 17:09:11 +0200 Subject: [PATCH 2/2] fix(cli-plugin-eslint): fix template link --- packages/cli-plugin-eslint/src/hooks/EslintInitHook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli-plugin-eslint/src/hooks/EslintInitHook.ts b/packages/cli-plugin-eslint/src/hooks/EslintInitHook.ts index f7dd4ff46..6ba2967f8 100644 --- a/packages/cli-plugin-eslint/src/hooks/EslintInitHook.ts +++ b/packages/cli-plugin-eslint/src/hooks/EslintInitHook.ts @@ -26,7 +26,7 @@ export class EslintInitHook { task: (ctx: any) => { return this.rootRenderer.renderAll( [ - "eslint.config.mjs", + "eslint.config.mjs.hbs", ctx.lintstaged && ".husky/_/.gitignore.hbs", ctx.lintstaged && ".husky/_/husky.sh.hbs", ctx.lintstaged && ".husky/.gitignore.hbs",