From 4faa3b34939b7cd3d015a32503d3cfdf8648ca88 Mon Sep 17 00:00:00 2001 From: Aaron Klinker Date: Sat, 24 Jun 2023 08:50:20 -0500 Subject: [PATCH] fix: Root path customization now works --- package.json | 2 +- src/utils/findEntrypoints.ts | 5 +++-- src/utils/getInternalConfig.ts | 13 +++++++++---- src/utils/importTsFile.ts | 4 ++-- src/utils/resolveFile.ts | 24 ------------------------ src/vite-plugins/unimport.ts | 2 +- src/vite-plugins/virtualEntrypoint.ts | 12 +++++++++--- 7 files changed, 25 insertions(+), 37 deletions(-) delete mode 100644 src/utils/resolveFile.ts diff --git a/package.json b/package.json index 15c50341..54dd17d6 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ } }, "scripts": { - "dev": "tsx src/cli.ts", + "exvite": "tsx src/cli/index.ts", "build": "run-s -s build:*", "build:js": "tsup src/index.ts --sourcemap --dts --format esm,cjs", "build:cli": "tsup src/cli/index.ts -d dist/cli --sourcemap", diff --git a/src/utils/findEntrypoints.ts b/src/utils/findEntrypoints.ts index 7d1aa401..c30227c1 100644 --- a/src/utils/findEntrypoints.ts +++ b/src/utils/findEntrypoints.ts @@ -158,7 +158,7 @@ async function getBackgroundEntrypoint( path: string, ): Promise { const { main: _, ...options } = - await importTsFile(path); + await importTsFile(config.root, path); if (options == null) { throw Error('Background script does not have a default export'); } @@ -180,6 +180,7 @@ async function getContentScriptEntrypoint( path: string, ): Promise { const { main: _, ...options } = await importTsFile( + config.root, path, ); if (options == null) { @@ -238,5 +239,5 @@ const PATH_GLOB_TO_TYPE_MAP: Record = { export type FindEntrypointsConfig = Pick< InternalConfig, - 'entrypointsDir' | 'outDir' | 'logger' | 'mode' | 'command' + 'root' | 'entrypointsDir' | 'outDir' | 'logger' | 'mode' | 'command' >; diff --git a/src/utils/getInternalConfig.ts b/src/utils/getInternalConfig.ts index c227ac5c..ff5adcca 100644 --- a/src/utils/getInternalConfig.ts +++ b/src/utils/getInternalConfig.ts @@ -43,11 +43,12 @@ export async function getInternalConfig( // Load user config from file let userConfig: UserConfig = { - mode: config.mode, + mode, }; if (config.configFile !== false) { userConfig = await importTsFile( - path.resolve(config.configFile ?? 'exvite.config.ts'), + root, + path.resolve(root, config.configFile ?? 'exvite.config.ts'), ); } @@ -92,8 +93,12 @@ export async function getInternalConfig( finalConfig.vite.plugins.push(plugins.download(finalConfig)); finalConfig.vite.plugins.push(plugins.devHtmlPrerender(finalConfig)); finalConfig.vite.plugins.push(plugins.unimport(finalConfig)); - finalConfig.vite.plugins.push(plugins.virtualEntrypoin('background')); - finalConfig.vite.plugins.push(plugins.virtualEntrypoin('content-script')); + finalConfig.vite.plugins.push( + plugins.virtualEntrypoin('background', finalConfig), + ); + finalConfig.vite.plugins.push( + plugins.virtualEntrypoin('content-script', finalConfig), + ); finalConfig.vite.define ??= {}; getGlobals(finalConfig).forEach((global) => { diff --git a/src/utils/importTsFile.ts b/src/utils/importTsFile.ts index 4e7bc2b7..02962c71 100644 --- a/src/utils/importTsFile.ts +++ b/src/utils/importTsFile.ts @@ -4,9 +4,9 @@ import transform from 'jiti/dist/babel'; import { resolve } from 'path'; import { scanExports } from 'unimport'; -export async function importTsFile(path: string): Promise { +export async function importTsFile(root: string, path: string): Promise { const clientImports = await scanExports( - resolve('node_modules/exvite/dist/client/index.js'), + resolve(root, 'node_modules/exvite/dist/client/index.js'), ); const jiti = createJITI(__filename, { cache: false, diff --git a/src/utils/resolveFile.ts b/src/utils/resolveFile.ts deleted file mode 100644 index 9be89fd1..00000000 --- a/src/utils/resolveFile.ts +++ /dev/null @@ -1,24 +0,0 @@ -import p from 'node:path'; -import fs from 'fs-extra'; - -/** - * Given a root and path, resolve absolute path to the file. - * - * - If the path is absolute, return the path. - * - If the file exists at `path.resolve(root, ...path)`, return that path - * - If the file exists at `path.resolve(...path)`, return that path - * - If the file doesn't exist, return `undefined`. - * - * Any files in the root directory with the specified path take precidence over files in the CWD - * with the same path. - */ -export async function resolveFile( - root: string, - path: string, -): Promise { - const rootPath = p.resolve(root, path); - if (await fs.exists(rootPath)) return rootPath; - - const cwdPath = p.resolve(process.cwd(), path); - if (await fs.exists(cwdPath)) return cwdPath; -} diff --git a/src/vite-plugins/unimport.ts b/src/vite-plugins/unimport.ts index fb3b28fe..6690e348 100644 --- a/src/vite-plugins/unimport.ts +++ b/src/vite-plugins/unimport.ts @@ -13,7 +13,7 @@ export function unimport(config: InternalConfig): Plugin { return { name: 'exvite:unimport', async config() { - await unimport.scanImportsFromDir(); + await unimport.scanImportsFromDir(undefined, { cwd: config.srcDir }); }, async transform(code, id) { return unimport.injectImports(code, id); diff --git a/src/vite-plugins/virtualEntrypoint.ts b/src/vite-plugins/virtualEntrypoint.ts index 2dcbcc6f..66225b5f 100644 --- a/src/vite-plugins/virtualEntrypoint.ts +++ b/src/vite-plugins/virtualEntrypoint.ts @@ -1,12 +1,15 @@ import { Plugin } from 'vite'; -import { Entrypoint } from '../types'; +import { Entrypoint, InternalConfig } from '../types'; import fs from 'fs-extra'; import { resolve } from 'path'; /** * Wraps a user's entrypoint with a vitual version with additional logic. */ -export function virtualEntrypoin(type: Entrypoint['type']): Plugin { +export function virtualEntrypoin( + type: Entrypoint['type'], + config: InternalConfig, +): Plugin { const virtualId = `virtual:exvite-${type}?`; const resolvedVirtualId = `\0${virtualId}`; @@ -26,7 +29,10 @@ export function virtualEntrypoin(type: Entrypoint['type']): Plugin { const inputPath = id.replace(resolvedVirtualId, ''); const template = await fs.readFile( - resolve(`node_modules/exvite/templates/virtual-${type}.ts`), + resolve( + config.root, + `node_modules/exvite/templates/virtual-${type}.ts`, + ), 'utf-8', ); return template.replaceAll('{{moduleId}}', inputPath);