From fb800c9c60b732b279f8e99290310187813d9322 Mon Sep 17 00:00:00 2001 From: jgoux Date: Sun, 19 Feb 2023 23:12:35 +0100 Subject: [PATCH 1/6] add project references --- src/index.ts | 71 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2817d42..29261b6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,17 +20,45 @@ const isPathPattern = /^\.{0,2}\//; const isTsFilePatten = /\.[cm]?tsx?$/; const nodeModulesPath = `${path.sep}node_modules${path.sep}`; -const tsconfig = ( - process.env.ESBK_TSCONFIG_PATH - ? { - path: path.resolve(process.env.ESBK_TSCONFIG_PATH), - config: parseTsconfig(process.env.ESBK_TSCONFIG_PATH), - } - : getTsconfig() -); +function getProjectsMap(tsconfigPath?: string, projectsMap?: Map; + tsconfigPathsMatcher: ReturnType; + fileMatcher: ReturnType; +}>) { + if (!projectsMap) { + projectsMap = new Map(); + } + + const tsconfig = ( + tsconfigPath + ? { + path: path.resolve(tsconfigPath), + config: parseTsconfig(tsconfigPath), + } + : getTsconfig() + ); + + if (!tsconfig) { + return projectsMap; + } + + const packageName = JSON.parse(fs.readFileSync(path.join(path.dirname(tsconfig.path), 'package.json'), 'utf8')).name as string; -const fileMatcher = tsconfig && createFilesMatcher(tsconfig); -const tsconfigPathsMatcher = tsconfig && createPathsMatcher(tsconfig); + projectsMap.set(packageName, { + tsconfig, + tsconfigPathsMatcher: tsconfig && createPathsMatcher(tsconfig), + fileMatcher: tsconfig && createFilesMatcher(tsconfig), + }); + + tsconfig?.config?.references?.forEach((reference) => { + const referencedTsconfigPath = reference.path.endsWith('.json') ? reference.path : path.join(reference.path, 'tsconfig.json'); + projectsMap = getProjectsMap(referencedTsconfigPath, projectsMap); + }); + + return projectsMap; +} + +export const projectsMap = getProjectsMap(process.env.ESBK_TSCONFIG_PATH); const applySourceMap = installSourceMapSupport(); @@ -67,11 +95,18 @@ function transformer( code = applySourceMap(transformed, filePath); } } else { + let tsconfigRaw: TransformOptions['tsconfigRaw']; + for (const project of projectsMap.values()) { + tsconfigRaw = project.fileMatcher(filePath) as TransformOptions['tsconfigRaw']; + if (tsconfigRaw) { + break; + } + } const transformed = transformSync( code, filePath, { - tsconfigRaw: fileMatcher?.(filePath) as TransformOptions['tsconfigRaw'], + tsconfigRaw, }, ); @@ -131,7 +166,7 @@ Module._resolveFilename = function (request, parent, isMain, options) { } if ( - tsconfigPathsMatcher + projectsMap.size > 0 // bare specifier && !isPathPattern.test(request) @@ -139,7 +174,15 @@ Module._resolveFilename = function (request, parent, isMain, options) { // Dependency paths should not be resolved using tsconfig.json && !parent?.filename?.includes(nodeModulesPath) ) { - const possiblePaths = tsconfigPathsMatcher(request); + const possiblePaths: string[] = []; + projectsMap.forEach((project) => { + if (project.tsconfigPathsMatcher) { + const possibleProjectPaths = project.tsconfigPathsMatcher(request); + if (possibleProjectPaths) { + possiblePaths.push(...possibleProjectPaths); + } + } + }); for (const possiblePath of possiblePaths) { const tsFilename = resolveTsFilename.call(this, possiblePath, parent, isMain, options); @@ -155,7 +198,7 @@ Module._resolveFilename = function (request, parent, isMain, options) { isMain, options, ); - } catch {} + } catch { } } } From 60ff8927dbc1100a01a30eb15ed3fa0e0f84ba93 Mon Sep 17 00:00:00 2001 From: jgoux Date: Sun, 19 Feb 2023 23:41:05 +0100 Subject: [PATCH 2/6] just use tsconfig.path as a key --- src/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 29261b6..f88aed9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,9 +42,7 @@ function getProjectsMap(tsconfigPath?: string, projectsMap?: Map Date: Sun, 19 Feb 2023 23:45:16 +0100 Subject: [PATCH 3/6] don't add project twice --- src/index.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index f88aed9..504599a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,11 +42,13 @@ function getProjectsMap(tsconfigPath?: string, projectsMap?: Map { const referencedTsconfigPath = reference.path.endsWith('.json') ? reference.path : path.join(reference.path, 'tsconfig.json'); From 66be1220aaf9eb99cf87a5ab2b250a677944477a Mon Sep 17 00:00:00 2001 From: jgoux Date: Sun, 19 Feb 2023 23:46:00 +0100 Subject: [PATCH 4/6] only add tsconfig once --- src/index.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 504599a..83ccab8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,13 +43,15 @@ function getProjectsMap(tsconfigPath?: string, projectsMap?: Map { const referencedTsconfigPath = reference.path.endsWith('.json') ? reference.path : path.join(reference.path, 'tsconfig.json'); projectsMap = getProjectsMap(referencedTsconfigPath, projectsMap); From 1dee2310996dec756d127ca105878eb72390288e Mon Sep 17 00:00:00 2001 From: jgoux Date: Sun, 19 Feb 2023 23:51:15 +0100 Subject: [PATCH 5/6] invert logic --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 83ccab8..4490118 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,7 +42,7 @@ function getProjectsMap(tsconfigPath?: string, projectsMap?: Map Date: Mon, 20 Feb 2023 22:03:12 +0100 Subject: [PATCH 6/6] add test --- .../dependency-resolve-project-reference.ts | 3 +++ .../resolve-project-reference/package.json | 3 +++ .../resolve-project-reference/src/index.ts | 1 + .../resolve-project-reference/src/resolve.ts | 1 + .../resolve-project-reference/tsconfig.json | 11 ++++++++++ tests/fixtures/tsconfig/tsconfig.json | 22 +++++++++++++++---- tests/specs/typescript/tsconfig.ts | 7 ++++++ 7 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/tsconfig/dependency-resolve-project-reference.ts create mode 100644 tests/fixtures/tsconfig/resolve-project-reference/package.json create mode 100644 tests/fixtures/tsconfig/resolve-project-reference/src/index.ts create mode 100644 tests/fixtures/tsconfig/resolve-project-reference/src/resolve.ts create mode 100644 tests/fixtures/tsconfig/resolve-project-reference/tsconfig.json diff --git a/tests/fixtures/tsconfig/dependency-resolve-project-reference.ts b/tests/fixtures/tsconfig/dependency-resolve-project-reference.ts new file mode 100644 index 0000000..41964bc --- /dev/null +++ b/tests/fixtures/tsconfig/dependency-resolve-project-reference.ts @@ -0,0 +1,3 @@ +import { resolve } from "resolve-project-reference"; + +console.log(resolve); \ No newline at end of file diff --git a/tests/fixtures/tsconfig/resolve-project-reference/package.json b/tests/fixtures/tsconfig/resolve-project-reference/package.json new file mode 100644 index 0000000..6a22b7b --- /dev/null +++ b/tests/fixtures/tsconfig/resolve-project-reference/package.json @@ -0,0 +1,3 @@ +{ + "main": "src/index.ts" +} \ No newline at end of file diff --git a/tests/fixtures/tsconfig/resolve-project-reference/src/index.ts b/tests/fixtures/tsconfig/resolve-project-reference/src/index.ts new file mode 100644 index 0000000..2e62b04 --- /dev/null +++ b/tests/fixtures/tsconfig/resolve-project-reference/src/index.ts @@ -0,0 +1 @@ +export * from "~/resolve"; \ No newline at end of file diff --git a/tests/fixtures/tsconfig/resolve-project-reference/src/resolve.ts b/tests/fixtures/tsconfig/resolve-project-reference/src/resolve.ts new file mode 100644 index 0000000..1326533 --- /dev/null +++ b/tests/fixtures/tsconfig/resolve-project-reference/src/resolve.ts @@ -0,0 +1 @@ +export const resolve = "resolved"; \ No newline at end of file diff --git a/tests/fixtures/tsconfig/resolve-project-reference/tsconfig.json b/tests/fixtures/tsconfig/resolve-project-reference/tsconfig.json new file mode 100644 index 0000000..f6bfa42 --- /dev/null +++ b/tests/fixtures/tsconfig/resolve-project-reference/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "~/*": [ + "src/*", + ], + }, + }, +} \ No newline at end of file diff --git a/tests/fixtures/tsconfig/tsconfig.json b/tests/fixtures/tsconfig/tsconfig.json index 9d0c412..267cad9 100644 --- a/tests/fixtures/tsconfig/tsconfig.json +++ b/tests/fixtures/tsconfig/tsconfig.json @@ -5,9 +5,23 @@ "jsxFragmentFactory": "null", "baseUrl": "./src", "paths": { - "paths-exact-match": ["resolve-target"], - "p/*": ["utils/*"], - "*/s": ["utils/*"] + "paths-exact-match": [ + "resolve-target" + ], + "p/*": [ + "utils/*" + ], + "*/s": [ + "utils/*" + ], + "resolve-project-reference": [ + "../resolve-project-reference/src/index.ts" + ] }, }, -} + "references": [ + { + "path": "./resolve-project-reference" + } + ] +} \ No newline at end of file diff --git a/tests/specs/typescript/tsconfig.ts b/tests/specs/typescript/tsconfig.ts index 20882eb..a8e7892 100644 --- a/tests/specs/typescript/tsconfig.ts +++ b/tests/specs/typescript/tsconfig.ts @@ -181,6 +181,13 @@ export default testSuite(async ({ describe }, node: NodeApis) => { }); expect(nodeProcess.stdout).toBe('resolved'); }); + + test('should resolve project reference', async () => { + const nodeProcess = await node.load('./dependency-resolve-project-reference', { + cwd: './tsconfig', + }); + expect(nodeProcess.stdout).toBe('resolved'); + }); }); }); });