Skip to content

Commit

Permalink
test: convert config playground to unit tests (#19568)
Browse files Browse the repository at this point in the history
  • Loading branch information
sapphi-red authored Mar 4, 2025
1 parent db5fb48 commit c0e68da
Show file tree
Hide file tree
Showing 16 changed files with 179 additions and 181 deletions.
252 changes: 162 additions & 90 deletions packages/vite/src/node/__tests__/config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ import { defineConfig, loadConfigFromFile, resolveConfig } from '../config'
import { resolveEnvPrefix } from '../env'
import { createLogger, mergeConfig } from '../publicUtils'

const [nvMajor, nvMinor] = process.versions.node.split('.').map(Number)
const isImportAttributesSupported =
(nvMajor === 18 && nvMinor >= 20) ||
// Node v19 doesn't support import attributes
(nvMajor === 20 && nvMinor >= 10) ||
nvMajor >= 21

describe('mergeConfig', () => {
test('handles configs with different alias schemas', () => {
const baseConfig = defineConfig({
Expand Down Expand Up @@ -611,101 +618,166 @@ test('preTransformRequests', async () => {
})

describe('loadConfigFromFile', () => {
const root = path.resolve(__dirname, './fixtures/config/loadConfigFromFile')
const fixtures = path.resolve(__dirname, './fixtures/config')

describe('load default files', () => {
const root = path.resolve(fixtures, './loadConfigFromFile')

let writtenConfig: string | undefined
afterEach(() => {
if (writtenConfig) {
fs.unlinkSync(path.resolve(root, writtenConfig))
}
fs.unlinkSync(path.resolve(root, 'package.json'))
})

let writtenConfig: string | undefined
afterEach(() => {
if (writtenConfig) {
fs.unlinkSync(path.resolve(root, writtenConfig))
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,
}),
)
}
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 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 } }',
},
]

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()
})
}
}
})

test('can import values', async () => {
const { config } = (await loadConfigFromFile(
{} as any,
path.resolve(fixtures, './entry/vite.config.ts'),
path.resolve(fixtures, './entry'),
))!
expect(config).toMatchInlineSnapshot(`
{
"array": [
[
1,
3,
],
[
2,
4,
],
],
"importsField": "imports-field",
"moduleCondition": "import condition",
}
`)
})

test.runIf(isImportAttributesSupported)(
'loadConfigFromFile with import attributes',
async () => {
const { config } = (await loadConfigFromFile(
{} as any,
path.resolve(fixtures, './entry/vite.config.import-attributes.ts'),
path.resolve(fixtures, './entry'),
))!
expect(config).toMatchInlineSnapshot(`
{
"jsonValue": "vite",
}
`)
},
]
)

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()
})
}
}
describe('loadConfigFromFile with configLoader: native', () => {
const fixtureRoot = path.resolve(fixtures, './native-import')

test('imports a basic js config', async () => {
const result = (await loadConfigFromFile(
{} as any,
path.resolve(fixtureRoot, 'basic.js'),
fixtureRoot,
undefined,
undefined,
'native',
))!
expect(result.config).toMatchInlineSnapshot(`
{
"value": "works",
}
`)
expect(result.dependencies.length).toBe(0)
})
})
})
File renamed without changes.
71 changes: 0 additions & 71 deletions playground/config/__tests__/config.spec.ts

This file was deleted.

3 changes: 0 additions & 3 deletions playground/config/__tests__/serve.ts

This file was deleted.

34 changes: 17 additions & 17 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit c0e68da

Please sign in to comment.