From 43c67e16a60f61e90e78e97aa20a22b7f68c7c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Thu, 18 Apr 2024 03:33:18 +0800 Subject: [PATCH] feat: support node built-in module --- src/core/index.ts | 13 +++++++++++-- tests/__snapshots__/fixtures.test.ts.snap | 8 ++++++++ tests/fixtures/node-builtin.js | 7 +++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/node-builtin.js diff --git a/src/core/index.ts b/src/core/index.ts index 5a2f9f0..36dac12 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,3 +1,4 @@ +import { builtinModules } from 'node:module' import { type ImportBinding, type WithScope, @@ -99,8 +100,16 @@ export async function transformMacros({ const binding = imports.get(local)! const [, resolved] = await runner.resolveUrl(binding.source, id) - const module = await runner.executeFile(resolved) - let exported: any = module + let exported + if ( + resolved.startsWith('node:') || + builtinModules.includes(resolved.split('/')[0]) + ) { + exported = await import(resolved) + } else { + const module = await runner.executeFile(resolved) + exported = module + } const props = [...keys] if (binding.imported !== '*') props.unshift(binding.imported) diff --git a/tests/__snapshots__/fixtures.test.ts.snap b/tests/__snapshots__/fixtures.test.ts.snap index b3b9719..d673612 100644 --- a/tests/__snapshots__/fixtures.test.ts.snap +++ b/tests/__snapshots__/fixtures.test.ts.snap @@ -47,6 +47,14 @@ exports[`fixture > tests/fixtures/nested-object.js 1`] = ` " `; +exports[`fixture > tests/fixtures/node-builtin.js 1`] = ` +""LE" === 'LE' +;("* text=auto eol=lf\\n") === + // prettier-ignore + "* text=auto eol=lf\\n"; +" +`; + exports[`fixture > tests/fixtures/non-macros.js 1`] = ` "function getRandom() { return Math.random() diff --git a/tests/fixtures/node-builtin.js b/tests/fixtures/node-builtin.js new file mode 100644 index 0000000..8d29f07 --- /dev/null +++ b/tests/fixtures/node-builtin.js @@ -0,0 +1,7 @@ +import { endianness } from 'node:os' with { type: 'macro' } +import { readFile } from 'fs/promises' with { type: 'macro' } + +endianness() === 'LE' +;(await readFile('.gitattributes', { encoding: 'utf8' })) === + // prettier-ignore + "* text=auto eol=lf\n"