Skip to content

Commit 16085ff

Browse files
committed
Switch to ESM
1 parent 9c3c679 commit 16085ff

7 files changed

Lines changed: 47 additions & 37 deletions

File tree

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ npm install resolve-dependency-path
1212

1313
## Usage
1414

15+
### ESM
16+
1517
```js
16-
const resolvePath = require('resolve-dependency-path');
18+
import resolvePath from 'resolve-dependency-path';
1719

1820
const resolved = resolvePath({
1921
dependency: './foobar',
@@ -22,6 +24,12 @@ const resolved = resolvePath({
2224
});
2325
```
2426

27+
### CommonJS
28+
29+
```js
30+
const { default: resolvePath } = require('resolve-dependency-path');
31+
```
32+
2533
### Options
2634

2735
| Option | Type | Required | Description |

index.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Resolve a dependency specifier to an absolute file path.
3+
*
4+
* @param {object} options
5+
* @param {string} options.dependency - The dependency specifier (e.g. `'./bar'` or `'lodash'`)
6+
* @param {string} options.filename - Absolute or relative path of the file that contains the dependency
7+
* @param {string} options.directory - Root directory used to resolve non-relative dependencies
8+
* @returns {string} Resolved absolute path including the inferred file extension
9+
* @throws {Error} When any of the required options is missing or falsy
10+
*/
11+
export default function resolveDependencyPath({ dependency, filename, directory }?: {
12+
dependency: string;
13+
filename: string;
14+
directory: string;
15+
}): string;

index.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
'use strict';
2-
3-
const path = require('node:path');
1+
import path from 'node:path';
42

