Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: add for new node resolver
  • Loading branch information
SukkaW committed Dec 18, 2024
commit 1be95ccf67fb3bb75f5bec3e824ea39be774306f
55 changes: 44 additions & 11 deletions src/node-resolver.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { fileURLToPath, pathToFileURL } from "url";
import type { NewResolver } from "./types";

import type { ErrnoException } from '@dual-bundle/import-meta-resolve' with { "resolution-mode": "import" };
import { fileURLToPath, pathToFileURL } from "url";
import fs from "fs";
import { createRequire } from "module";

const importMetaResolveExports: typeof import('@dual-bundle/import-meta-resolve', { with: { "resolution-mode": "import" } }) = require('@dual-bundle/import-meta-resolve');
const { moduleResolve } = importMetaResolveExports;
import type { ErrnoException, moduleResolve as $moduleResolve } from '@dual-bundle/import-meta-resolve' with { "resolution-mode": "import" };
const importMetaResolveExports = require('@dual-bundle/import-meta-resolve');
const moduleResolve = importMetaResolveExports.moduleResolve as typeof $moduleResolve;

interface NodeResolverOptions {
/**
Expand Down Expand Up @@ -45,17 +47,48 @@ export function createNodeResolver({
conditions,
preserveSymlinks
);

if (found.protocol === 'file:') {
if (fs.existsSync(found)) {
return {
found: true,
path: fileURLToPath(found),
};
}
} else if (found.protocol === 'node:' || found.protocol === 'data:') {
return {
found: true,
path: null
}
}
return {
found: true,
path: fileURLToPath(found),
};
found: false
}
} catch (error) {
if (assertErrNoException(error) && error.code === 'ERR_MODULE_NOT_FOUND') {
return {
found: false,
if (assertErrNoException(error)) {
if (error.code === 'ERR_MODULE_NOT_FOUND') {
return {
found: false,
}
}
if (error.code === 'ERR_UNSUPPORTED_DIR_IMPORT') {
const $require = createRequire(sourceFile);
try {
const resolved = $require.resolve(modulePath);
return {
found: true,
path: resolved,
}
} catch {
return {
found: false,
}
}
}
}
return {
found: false,
}
throw error;
}
}
}
Expand Down
45 changes: 45 additions & 0 deletions test/node-resolver.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import path from 'node:path'
import { cwd } from 'node:process'
import { createNodeResolver } from '../src/node-resolver';

const resolver = createNodeResolver()

function expectResolve(source: string, expected: boolean | string) {
it(`${source} => ${expected}`, () => {
try {
console.log({ source, expected, requireResolve: require.resolve(source, { paths: [__dirname] }) })

} catch {
console.log({ source, expected, requireResolve: null })
}
const result = resolver.resolve(source, __filename);
console.log({ source, expected, result })

if (typeof expected === 'string') {
expect(result.path).toBe(path.resolve(cwd(), expected))
} else {
expect(result.found).toBe(expected)
}
})
}

describe('builtin', () => {
expectResolve('path', true)
expectResolve('node:path', true)
})

describe('modules', () => {
expectResolve('jest', true)
expectResolve('@sukka/does-not-exists', false)
})

describe('relative', () => {
expectResolve('../package.json', 'package.json')
expectResolve('../.github/dependabot.yml', false)
expectResolve('../babel.config.js', 'babel.config.js')
expectResolve('../test/index.js', 'test/index.js')
expectResolve('../test/', 'test/index.js')
expectResolve('../test', 'test/index.js')

expectResolve('../inexistent.js', false)
})