From 7f092e77a66c0710fc694b5ec9d6f08e36f90c8f Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 28 Nov 2024 00:00:01 -0600 Subject: [PATCH] chore: Replace `require.resolve` with `import.meta.resolve` (#1221) --- packages/wxt/build.config.ts | 8 ++++++++ packages/wxt/e2e/tests/zip.test.ts | 1 + packages/wxt/e2e/utils.ts | 1 + packages/wxt/src/core/resolve-config.ts | 24 ++++++++++++------------ packages/wxt/src/core/utils/eslint.ts | 9 ++++----- packages/wxt/vitest.setup.ts | 3 +++ 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/packages/wxt/build.config.ts b/packages/wxt/build.config.ts index 48fa5ccc..b558859a 100644 --- a/packages/wxt/build.config.ts +++ b/packages/wxt/build.config.ts @@ -6,6 +6,10 @@ import { virtualModuleNames, } from './src/core/utils/virtual-modules'; +const replace = { + __vite_ssr_import_meta__: 'undefined', +}; + export default defineBuildConfig([ // Non-virtual modules can be transpiled with mkdist { @@ -15,8 +19,12 @@ export default defineBuildConfig([ input: 'src', pattern: ['**/*', '!**/__tests__', '!**/*.md', '!virtual', '!@types'], declaration: true, + esbuild: { + define: replace, + }, }, ], + replace, hooks: { async 'build:done'() { // Replace any template variables in output files diff --git a/packages/wxt/e2e/tests/zip.test.ts b/packages/wxt/e2e/tests/zip.test.ts index 3ff265aa..20b5677e 100644 --- a/packages/wxt/e2e/tests/zip.test.ts +++ b/packages/wxt/e2e/tests/zip.test.ts @@ -63,6 +63,7 @@ describe('Zipping', () => { "name": "test", "description": "Example description", "version": "1.0.0", + "type": "module", "dependencies": { "wxt": "../../../../..", "flatten": "1.0.3" diff --git a/packages/wxt/e2e/utils.ts b/packages/wxt/e2e/utils.ts index 8a44c985..a58fdffe 100644 --- a/packages/wxt/e2e/utils.ts +++ b/packages/wxt/e2e/utils.ts @@ -39,6 +39,7 @@ export class TestProject { name: 'E2E Extension', description: 'Example description', version: '0.0.0', + type: 'module', dependencies: { wxt: '../../..', }, diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts index cd989121..3977459b 100644 --- a/packages/wxt/src/core/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -28,6 +28,7 @@ import { getEslintVersion } from './utils/eslint'; import { safeStringToNumber } from './utils/number'; import { loadEnv } from './utils/env'; import { getPort } from 'get-port-please'; +import { fileURLToPath } from 'node:url'; /** * Given an inline config, discover the config file if necessary, merge the results, resolve any @@ -403,20 +404,10 @@ async function getUnimportEslintOptions( * Returns the path to `node_modules/wxt`. */ async function resolveWxtModuleDir() { - // TODO: Use this once we're fully running in ESM, see https://github.com/wxt-dev/wxt/issues/277 - // const url = import.meta.resolve('wxt', import.meta.url); + const url = import.meta.resolve('wxt', import.meta.url); // resolve() returns the "wxt/dist/index.mjs" file, not the package's root // directory, which we want to return from this function. - // return path.resolve(fileURLToPath(url), '../..'); - - const requireResolve = - globalThis.require?.resolve ?? - (await import('node:module')).default.createRequire(import.meta.url) - .resolve; - - // resolve() returns the "wxt/dist/index.mjs" file, not the package's root - // directory, which we want to return from this function. - return path.resolve(requireResolve('wxt'), '../..'); + return path.resolve(fileURLToPath(url), '../..'); } async function isDirMissing(dir: string) { @@ -514,3 +505,12 @@ export async function resolveWxtUserModules( ); return [...npmModules, ...localModules]; } + +// Mock `import.meta.resolve` in tests +// @ts-expect-error +if (typeof __vite_ssr_import_meta__ !== 'undefined') { + // @ts-expect-error: Untyped global defined by Vitest + __vite_ssr_import_meta__.resolve = (path: string) => + // @ts-expect-error: vitestCreateRequire defined in vitest.setup.ts + 'file://' + vitestCreateRequire(import.meta.url).resolve(path); +} diff --git a/packages/wxt/src/core/utils/eslint.ts b/packages/wxt/src/core/utils/eslint.ts index 798a38fe..ea037900 100644 --- a/packages/wxt/src/core/utils/eslint.ts +++ b/packages/wxt/src/core/utils/eslint.ts @@ -1,10 +1,9 @@ +const ESLINT_PACKAGE_NAME = 'eslint'; + export async function getEslintVersion(): Promise { try { - const require = (await import('node:module')).default.createRequire( - import.meta.url, - ); - const { ESLint } = require('eslint'); - return ESLint.version?.split('.') ?? []; + const { version } = await import(ESLINT_PACKAGE_NAME); + return version.split('.') ?? []; } catch { // Return an empty version when there's an error importing ESLint return []; diff --git a/packages/wxt/vitest.setup.ts b/packages/wxt/vitest.setup.ts index a828762f..77a4c17f 100644 --- a/packages/wxt/vitest.setup.ts +++ b/packages/wxt/vitest.setup.ts @@ -1,5 +1,8 @@ import { fakeBrowser } from '@webext-core/fake-browser'; import { vi } from 'vitest'; +import { createRequire } from 'node:module'; vi.stubGlobal('chrome', fakeBrowser); vi.stubGlobal('browser', fakeBrowser); + +vi.stubGlobal('vitestCreateRequire', createRequire);