53
/**
64
* Resolve a dependency specifier to an absolute file path.
@@ -12,7 +10,7 @@ const path = require('node:path');
1210
* @returns {string} Resolved absolute path including the inferred file extension
1311
* @throws {Error} When any of the required options is missing or falsy
1412
*/
15-
module.exports = function({ dependency, filename, directory } = {}) {
13+
export default function resolveDependencyPath({ dependency, filename, directory } = {}) {
1614
if (!dependency) throw new Error('dependency path not given');
1715
if (!filename) throw new Error('filename not given');
1816
if (!directory) throw new Error('directory not given');
@@ -21,7 +19,7 @@ module.exports = function({ dependency, filename, directory } = {}) {
2119
const extension = getDependencyExtension(dependency, filename);
2220

2321
return filepath + extension;
24-
};
22+
}
2523

2624
/**
2725
* @param {string} dependency

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22
"name": "resolve-dependency-path",
33
"version": "4.0.1",
44
"description": "Convert a dependency path into a filepath",
5-
"main": "index.js",
5+
"type": "module",
6+
"exports": {
7+
".": {
8+
"types": "./index.d.ts",
9+
"default": "./index.js"
10+
}
11+
},
612
"files": [
7-
"index.js"
13+
"index.js",
14+
"index.d.ts"
815
],
916
"scripts": {
1017
"lint": "xo",
@@ -29,7 +36,7 @@
2936
},
3037
"homepage": "https://github.com/dependents/node-resolve-dependency-path",
3138
"engines": {
32-
"node": ">=20"
39+
"node": ">=20.19.0 || >=22.12.0"
3340
},
3441
"devDependencies": {
3542
"c8": "^11.0.0",

test/test.js

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
'use strict';
1+
import assert from 'node:assert/strict';
2+
import path from 'node:path';
3+
import { fileURLToPath } from 'node:url';
4+
import { suite } from 'uvu';
5+
import resolvePath from '../index.js';
26

3-
const assert = require('node:assert').strict;
4-
const path = require('node:path');
5-
const { suite } = require('uvu');
6-
const resolvePath = require('../index.js');
7+
const directory = fileURLToPath(new URL('.', import.meta.url));
78

89
const test = suite('resolve-dependency-path');
910
const multiPeriod = suite('multiple period filenames');
@@ -27,22 +28,20 @@ test('throws if the directory is missing', () => {
2728
assert.throws(() => {
2829
resolvePath({
2930
dependency: './bar',
30-
filename: path.join(__dirname, '/foo.js')
31+
filename: path.join(directory, '/foo.js')
3132
});
3233
}, /^Error: directory not given$/);
3334
});
3435

3536
test('resolves with absolute paths', () => {
3637
const dependency = './bar';
37-
const directory = __dirname;
3838
const filename = path.join(directory, '/foo.js');
3939
const resolved = resolvePath({ dependency, filename, directory });
4040
assert.equal(resolved.startsWith(directory), true);
4141
});
4242

4343
test('resolves w/initial period, w/ending in .js', () => {
4444
const dependency = './index';
45-
const directory = __dirname;
4645
const filename = path.join(directory, '/foo.js');
4746
const resolved = resolvePath({ dependency, filename, directory });
4847
const expected = path.join(directory, '/index.js');
@@ -51,7 +50,6 @@ test('resolves w/initial period, w/ending in .js', () => {
5150

5251
test('resolves w/initial period, w/o ending in .js', () => {
5352
const dependency = './index.js';
54-
const directory = __dirname;
5553
const filename = path.join(directory, '/foo.js');
5654
const resolved = resolvePath({ dependency, filename, directory });
5755
const expected = path.join(directory, '/index.js');
@@ -60,7 +58,6 @@ test('resolves w/initial period, w/o ending in .js', () => {
6058

6159
test('resolves w/o initial period, w/o ending in .js', () => {
6260
const dependency = 'index';
63-
const directory = __dirname;
6461
const filename = path.join(directory, '/foo.js');
6562
const resolved = resolvePath({ dependency, filename, directory });
6663
const expected = path.join(directory, '/index.js');
@@ -69,7 +66,6 @@ test('resolves w/o initial period, w/o ending in .js', () => {
6966

7067
test('resolves w/o initial period, w/ending in .js', () => {
7168
const dependency = 'index.js';
72-
const directory = __dirname;
7369
const filename = path.join(directory, '/foo.js');
7470
const resolved = resolvePath({ dependency, filename, directory });
7571
const expected = path.join(directory, '/index.js');
@@ -78,7 +74,6 @@ test('resolves w/o initial period, w/ending in .js', () => {
7874

7975
test('resolves relative paths', () => {
8076
const dependency = './bar.js';
81-
const directory = __dirname;
8277
const filename = path.join(directory, '/foo.js');
8378
const resolved = resolvePath({ dependency, filename, directory });
8479
const expected = path.join(directory, '/bar.js');
@@ -87,7 +82,6 @@ test('resolves relative paths', () => {
8782

8883
test('resolves non-relative paths', () => {
8984
const dependency = 'feature2/bar';
90-
const directory = __dirname;
9185
const filename = path.join(directory, '/feature1/foo.js');
9286
const resolved = resolvePath({ dependency, filename, directory });
9387
const expected = path.join(directory, '/feature2/bar.js');
@@ -96,7 +90,6 @@ test('resolves non-relative paths', () => {
9690

9791
multiPeriod('resolves with multiple periods in the dependency path', () => {
9892
const dependency = './bar.baz.qux';
99-
const directory = __dirname;
10093
const filename = path.join(directory, '/foo.js');
10194
const resolved = resolvePath({ dependency, filename, directory });
10295
const expected = path.join(directory, '/bar.baz.qux.js');
@@ -105,7 +98,6 @@ multiPeriod('resolves with multiple periods in the dependency path', () => {
10598

10699
multiPeriod('does not duplicate extensions', () => {
107100
const dependency = '../index.js';
108-
const directory = __dirname;
109101
const filename = path.join(directory, '/foo.js');
110102
const resolved = resolvePath({ dependency, filename, directory });
111103
// Extension after removing the .js extension
@@ -115,55 +107,48 @@ multiPeriod('does not duplicate extensions', () => {
115107

116108
multiPeriod('does not add the incorrect extension for sass files', () => {
117109
const dependency = 'styles';
118-
const directory = __dirname;
119110
const filename = path.join(directory, '/foo.scss');
120111
const resolved = resolvePath({ dependency, filename, directory });
121112
assert.equal(path.extname(resolved), '.scss');
122113
});
123114

124115
multiPeriod('does not add the incorrect extension for mustache files', () => {
125116
const dependency = 'hgn!templates/foo.mustache';
126-
const directory = __dirname;
127117
const filename = path.join(directory, '/foo.js');
128118
const resolved = resolvePath({ dependency, filename, directory });
129119
assert.equal(path.extname(resolved), '.mustache');
130120
});
131121

132122
implicitPlugins('resolve w/initial period', () => {
133123
const dependency = './templates/file.css!';
134-
const directory = __dirname;
135124
const filename = path.join(directory, '/foo.js');
136125
const resolved = resolvePath({ dependency, filename, directory });
137126
assert.equal(path.extname(resolved), '.css');
138127
});
139128

140129
implicitPlugins('resolve w/o initial period', () => {
141130
const dependency = 'templates/file.css!';
142-
const directory = __dirname;
143131
const filename = path.join(directory, '/foo.js');
144132
const resolved = resolvePath({ dependency, filename, directory });
145133
assert.equal(path.extname(resolved), '.css');
146134
});
147135

148136
explicitPlugins('resolve w/initial period', () => {
149137
const dependency = './templates/file.txt!text';
150-
const directory = __dirname;
151138
const filename = path.join(directory, '/foo.js');
152139
const resolved = resolvePath({ dependency, filename, directory });
153140
assert.equal(path.extname(resolved), '.txt');
154141
});
155142

156143
explicitPlugins('resolve w/o initial period', () => {
157144
const dependency = 'templates/file.txt!text';
158-
const directory = __dirname;
159145
const filename = path.join(directory, '/foo.js');
160146
const resolved = resolvePath({ dependency, filename, directory });
161147
assert.equal(path.extname(resolved), '.txt');
162148
});
163149

164150
webpackSupport.skip('resolves properly', () => {
165151
const dependency = './styles/foo.css';
166-
const directory = __dirname;
167152
const filename = path.join(directory, '/foo.js');
168153
const resolved = resolvePath({ dependency, filename, directory });
169154
assert.equal(path.extname(resolved), '.css');

xo.config.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
'use strict';
2-
3-
module.exports = [
1+
export default [
42
{
53
ignores: [
4+
'index.d.ts',
65
'test/fixtures/**'
76
]
87
},
@@ -46,8 +45,6 @@ module.exports = [
4645
],
4746
'prefer-template': 'error',
4847
'require-unicode-regexp': 'off',
49-
'unicorn/no-anonymous-default-export': 'off',
50-
'unicorn/prefer-module': 'off',
5148
'unicorn/prefer-top-level-await': 'off',
5249
'unicorn/prevent-abbreviations': 'off'
5350
}

0 commit comments

Comments
 (0)