From 286e6fda284eaf365af11381dd26d03eae216036 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:49:53 +0900 Subject: [PATCH] test: convert resolve-config playground to unit tests --- .../vite/src/node/__tests__/config.spec.ts | 106 +++++++++++++++++- .../config/loadConfigFromFile/.gitkeep | 0 .../__tests__/resolve-config.spec.ts | 69 ------------ playground/resolve-config/__tests__/serve.ts | 48 -------- playground/resolve-config/package.json | 11 -- playground/resolve-config/root/index.js | 1 - playground/resolve-config/root/vite.config.ts | 12 -- pnpm-lock.yaml | 2 - 8 files changed, 104 insertions(+), 145 deletions(-) create mode 100644 packages/vite/src/node/__tests__/fixtures/config/loadConfigFromFile/.gitkeep delete mode 100644 playground/resolve-config/__tests__/resolve-config.spec.ts delete mode 100644 playground/resolve-config/__tests__/serve.ts delete mode 100644 playground/resolve-config/package.json delete mode 100644 playground/resolve-config/root/index.js delete mode 100644 playground/resolve-config/root/vite.config.ts diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index 82f4a3973085f8..1db45d48519f7e 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -1,8 +1,10 @@ import http from 'node:http' -import { describe, expect, test } from 'vitest' +import path from 'node:path' +import fs from 'node:fs' +import { afterEach, describe, expect, test } from 'vitest' import type { InlineConfig, PluginOption } from '..' import type { UserConfig, UserConfigExport } from '../config' -import { defineConfig, resolveConfig } from '../config' +import { defineConfig, loadConfigFromFile, resolveConfig } from '../config' import { resolveEnvPrefix } from '../env' import { createLogger, mergeConfig } from '../publicUtils' @@ -607,3 +609,103 @@ test('preTransformRequests', async () => { } `) }) + +describe('loadConfigFromFile', () => { + const root = path.resolve(__dirname, './fixtures/config/loadConfigFromFile') + + let writtenConfig: string | undefined + afterEach(() => { + if (writtenConfig) { + fs.unlinkSync(path.resolve(root, writtenConfig)) + } + fs.unlinkSync(path.resolve(root, 'package.json')) + }) + + const writeConfig = (fileName: string, content: string) => { + fs.writeFileSync(path.resolve(root, fileName), content) + writtenConfig = fileName + } + const writePackageJson = (typeField: string | undefined) => { + fs.writeFileSync( + path.resolve(root, 'package.json'), + JSON.stringify({ + name: '@vitejs/test-load-config-from-file', + type: typeField, + }), + ) + } + + const canLoadConfig = async () => { + const result = await loadConfigFromFile( + { command: 'build', mode: 'production' }, + undefined, + root, + ) + expect(result).toBeTruthy() + expect(result?.config).toStrictEqual({ define: { foo: 1 } }) + expect(path.normalize(result!.path)).toBe( + path.resolve(root, writtenConfig!), + ) + } + + const cases = [ + { + fileName: 'vite.config.js', + content: 'export default { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.js', + content: 'export default { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.cjs', + content: 'module.exports = { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.cjs', + content: 'module.exports = { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.mjs', + content: 'export default { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.mjs', + content: 'export default { define: { foo: 1 } }', + }, + { + fileName: 'vite.config.ts', + content: 'export default { define: { foo: 1 as number } }', + }, + { + fileName: 'vite.config.ts', + content: 'export default { define: { foo: 1 as number } }', + }, + { + fileName: 'vite.config.mts', + content: 'export default { define: { foo: 1 as number } }', + }, + { + fileName: 'vite.config.mts', + content: 'export default { define: { foo: 1 as number } }', + }, + { + fileName: 'vite.config.cts', + content: 'module.exports = { define: { foo: 1 as number } }', + }, + { + fileName: 'vite.config.cts', + content: 'module.exports = { define: { foo: 1 as number } }', + }, + ] + + for (const { fileName, content } of cases) { + for (const typeField of [undefined, 'module']) { + test(`load ${fileName}${typeField ? ' with package#type module' : ''}`, async () => { + writePackageJson(typeField) + writeConfig(fileName, content) + await canLoadConfig() + }) + } + } +}) diff --git a/packages/vite/src/node/__tests__/fixtures/config/loadConfigFromFile/.gitkeep b/packages/vite/src/node/__tests__/fixtures/config/loadConfigFromFile/.gitkeep new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/playground/resolve-config/__tests__/resolve-config.spec.ts b/playground/resolve-config/__tests__/resolve-config.spec.ts deleted file mode 100644 index 12f00aa168f142..00000000000000 --- a/playground/resolve-config/__tests__/resolve-config.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import fs from 'node:fs' -import path from 'node:path' -import { execaCommandSync } from 'execa' -import { describe, expect, it } from 'vitest' -import { isBuild, testDir, viteBinPath } from '~utils' - -const fromTestDir = (...p: string[]) => path.resolve(testDir, ...p) - -const build = (configName: string) => { - execaCommandSync(`${viteBinPath} build`, { cwd: fromTestDir(configName) }) -} - -const getDistFile = (configName: string, extension: string) => { - return fs.readFileSync( - fromTestDir(`${configName}/dist/index.${extension}`), - 'utf-8', - ) -} - -describe.runIf(isBuild)('build', () => { - it('loads vite.config.js', () => { - build('js') - expect(getDistFile('js', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.js with package#type module', () => { - build('js-module') - expect(getDistFile('js-module', 'js')).toContain('console.log(true)') - }) - it('loads vite.config.cjs', () => { - build('cjs') - expect(getDistFile('cjs', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.cjs with package#type module', () => { - build('cjs-module') - expect(getDistFile('cjs-module', 'js')).toContain('console.log(true)') - }) - it('loads vite.config.mjs', () => { - build('mjs') - expect(getDistFile('mjs', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.mjs with package#type module', () => { - build('mjs-module') - expect(getDistFile('mjs-module', 'js')).toContain('console.log(true)') - }) - it('loads vite.config.ts', () => { - build('ts') - expect(getDistFile('ts', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.ts with package#type module', () => { - build('ts-module') - expect(getDistFile('ts-module', 'js')).toContain('console.log(true)') - }) - it('loads vite.config.mts', () => { - build('mts') - expect(getDistFile('mts', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.mts with package#type module', () => { - build('mts-module') - expect(getDistFile('mts-module', 'js')).toContain('console.log(true)') - }) - it('loads vite.config.cts', () => { - build('cts') - expect(getDistFile('cts', 'mjs')).toContain('console.log(true)') - }) - it('loads vite.config.cts with package#type module', () => { - build('cts-module') - expect(getDistFile('cts-module', 'js')).toContain('console.log(true)') - }) -}) diff --git a/playground/resolve-config/__tests__/serve.ts b/playground/resolve-config/__tests__/serve.ts deleted file mode 100644 index 93b1f10e683e8e..00000000000000 --- a/playground/resolve-config/__tests__/serve.ts +++ /dev/null @@ -1,48 +0,0 @@ -// this is automatically detected by playground/vitestSetup.ts and will replace -// the default e2e test serve behavior - -import fs from 'node:fs/promises' -import path from 'node:path' -import { isBuild, rootDir } from '~utils' - -const configNames = ['js', 'cjs', 'mjs', 'ts', 'mts', 'cts'] - -export async function serve() { - if (!isBuild) return - - const fromTestDir = (...p: string[]) => path.resolve(rootDir, '..', ...p) - - // create separate directories for all config types: - // ./{js,cjs,mjs,ts} and ./{js,cjs,mjs,ts}-module (with package#type) - for (const configName of configNames) { - const pathToConf = fromTestDir(configName, `vite.config.${configName}`) - - await fs.cp(fromTestDir('root'), fromTestDir(configName), { - recursive: true, - }) - await fs.rename(fromTestDir(configName, 'vite.config.ts'), pathToConf) - - if (['cjs', 'cts'].includes(configName)) { - const conf = await fs.readFile(pathToConf, 'utf-8') - await fs.writeFile( - pathToConf, - conf.replace('export default', 'module.exports = '), - ) - } - - // Remove TS annotation for plain JavaScript file. - if (configName.endsWith('js')) { - const conf = await fs.readFile(pathToConf, 'utf-8') - await fs.writeFile(pathToConf, conf.replace(': boolean', '')) - } - - // copy directory and add package.json with "type": "module" - await fs.cp(fromTestDir(configName), fromTestDir(`${configName}-module`), { - recursive: true, - }) - await fs.writeFile( - fromTestDir(`${configName}-module`, 'package.json'), - '{ "type": "module" }', - ) - } -} diff --git a/playground/resolve-config/package.json b/playground/resolve-config/package.json deleted file mode 100644 index 5a0d84c6295bd0..00000000000000 --- a/playground/resolve-config/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@vitejs/test-resolve-config", - "private": true, - "version": "0.0.0", - "type": "commonjs", - "scripts": { - "dev": "vite --force", - "build": "vite build", - "preview": "vite preview" - } -} diff --git a/playground/resolve-config/root/index.js b/playground/resolve-config/root/index.js deleted file mode 100644 index a3f8f13f20f96e..00000000000000 --- a/playground/resolve-config/root/index.js +++ /dev/null @@ -1 +0,0 @@ -console.log(__CONFIG_LOADED__) diff --git a/playground/resolve-config/root/vite.config.ts b/playground/resolve-config/root/vite.config.ts deleted file mode 100644 index dcba0e9cd5b6cf..00000000000000 --- a/playground/resolve-config/root/vite.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'vite' - -const __CONFIG_LOADED__: boolean = true -export default defineConfig({ - define: { __CONFIG_LOADED__ }, - logLevel: 'silent', - build: { - minify: false, - sourcemap: false, - lib: { entry: 'index.js', fileName: 'index', formats: ['es'] }, - }, -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bc3d2e38aa0f9..3cd41a64b90fab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1279,8 +1279,6 @@ importers: specifier: ^8.0.1 version: 8.0.1 - playground/resolve-config: {} - playground/resolve-linked: {} playground/resolve/browser-field: