From fd3c6ed8a71cc293b8f3733ec5fbfd759cfc0eaf Mon Sep 17 00:00:00 2001 From: unional Date: Tue, 3 Jan 2023 00:22:43 -0800 Subject: [PATCH 1/8] fix: support of imports field fixes #13707 --- copy.mjs | 0 packages/jest-resolve/package.json | 2 +- .../imports/array-import/browser.cjs | 0 .../__mocks__/imports/array-import/node-2.mjs | 0 .../__mocks__/imports/array-import/node.cjs | 0 .../imports/array-import/package.json | 10 +++++ .../imports/nested-import/browser.cjs | 0 .../__mocks__/imports/nested-import/node.cjs | 0 .../__mocks__/imports/nested-import/node.mjs | 0 .../imports/nested-import/package.json | 12 +++++ .../src/__tests__/resolve.test.ts | 45 +++++++++++++++++++ packages/jest-resolve/src/defaultResolver.ts | 35 ++++++++++----- yarn.lock | 25 +++++++---- 13 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 copy.mjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/array-import/browser.cjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/array-import/node-2.mjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/array-import/node.cjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/array-import/package.json create mode 100644 packages/jest-resolve/src/__mocks__/imports/nested-import/browser.cjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/nested-import/node.cjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/nested-import/node.mjs create mode 100644 packages/jest-resolve/src/__mocks__/imports/nested-import/package.json diff --git a/copy.mjs b/copy.mjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index d0bec260ddbb..f81d7e871099 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -17,7 +17,6 @@ "./package.json": "./package.json" }, "dependencies": { - "@okikio/resolve.imports": "^1.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "workspace:^", @@ -26,6 +25,7 @@ "jest-validate": "workspace:^", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", + "resolve.imports": "^2.0.0", "slash": "^3.0.0" }, "devDependencies": { diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/browser.cjs b/packages/jest-resolve/src/__mocks__/imports/array-import/browser.cjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/node-2.mjs b/packages/jest-resolve/src/__mocks__/imports/array-import/node-2.mjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/node.cjs b/packages/jest-resolve/src/__mocks__/imports/array-import/node.cjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/package.json b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json new file mode 100644 index 000000000000..87771ec171d6 --- /dev/null +++ b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json @@ -0,0 +1,10 @@ +{ + "name": "array-import", + "imports": { + "#nested": { + "import": ["./node.mjs", "./node-2.mjs"], + "browser": ["./not-exist.cjs", "./browser.cjs"], + "require": ["not-exist-package", "./node.cjs"] + } + } +} diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/browser.cjs b/packages/jest-resolve/src/__mocks__/imports/nested-import/browser.cjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/node.cjs b/packages/jest-resolve/src/__mocks__/imports/nested-import/node.cjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/node.mjs b/packages/jest-resolve/src/__mocks__/imports/nested-import/node.mjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json b/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json new file mode 100644 index 000000000000..d980fdacbc13 --- /dev/null +++ b/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json @@ -0,0 +1,12 @@ +{ + "name": "nested-import", + "imports": { + "#nested": { + "node": { + "import": "./node.mjs", + "require": "./node.cjs" + }, + "default": "./browser.cjs" + } + } +} diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index d9c69dbc13e1..d9bcba08a0c8 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -345,6 +345,51 @@ describe('findNodeModule', () => { ); }); + test('supports nested pattern', () => { + const result = Resolver.findNodeModule('#nested', { + basedir: path.resolve(importsRoot, './nested-import/index.cjs'), + conditions: ['node', 'require'], + }); + + expect(result).toEqual( + path.resolve(importsRoot, './nested-import/node.cjs'), + ); + }); + + test('supports array pattern - resolve to first found', () => { + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['import'], + }); + + expect(result).toEqual( + path.resolve(importsRoot, './array-import/node.mjs'), + ); + }); + + test('supports array pattern - ignore not exist internal file', () => { + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['browser'], + }); + + expect(result).toEqual( + path.resolve(importsRoot, './array-import/browser.cjs'), + ); + }); + + test('supports array pattern - ignore not exist external module', () => { + // this is for optional dependency + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['require'], + }); + + expect(result).toEqual( + path.resolve(importsRoot, './array-import/node.cjs'), + ); + }); + test('fails for non-existent mapping', () => { expect(() => { Resolver.findNodeModule('#something-else', { diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index bffa2ad9177f..4672c6ce6e41 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -6,13 +6,13 @@ */ import {dirname, isAbsolute, resolve as pathResolve} from 'path'; -import {resolve as resolveImports} from '@okikio/resolve.imports'; import pnpResolver from 'jest-pnp-resolver'; import {SyncOpts as UpstreamResolveOptions, sync as resolveSync} from 'resolve'; import { Options as ResolveExportsOptions, resolve as resolveExports, } from 'resolve.exports'; +import {resolve as resolveImports} from 'resolve.imports'; import { findClosestPackageJson, isDirectory, @@ -110,9 +110,7 @@ const defaultResolver: SyncResolver = (path, options) => { realpathSync, }; - const pathToResolve = getPathInModule(path, resolveOptions); - - const result = resolveSync(pathToResolve, resolveOptions); + const result = resolveByPathInModule(path, resolveOptions); // Dereference symlinks to ensure we don't create a separate // module instance depending on how it was referenced. @@ -129,7 +127,7 @@ function readPackageSync(_: unknown, file: string): PackageJSON { return readPackageCached(file); } -function getPathInModule( +function resolveByPathInModule( path: string, options: UpstreamResolveOptionsWithConditions, ): string { @@ -149,7 +147,11 @@ function getPathInModule( const pkg = readPackageCached(closestPackageJson); const resolved = resolveImports( - pkg, + { + base: options.basedir, + content: pkg, + path: closestPackageJson, + }, path, createResolveOptions(options.conditions), ); @@ -160,12 +162,25 @@ function getPathInModule( ); } - if (resolved.startsWith('.')) { - return pathResolve(dirname(closestPackageJson), resolved); + const resolvedValues = Array.isArray(resolved) ? resolved : [resolved]; + + for (const resolved of resolvedValues) { + const resolvedPath = resolveByPath(resolved); + try { + return resolveSync(resolvedPath, options); + } catch (e) { + continue; + } } - // this is an external module, re-resolve it - return defaultResolver(resolved, options); + function resolveByPath(resolved: string) { + if (resolved.startsWith('.')) { + return pathResolve(dirname(closestPackageJson!), resolved); + } + + // this is an external module, re-resolve it + return defaultResolver(resolved, options); + } } const segments = path.split('/'); diff --git a/yarn.lock b/yarn.lock index 8bfec085f959..17bad94bc1ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3721,13 +3721,6 @@ __metadata: languageName: node linkType: hard -"@okikio/resolve.imports@npm:^1.0.0": - version: 1.0.0 - resolution: "@okikio/resolve.imports@npm:1.0.0" - checksum: a06d347731b3c47e79125d346dd0172fda3cf20d138249f4ed23c5cc60b32f668f9bbab49698fc061ef5782d236622ff4cd0ce2b2520550273e863f55b687350 - languageName: node - linkType: hard - "@pkgr/utils@npm:^2.3.1": version: 2.3.1 resolution: "@pkgr/utils@npm:2.3.1" @@ -12891,7 +12884,6 @@ __metadata: version: 0.0.0-use.local resolution: "jest-resolve@workspace:packages/jest-resolve" dependencies: - "@okikio/resolve.imports": ^1.0.0 "@tsd/typescript": ^4.9.0 "@types/graceful-fs": ^4.1.3 "@types/pnpapi": ^0.0.2 @@ -12904,6 +12896,7 @@ __metadata: jest-validate: "workspace:^" resolve: ^1.20.0 resolve.exports: ^1.1.0 + resolve.imports: ^2.0.0 slash: ^3.0.0 tsd-lite: ^0.6.0 languageName: unknown @@ -16422,6 +16415,13 @@ __metadata: languageName: node linkType: hard +"pattern-key-compare@npm:^2.0.0": + version: 2.0.0 + resolution: "pattern-key-compare@npm:2.0.0" + checksum: cded15070cddbc5ef7b97c1b91371bcf59ff931f8afe383d2323f935891e6c4517bd76154f5edc2b1ab53c6fbeeb0711b9db43af592064482d0a9ccf03dd507c + languageName: node + linkType: hard + "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -18366,6 +18366,15 @@ __metadata: languageName: node linkType: hard +"resolve.imports@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve.imports@npm:2.0.0" + dependencies: + pattern-key-compare: ^2.0.0 + checksum: ad914fcd84f656888ada484a45f4ff09429b99cd896a4a4a28bbc0676a795a528a7760125e297951d8b314584fb72da428a09d0e7f1d60d4d48bfb093d996609 + languageName: node + linkType: hard + "resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.3.2": version: 1.22.1 resolution: "resolve@npm:1.22.1" From ef1d106cee4bc2de268337415cfd1f373218ddc3 Mon Sep 17 00:00:00 2001 From: unional Date: Tue, 3 Jan 2023 00:53:56 -0800 Subject: [PATCH 2/8] fix: rethrow last error Updated changelog and removed copy.mjs --- CHANGELOG.md | 2 +- copy.mjs | 0 packages/jest-resolve/src/defaultResolver.ts | 7 ++++++- 3 files changed, 7 insertions(+), 2 deletions(-) delete mode 100644 copy.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index b5c0e2298881..b433bfc61233 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### Features - `[jest-haste-map]` ignore Sapling vcs directories (`.sl/`) ([#13674](https://github.com/facebook/jest/pull/13674)) -- `[jest-resolve]` Support subpath imports ([#13705](https://github.com/facebook/jest/pull/13705)) +- `[jest-resolve]` Support subpath imports ([#13705](https://github.com/facebook/jest/pull/13705), [#13723](https://github.com/facebook/jest/pull/13723)) - `[jest-runtime]` Add `jest.isolateModulesAsync` for scoped module initialization of asynchronous functions ([#13680](https://github.com/facebook/jest/pull/13680)) - `[jest-test-result]` Added `skipped` and `focused` status to `FormattedTestResult` ([#13700](https://github.com/facebook/jest/pull/13700)) diff --git a/copy.mjs b/copy.mjs deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 4672c6ce6e41..91dc2b00a152 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -164,14 +164,19 @@ function resolveByPathInModule( const resolvedValues = Array.isArray(resolved) ? resolved : [resolved]; + let lastError: Error; for (const resolved of resolvedValues) { const resolvedPath = resolveByPath(resolved); + try { return resolveSync(resolvedPath, options); - } catch (e) { + } catch (e: any) { + lastError = e; continue; } } + // eslint-disable-next-line no-throw-literal + throw lastError!; function resolveByPath(resolved: string) { if (resolved.startsWith('.')) { From 9c1abbb268cce652b89de774d70c45d1bf509671 Mon Sep 17 00:00:00 2001 From: unional Date: Tue, 3 Jan 2023 01:05:35 -0800 Subject: [PATCH 3/8] chore: move test into describe block --- .../src/__tests__/resolve.test.ts | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index d9bcba08a0c8..c23dbb6aa9a4 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -356,38 +356,40 @@ describe('findNodeModule', () => { ); }); - test('supports array pattern - resolve to first found', () => { - const result = Resolver.findNodeModule('#array-import', { - basedir: path.resolve(importsRoot, './array-import/index.cjs'), - conditions: ['import'], + describe('supports array pattern', () => { + test('resolve to first found', () => { + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['import'], + }); + + expect(result).toEqual( + path.resolve(importsRoot, './array-import/node.mjs'), + ); }); - expect(result).toEqual( - path.resolve(importsRoot, './array-import/node.mjs'), - ); - }); + test('ignore not exist internal file', () => { + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['browser'], + }); - test('supports array pattern - ignore not exist internal file', () => { - const result = Resolver.findNodeModule('#array-import', { - basedir: path.resolve(importsRoot, './array-import/index.cjs'), - conditions: ['browser'], + expect(result).toEqual( + path.resolve(importsRoot, './array-import/browser.cjs'), + ); }); - expect(result).toEqual( - path.resolve(importsRoot, './array-import/browser.cjs'), - ); - }); + test('ignore not exist external module', () => { + // this is for optional dependency + const result = Resolver.findNodeModule('#array-import', { + basedir: path.resolve(importsRoot, './array-import/index.cjs'), + conditions: ['require'], + }); - test('supports array pattern - ignore not exist external module', () => { - // this is for optional dependency - const result = Resolver.findNodeModule('#array-import', { - basedir: path.resolve(importsRoot, './array-import/index.cjs'), - conditions: ['require'], + expect(result).toEqual( + path.resolve(importsRoot, './array-import/node.cjs'), + ); }); - - expect(result).toEqual( - path.resolve(importsRoot, './array-import/node.cjs'), - ); }); test('fails for non-existent mapping', () => { From ee2abca154239c1abae7bb2bb8e964802c146ef5 Mon Sep 17 00:00:00 2001 From: unional Date: Tue, 3 Jan 2023 22:22:44 -0800 Subject: [PATCH 4/8] fix: tests and update resolve.imports to 2.0.2 one test left --- packages/jest-resolve/package.json | 2 +- .../array-import/{node-2.mjs => chrome.cjs} | 0 .../{nested-import => array-import}/node.mjs | 0 .../imports/array-import/package.json | 5 +-- .../node.cjs => nested-import/esm.mjs} | 0 .../imports/nested-import/package.json | 2 +- .../src/__tests__/resolve.test.ts | 21 ++++++--- packages/jest-resolve/src/defaultResolver.ts | 44 ++++++++----------- yarn.lock | 10 ++--- 9 files changed, 41 insertions(+), 43 deletions(-) rename packages/jest-resolve/src/__mocks__/imports/array-import/{node-2.mjs => chrome.cjs} (100%) rename packages/jest-resolve/src/__mocks__/imports/{nested-import => array-import}/node.mjs (100%) rename packages/jest-resolve/src/__mocks__/imports/{array-import/node.cjs => nested-import/esm.mjs} (100%) diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index f81d7e871099..c7aa209ecbe4 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -25,7 +25,7 @@ "jest-validate": "workspace:^", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", - "resolve.imports": "^2.0.0", + "resolve.imports": "^2.0.2", "slash": "^3.0.0" }, "devDependencies": { diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/node-2.mjs b/packages/jest-resolve/src/__mocks__/imports/array-import/chrome.cjs similarity index 100% rename from packages/jest-resolve/src/__mocks__/imports/array-import/node-2.mjs rename to packages/jest-resolve/src/__mocks__/imports/array-import/chrome.cjs diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/node.mjs b/packages/jest-resolve/src/__mocks__/imports/array-import/node.mjs similarity index 100% rename from packages/jest-resolve/src/__mocks__/imports/nested-import/node.mjs rename to packages/jest-resolve/src/__mocks__/imports/array-import/node.mjs diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/package.json b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json index 87771ec171d6..5c24efffc2b0 100644 --- a/packages/jest-resolve/src/__mocks__/imports/array-import/package.json +++ b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json @@ -1,10 +1,9 @@ { "name": "array-import", "imports": { - "#nested": { + "#array-import": { "import": ["./node.mjs", "./node-2.mjs"], - "browser": ["./not-exist.cjs", "./browser.cjs"], - "require": ["not-exist-package", "./node.cjs"] + "browser": [{ "chrome": "./chrome.cjs" }, "./browser.cjs"] } } } diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/node.cjs b/packages/jest-resolve/src/__mocks__/imports/nested-import/esm.mjs similarity index 100% rename from packages/jest-resolve/src/__mocks__/imports/array-import/node.cjs rename to packages/jest-resolve/src/__mocks__/imports/nested-import/esm.mjs diff --git a/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json b/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json index d980fdacbc13..abf0499a8f54 100644 --- a/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json +++ b/packages/jest-resolve/src/__mocks__/imports/nested-import/package.json @@ -3,7 +3,7 @@ "imports": { "#nested": { "node": { - "import": "./node.mjs", + "import": "./esm.mjs", "require": "./node.cjs" }, "default": "./browser.cjs" diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index c23dbb6aa9a4..fb76627f44c7 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -6,6 +6,7 @@ * */ +import {fail} from 'assert'; import * as path from 'path'; import * as fs from 'graceful-fs'; import {sync as resolveSync} from 'resolve'; @@ -368,7 +369,7 @@ describe('findNodeModule', () => { ); }); - test('ignore not exist internal file', () => { + test('skip over not met nested condition', () => { const result = Resolver.findNodeModule('#array-import', { basedir: path.resolve(importsRoot, './array-import/index.cjs'), conditions: ['browser'], @@ -379,26 +380,32 @@ describe('findNodeModule', () => { ); }); - test('ignore not exist external module', () => { - // this is for optional dependency + test('match nested condition', () => { const result = Resolver.findNodeModule('#array-import', { basedir: path.resolve(importsRoot, './array-import/index.cjs'), - conditions: ['require'], + conditions: ['chrome', 'browser'], }); expect(result).toEqual( - path.resolve(importsRoot, './array-import/node.cjs'), + path.resolve(importsRoot, './array-import/chrome.cjs'), ); }); }); test('fails for non-existent mapping', () => { - expect(() => { + // jest `toThrow()` does not take a validator, + // so can't use msg.startWith() test. + try { Resolver.findNodeModule('#something-else', { basedir: path.resolve(importsRoot, './foo-import/index.js'), conditions: [], }); - }).toThrow('Missing "#something-else" import in "foo-import" package'); + fail('Expected to throw'); + } catch (e: any) { + expect(e.message).toMatch( + /^Package import specifier "#something-else" is not defined in package/, + ); + } }); }); }); diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 91dc2b00a152..ad231802bda7 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -110,7 +110,9 @@ const defaultResolver: SyncResolver = (path, options) => { realpathSync, }; - const result = resolveByPathInModule(path, resolveOptions); + const pathToResolve = getPathInModule(path, resolveOptions); + + const result = resolveSync(pathToResolve, resolveOptions); // Dereference symlinks to ensure we don't create a separate // module instance depending on how it was referenced. @@ -127,7 +129,7 @@ function readPackageSync(_: unknown, file: string): PackageJSON { return readPackageCached(file); } -function resolveByPathInModule( +function getPathInModule( path: string, options: UpstreamResolveOptionsWithConditions, ): string { @@ -150,10 +152,10 @@ function resolveByPathInModule( { base: options.basedir, content: pkg, - path: closestPackageJson, + path: dirname(closestPackageJson), }, path, - createResolveOptions(options.conditions), + createImportsResolveOptions(options.conditions), ); if (!resolved) { @@ -162,30 +164,12 @@ function resolveByPathInModule( ); } - const resolvedValues = Array.isArray(resolved) ? resolved : [resolved]; - - let lastError: Error; - for (const resolved of resolvedValues) { - const resolvedPath = resolveByPath(resolved); - - try { - return resolveSync(resolvedPath, options); - } catch (e: any) { - lastError = e; - continue; - } + if (resolved.startsWith('.')) { + return pathResolve(dirname(closestPackageJson), resolved); } - // eslint-disable-next-line no-throw-literal - throw lastError!; - - function resolveByPath(resolved: string) { - if (resolved.startsWith('.')) { - return pathResolve(dirname(closestPackageJson!), resolved); - } - // this is an external module, re-resolve it - return defaultResolver(resolved, options); - } + // this is an external module, re-resolve it + return defaultResolver(resolved, options); } const segments = path.split('/'); @@ -264,6 +248,14 @@ function createResolveOptions( {browser: false, require: true}; } +function createImportsResolveOptions(conditions: Array | undefined) { + return { + conditions: conditions + ? [...conditions, 'default'] + : ['node', 'require', 'default'], + }; +} + // if it's a relative import or an absolute path, imports/exports are ignored const shouldIgnoreRequestForExports = (path: string) => path.startsWith('.') || isAbsolute(path); diff --git a/yarn.lock b/yarn.lock index 17bad94bc1ce..49418ba9b723 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12896,7 +12896,7 @@ __metadata: jest-validate: "workspace:^" resolve: ^1.20.0 resolve.exports: ^1.1.0 - resolve.imports: ^2.0.0 + resolve.imports: ^2.0.2 slash: ^3.0.0 tsd-lite: ^0.6.0 languageName: unknown @@ -18366,12 +18366,12 @@ __metadata: languageName: node linkType: hard -"resolve.imports@npm:^2.0.0": - version: 2.0.0 - resolution: "resolve.imports@npm:2.0.0" +"resolve.imports@npm:^2.0.2": + version: 2.0.2 + resolution: "resolve.imports@npm:2.0.2" dependencies: pattern-key-compare: ^2.0.0 - checksum: ad914fcd84f656888ada484a45f4ff09429b99cd896a4a4a28bbc0676a795a528a7760125e297951d8b314584fb72da428a09d0e7f1d60d4d48bfb093d996609 + checksum: 86c8e233d0d5b98bdd90f50e21df4d54eaf6eeaf9b1779d21d70a6210f011c534634a40e4d991e4479fa3e4f503aa9e84f6320b686db710f20d46e2548842d50 languageName: node linkType: hard From fff0854dfcb6a80337d7f376e3b8d9f6bb4b84da Mon Sep 17 00:00:00 2001 From: unional Date: Tue, 3 Jan 2023 22:36:47 -0800 Subject: [PATCH 5/8] lint: fix lint for array-import package json --- .../src/__mocks__/imports/array-import/package.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/jest-resolve/src/__mocks__/imports/array-import/package.json b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json index 5c24efffc2b0..15ec34ae7412 100644 --- a/packages/jest-resolve/src/__mocks__/imports/array-import/package.json +++ b/packages/jest-resolve/src/__mocks__/imports/array-import/package.json @@ -2,8 +2,16 @@ "name": "array-import", "imports": { "#array-import": { - "import": ["./node.mjs", "./node-2.mjs"], - "browser": [{ "chrome": "./chrome.cjs" }, "./browser.cjs"] + "import": [ + "./node.mjs", + "./node-2.mjs" + ], + "browser": [ + { + "chrome": "./chrome.cjs" + }, + "./browser.cjs" + ] } } } From 9acbeb068bffa76b909fe5a881bc6afe1cf6169e Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 4 Jan 2023 09:34:10 +0100 Subject: [PATCH 6/8] cleanup test --- .../src/__tests__/resolve.test.ts | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index fb76627f44c7..596cb73a3a67 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -6,7 +6,6 @@ * */ -import {fail} from 'assert'; import * as path from 'path'; import * as fs from 'graceful-fs'; import {sync as resolveSync} from 'resolve'; @@ -393,19 +392,19 @@ describe('findNodeModule', () => { }); test('fails for non-existent mapping', () => { - // jest `toThrow()` does not take a validator, - // so can't use msg.startWith() test. - try { + expect(() => Resolver.findNodeModule('#something-else', { basedir: path.resolve(importsRoot, './foo-import/index.js'), conditions: [], - }); - fail('Expected to throw'); - } catch (e: any) { - expect(e.message).toMatch( - /^Package import specifier "#something-else" is not defined in package/, - ); - } + }), + ).toThrow( + expect.objectContaining({ + code: 'ERR_PACKAGE_IMPORT_NOT_DEFINED', + message: expect.stringMatching( + /^Package import specifier "#something-else" is not defined in package/, + ), + }), + ); }); }); }); From 0f964fadd250ea51eeca22efd2aced46e5f29365 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 4 Jan 2023 09:34:59 +0100 Subject: [PATCH 7/8] less diff --- packages/jest-resolve/src/__tests__/resolve.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index 596cb73a3a67..6cecedfcb7aa 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -392,12 +392,12 @@ describe('findNodeModule', () => { }); test('fails for non-existent mapping', () => { - expect(() => + expect(() => { Resolver.findNodeModule('#something-else', { basedir: path.resolve(importsRoot, './foo-import/index.js'), conditions: [], - }), - ).toThrow( + }); + }).toThrow( expect.objectContaining({ code: 'ERR_PACKAGE_IMPORT_NOT_DEFINED', message: expect.stringMatching( From 8e8663e230763b3d8f700a7f741b1b728e494406 Mon Sep 17 00:00:00 2001 From: unional Date: Thu, 5 Jan 2023 01:11:35 -0800 Subject: [PATCH 8/8] fix: update to resolve.imports 2.0.3 fixing the error message issue --- packages/jest-resolve/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index c7aa209ecbe4..cf786ed1a6f3 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -25,7 +25,7 @@ "jest-validate": "workspace:^", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", - "resolve.imports": "^2.0.2", + "resolve.imports": "^2.0.3", "slash": "^3.0.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 49418ba9b723..eea8202bf9a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12896,7 +12896,7 @@ __metadata: jest-validate: "workspace:^" resolve: ^1.20.0 resolve.exports: ^1.1.0 - resolve.imports: ^2.0.2 + resolve.imports: ^2.0.3 slash: ^3.0.0 tsd-lite: ^0.6.0 languageName: unknown @@ -18366,12 +18366,12 @@ __metadata: languageName: node linkType: hard -"resolve.imports@npm:^2.0.2": - version: 2.0.2 - resolution: "resolve.imports@npm:2.0.2" +"resolve.imports@npm:^2.0.3": + version: 2.0.3 + resolution: "resolve.imports@npm:2.0.3" dependencies: pattern-key-compare: ^2.0.0 - checksum: 86c8e233d0d5b98bdd90f50e21df4d54eaf6eeaf9b1779d21d70a6210f011c534634a40e4d991e4479fa3e4f503aa9e84f6320b686db710f20d46e2548842d50 + checksum: 155ae4a32ccc1da7ad12b88f6c748dd1e038092838e537de1066248c32a197b42489810da6070bb2bd0dd954e8abbe841b09282c0806c5493b2e49e8f7e29632 languageName: node linkType: hard