Skip to content

Commit 0d263e3

Browse files
committed
Add example
1 parent 18b3a80 commit 0d263e3

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

doc/design/helpers.md

+42
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,48 @@ A user loader that defines a hook might need to reimplement all of Node’s orig
44

55
These will be added in stages, starting with helpers for the `resolve` hook that cover the various steps that Node’s internal `resolve` performs.
66

7+
## Usage
8+
9+
The intended usage for these helpers is to eliminate boilerplate within user-defined hooks. For example:
10+
11+
```js
12+
import { isBareSpecifier, packageResolve } from 'node:module';
13+
import { readFileSync } from 'node:fs';
14+
import { join } from 'node:path';
15+
import { fileURLToPath, pathToFileURL } from 'node:url';
16+
17+
18+
const needsTranspilation = new Set();
19+
20+
export function resolve(specifier, context, next) {
21+
if (!isBareSpecifier(specifier)) {
22+
return next(specifier, context);
23+
}
24+
25+
const pathToPackage = fileURLToPath(packageResolve(specifier, context.parentURL, context.conditions));
26+
const pathToPackageJson = join(pathToPackage, 'package.json');
27+
const packageMetadata = JSON.parse(readFileSync(pathToPackageJson, 'utf-8'));
28+
29+
if (!packageMetadata.exports && packageMetadata.module) {
30+
// If this package has a "module" field but no "exports" field,
31+
// return the value of "module" and transpile later
32+
// within a `load` hook
33+
return {
34+
url: pathToFileURL(join(pathToPackage, packageMetadata.module))
35+
}
36+
}
37+
}
38+
39+
export async function load(url, context, next) {
40+
if (!needsTranspilation.has(url)) {
41+
return next(url, context);
42+
}
43+
44+
// TODO: Transpile the faux-ESM in the "module" URL
45+
// and return the transpiled, runnable ESM source
46+
}
47+
```
48+
749
## `resolve` helpers
850

951
### `packageResolve`

0 commit comments

Comments
 (0)