diff --git a/package.json b/package.json index 2782892..b1de891 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^8.24.0", "execa": "^6.1.0", "get-node": "^13.2.0", - "manten": "^0.3.0", + "manten": "^0.5.0", "pkgroll": "^1.4.0", "semver": "^7.3.7", "source-map-support": "^0.5.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6299ad..509abaa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,7 +11,7 @@ specifiers: execa: ^6.1.0 get-node: ^13.2.0 get-tsconfig: ^4.2.0 - manten: ^0.3.0 + manten: ^0.5.0 pkgroll: ^1.4.0 semver: ^7.3.7 source-map-support: ^0.5.21 @@ -31,7 +31,7 @@ devDependencies: eslint: 8.24.0 execa: 6.1.0 get-node: 13.2.0 - manten: 0.3.0 + manten: 0.5.0 pkgroll: 1.4.0_typescript@4.8.3 semver: 7.3.7 source-map-support: 0.5.21 @@ -47,11 +47,6 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/helper-validator-identifier/7.18.6: - resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier/7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} @@ -61,7 +56,7 @@ packages: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 dev: true @@ -139,11 +134,11 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@jest/expect-utils/29.0.3: - resolution: {integrity: sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q==} + /@jest/expect-utils/29.3.1: + resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.0.0 + jest-get-type: 29.2.0 dev: true /@jest/schemas/28.1.3: @@ -157,7 +152,7 @@ packages: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.24.43 + '@sinclair/typebox': 0.24.51 dev: true /@jest/types/28.1.3: @@ -172,15 +167,15 @@ packages: chalk: 4.1.2 dev: true - /@jest/types/29.0.3: - resolution: {integrity: sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==} + /@jest/types/29.3.1: + resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.7.21 - '@types/yargs': 17.0.13 + '@types/node': 18.11.9 + '@types/yargs': 17.0.15 chalk: 4.1.2 dev: true @@ -340,8 +335,8 @@ packages: resolution: {integrity: sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==} dev: true - /@sinclair/typebox/0.24.43: - resolution: {integrity: sha512-1orQTvtazZmsPeBroJjysvsOQCYV2yjWlebkSY38pl5vr2tdLjEJ+LoxITlGNZaH2RE19WlAwQMkH/7C14wLfw==} + /@sinclair/typebox/0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true /@sindresorhus/is/5.3.0: @@ -413,6 +408,10 @@ packages: '@types/unist': 2.0.6 dev: true + /@types/node/18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true + /@types/node/18.7.21: resolution: {integrity: sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==} dev: true @@ -455,8 +454,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/17.0.13: - resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} + /@types/yargs/17.0.15: + resolution: {integrity: sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==} dependencies: '@types/yargs-parser': 21.0.0 dev: true @@ -820,6 +819,11 @@ packages: resolution: {integrity: sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==} dev: true + /ci-info/3.7.0: + resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} + engines: {node: '>=8'} + dev: true + /clean-pkg-json/1.2.0: resolution: {integrity: sha512-QHBWWOtpSCv5nfMFKwyxn4WMvkYE0msxj5xiqejYGqYepWVrK7O/om1Vn6nSl/WPtYn8ge9YmSCbTi1Hp8k+Hg==} hasBin: true @@ -980,8 +984,8 @@ packages: object-keys: 1.1.1 dev: true - /diff-sequences/29.0.0: - resolution: {integrity: sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==} + /diff-sequences/29.3.1: + resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true @@ -1909,15 +1913,15 @@ packages: strip-final-newline: 3.0.0 dev: true - /expect/29.0.3: - resolution: {integrity: sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q==} + /expect/29.3.1: + resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.0.3 - jest-get-type: 29.0.0 - jest-matcher-utils: 29.0.3 - jest-message-util: 29.0.3 - jest-util: 29.0.3 + '@jest/expect-utils': 29.3.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 dev: true /fast-deep-equal/3.1.3: @@ -2538,14 +2542,14 @@ packages: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true - /jest-diff/29.0.3: - resolution: {integrity: sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==} + /jest-diff/29.3.1: + resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 29.0.0 - jest-get-type: 29.0.0 - pretty-format: 29.0.3 + diff-sequences: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 dev: true /jest-get-type/28.0.2: @@ -2553,44 +2557,44 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-get-type/29.0.0: - resolution: {integrity: sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==} + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-matcher-utils/29.0.3: - resolution: {integrity: sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w==} + /jest-matcher-utils/29.3.1: + resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.0.3 - jest-get-type: 29.0.0 - pretty-format: 29.0.3 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 dev: true - /jest-message-util/29.0.3: - resolution: {integrity: sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg==} + /jest-message-util/29.3.1: + resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.18.6 - '@jest/types': 29.0.3 + '@jest/types': 29.3.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.10 micromatch: 4.0.5 - pretty-format: 29.0.3 + pretty-format: 29.3.1 slash: 3.0.0 - stack-utils: 2.0.5 + stack-utils: 2.0.6 dev: true - /jest-util/29.0.3: - resolution: {integrity: sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==} + /jest-util/29.3.1: + resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.0.3 - '@types/node': 18.7.21 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 - ci-info: 3.4.0 + ci-info: 3.7.0 graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true @@ -2776,10 +2780,10 @@ packages: sourcemap-codec: 1.4.8 dev: true - /manten/0.3.0: - resolution: {integrity: sha512-Z6Eqv9HIVcKCAv/+8i3uSvABzw9fIW3ZKlRbBrRbgQhRJE5Eg4XK7pSv1pxBsiBczop9fZz2upcDh7gT5n6zyw==} + /manten/0.5.0: + resolution: {integrity: sha512-IDy6DR457piGAZzTGSxyVbNJc992wLKSsjdUFUn7V/taFfjoLkTbSG93p62Y/TDI5i2SVaLEQGNx0mzUu9kMQw==} dependencies: - expect: 29.0.3 + expect: 29.3.1 dev: true /mdast-util-from-markdown/0.8.5: @@ -3232,8 +3236,8 @@ packages: react-is: 18.2.0 dev: true - /pretty-format/29.0.3: - resolution: {integrity: sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==} + /pretty-format/29.3.1: + resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.0.0 @@ -3546,8 +3550,8 @@ packages: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /stack-utils/2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 diff --git a/src/loaders.ts b/src/loaders.ts index 8fffa62..695c191 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -163,12 +163,21 @@ export const resolve: resolve = async function ( error instanceof Error && !recursiveCall ) { - if ((error as any).code === 'ERR_UNSUPPORTED_DIR_IMPORT') { - return await tryDirectory(specifier, context, defaultResolve); + const { code } = error as any; + if (code === 'ERR_UNSUPPORTED_DIR_IMPORT') { + try { + return await tryDirectory(specifier, context, defaultResolve); + } catch (error_) { + if ((error_ as any).code !== 'ERR_PACKAGE_IMPORT_NOT_DEFINED') { + throw error_; + } + } } - if ((error as any).code === 'ERR_MODULE_NOT_FOUND') { - return await tryExtensions(specifier, context, defaultResolve); + if (code === 'ERR_MODULE_NOT_FOUND') { + try { + return await tryExtensions(specifier, context, defaultResolve); + } catch {} } } diff --git a/tests/fixtures/package-module/package.json b/tests/fixtures/package-module/package.json index bedb411..b1cecd9 100644 --- a/tests/fixtures/package-module/package.json +++ b/tests/fixtures/package-module/package.json @@ -1,3 +1,14 @@ { - "type": "module" + "type": "module", + "imports": { + "#directory": "./lib/esm-ext-js", + + "#directory-star": "./lib/esm-ext-js", + "#directory-star/*": "./lib/esm-ext-js/*", + + "#file-star": "./lib/ts-ext-ts/index", + "#file-star*": "./lib/ts-ext-ts/index*", + + "#non-existent": "./lib/non-existent" + } } diff --git a/tests/index.ts b/tests/index.ts index 5a2ff82..657d0ac 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -42,6 +42,10 @@ const nodeVersions = [ import('./specs/data'), node, ); + runTestSuite( + import('./specs/import-map'), + node, + ); }); runTestSuite( diff --git a/tests/specs/import-map.ts b/tests/specs/import-map.ts new file mode 100644 index 0000000..02b63fb --- /dev/null +++ b/tests/specs/import-map.ts @@ -0,0 +1,69 @@ +import { testSuite, expect } from 'manten'; +import type { NodeApis } from '../utils/node-with-loader'; +import { assertError, assertNotFound } from '../utils/assertions'; + +export default testSuite(async ({ describe }, node: NodeApis) => { + describe('Import map', ({ describe }) => { + describe('Directory with star', ({ describe }) => { + describe('Resolves directory', ({ test }) => { + const importPath = '#directory-star'; + + test('Import', async () => { + const nodeProcess = await node.import(importPath); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + + test('TypeScript Import', async () => { + const nodeProcess = await node.import(importPath, { typescript: true }); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + }); + + describe('Resolves extension', ({ test }) => { + const importPath = '#directory-star/index'; + + test('Import', async () => { + const nodeProcess = await node.import(importPath); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + + test('TypeScript Import', async () => { + const nodeProcess = await node.import(importPath, { typescript: true }); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + }); + }); + + describe('File with star', ({ describe }) => { + describe('Resolves extension', ({ test }) => { + const importPath = '#file-star'; + + test('Import', async () => { + const nodeProcess = await node.import(importPath); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + + test('TypeScript Import', async () => { + const nodeProcess = await node.import(importPath, { typescript: true }); + expect(nodeProcess.stdout).toMatch('loaded'); + }); + }); + }); + + describe('Errors', ({ test }) => { + test('Directory', async () => { + const nodeProcess = await node.import('#directory'); + assertError( + nodeProcess.stderr, + 'ERR_UNSUPPORTED_DIR_IMPORT', + '/lib/esm-ext-js', + ); + }); + + test('Non-existent', async () => { + const nodeProcess = await node.import('#non-existent'); + assertNotFound(nodeProcess.stderr, '/lib/non-existent'); + }); + }); + }); +}); diff --git a/tests/utils/assertions.ts b/tests/utils/assertions.ts index 126afe9..4d1d698 100644 --- a/tests/utils/assertions.ts +++ b/tests/utils/assertions.ts @@ -8,12 +8,20 @@ const agnosticPath = (path: string) => ( : path ); -export const assertNotFound = ( +export const assertError = ( stderr: string, + error: string, modulePath: string, ) => { - expect(stderr).toMatch('ERR_MODULE_NOT_FOUND'); + expect(stderr).toMatch(error); const nonRelativePath = modulePath.startsWith('.') ? modulePath.slice(1) : modulePath; expect(stderr).toMatch(agnosticPath(`${nonRelativePath}'`)); }; + +export const assertNotFound = ( + stderr: string, + modulePath: string, +) => { + assertError(stderr, 'ERR_MODULE_NOT_FOUND', modulePath); +};