@@ -8,6 +8,13 @@ import { defineConfig, loadConfigFromFile, resolveConfig } from '../config'
8
8
import { resolveEnvPrefix } from '../env'
9
9
import { createLogger, mergeConfig } from '../publicUtils'
10
10
11
+ const [nvMajor, nvMinor] = process.versions.node.split('.').map(Number)
12
+ const isImportAttributesSupported =
13
+ (nvMajor === 18 && nvMinor >= 20) ||
14
+ // Node v19 doesn't support import attributes
15
+ (nvMajor === 20 && nvMinor >= 10) ||
16
+ nvMajor >= 21
17
+
11
18
describe('mergeConfig', () => {
12
19
test('handles configs with different alias schemas', () => {
13
20
const baseConfig = defineConfig({
@@ -611,101 +618,166 @@ test('preTransformRequests', async () => {
611
618
})
612
619
613
620
describe('loadConfigFromFile', () => {
614
- const root = path.resolve(__dirname, './fixtures/config/loadConfigFromFile')
621
+ const fixtures = path.resolve(__dirname, './fixtures/config')
622
+
623
+ describe('load default files', () => {
624
+ const root = path.resolve(fixtures, './loadConfigFromFile')
625
+
626
+ let writtenConfig: string | undefined
627
+ afterEach(() => {
628
+ if (writtenConfig) {
629
+ fs.unlinkSync(path.resolve(root, writtenConfig))
630
+ }
631
+ fs.unlinkSync(path.resolve(root, 'package.json'))
632
+ })
615
633
616
- let writtenConfig: string | undefined
617
- afterEach(() => {
618
- if (writtenConfig) {
619
- fs.unlinkSync(path.resolve(root, writtenConfig))
634
+ const writeConfig = (fileName: string, content: string) => {
635
+ fs.writeFileSync(path.resolve(root, fileName), content)
636
+ writtenConfig = fileName
637
+ }
638
+ const writePackageJson = (typeField: string | undefined) => {
639
+ fs.writeFileSync(
640
+ path.resolve(root, 'package.json'),
641
+ JSON.stringify({
642
+ name: '@vitejs/test-load-config-from-file',
643
+ type: typeField,
644
+ }),
645
+ )
620
646
}
621
- fs.unlinkSync(path.resolve(root, 'package.json'))
622
- })
623
647
624
- const writeConfig = (fileName: string, content: string) => {
625
- fs.writeFileSync(path.resolve(root, fileName), content)
626
- writtenConfig = fileName
627
- }
628
- const writePackageJson = (typeField: string | undefined) => {
629
- fs.writeFileSync(
630
- path.resolve(root, 'package.json'),
631
- JSON.stringify({
632
- name: '@vitejs/test-load-config-from-file',
633
- type: typeField,
634
- }),
635
- )
636
- }
648
+ const canLoadConfig = async () => {
649
+ const result = await loadConfigFromFile(
650
+ { command: 'build', mode: 'production' },
651
+ undefined,
652
+ root,
653
+ )
654
+ expect(result).toBeTruthy()
655
+ expect(result?.config).toStrictEqual({ define: { foo: 1 } })
656
+ expect(path.normalize(result!.path)).toBe(
657
+ path.resolve(root, writtenConfig!),
658
+ )
659
+ }
637
660
638
- const canLoadConfig = async () => {
639
- const result = await loadConfigFromFile(
640
- { command: 'build', mode: 'production' },
641
- undefined,
642
- root,
643
- )
644
- expect(result).toBeTruthy()
645
- expect(result?.config).toStrictEqual({ define: { foo: 1 } })
646
- expect(path.normalize(result!.path)).toBe(
647
- path.resolve(root, writtenConfig!),
648
- )
649
- }
661
+ const cases = [
662
+ {
663
+ fileName: 'vite.config.js',
664
+ content: 'export default { define: { foo: 1 } }',
665
+ },
666
+ {
667
+ fileName: 'vite.config.js',
668
+ content: 'export default { define: { foo: 1 } }',
669
+ },
670
+ {
671
+ fileName: 'vite.config.cjs',
672
+ content: 'module.exports = { define: { foo: 1 } }',
673
+ },
674
+ {
675
+ fileName: 'vite.config.cjs',
676
+ content: 'module.exports = { define: { foo: 1 } }',
677
+ },
678
+ {
679
+ fileName: 'vite.config.mjs',
680
+ content: 'export default { define: { foo: 1 } }',
681
+ },
682
+ {
683
+ fileName: 'vite.config.mjs',
684
+ content: 'export default { define: { foo: 1 } }',
685
+ },
686
+ {
687
+ fileName: 'vite.config.ts',
688
+ content: 'export default { define: { foo: 1 as number } }',
689
+ },
690
+ {
691
+ fileName: 'vite.config.ts',
692
+ content: 'export default { define: { foo: 1 as number } }',
693
+ },
694
+ {
695
+ fileName: 'vite.config.mts',
696
+ content: 'export default { define: { foo: 1 as number } }',
697
+ },
698
+ {
699
+ fileName: 'vite.config.mts',
700
+ content: 'export default { define: { foo: 1 as number } }',
701
+ },
702
+ {
703
+ fileName: 'vite.config.cts',
704
+ content: 'module.exports = { define: { foo: 1 as number } }',
705
+ },
706
+ {
707
+ fileName: 'vite.config.cts',
708
+ content: 'module.exports = { define: { foo: 1 as number } }',
709
+ },
710
+ ]
650
711
651
- const cases = [
652
- {
653
- fileName: 'vite.config.js',
654
- content: 'export default { define: { foo: 1 } }',
655
- },
656
- {
657
- fileName: 'vite.config.js',
658
- content: 'export default { define: { foo: 1 } }',
659
- },
660
- {
661
- fileName: 'vite.config.cjs',
662
- content: 'module.exports = { define: { foo: 1 } }',
663
- },
664
- {
665
- fileName: ' vite.config.cjs' ,
666
- content: 'module.exports = { define: { foo: 1 } }' ,
667
- },
668
- {
669
- fileName: 'vite.config.mjs',
670
- content: 'export default { define: { foo: 1 } }',
671
- },
672
- {
673
- fileName: 'vite.config.mjs' ,
674
- content: 'export default { define: { foo: 1 } }' ,
675
- },
676
- {
677
- fileName: 'vite.config.ts' ,
678
- content: 'export default { define: { foo: 1 as number } }' ,
679
- } ,
680
- {
681
- fileName: 'vite.config.ts' ,
682
- content: 'export default { define: { foo: 1 as number } }',
683
- },
684
- {
685
- fileName: 'vite.config.mts',
686
- content: 'export default { define: { foo: 1 as number } }',
687
- } ,
688
- {
689
- fileName: 'vite. config.mts',
690
- content: 'export default { define: { foo: 1 as number } }' ,
691
- } ,
692
- {
693
- fileName: 'vite.config.cts',
694
- content: 'module.exports = { define: { foo: 1 as number } }',
695
- },
696
- {
697
- fileName: 'vite.config.cts',
698
- content: 'module.exports = { define: { foo: 1 as number } }',
712
+ for ( const { fileName, content } of cases) {
713
+ for (const typeField of [undefined, 'module']) {
714
+ test(`load ${ fileName}${typeField ? ' with package#type module' : ''}`, async () => {
715
+ writePackageJson(typeField)
716
+ writeConfig(fileName, content)
717
+ await canLoadConfig()
718
+ })
719
+ }
720
+ }
721
+ })
722
+
723
+ test('can import values', async () => {
724
+ const { config } = (await loadConfigFromFile(
725
+ {} as any,
726
+ path.resolve(fixtures, './entry/ vite.config.ts') ,
727
+ path.resolve(fixtures, './entry') ,
728
+ ))!
729
+ expect(config).toMatchInlineSnapshot(`
730
+ {
731
+ "array": [
732
+ [
733
+ 1,
734
+ 3 ,
735
+ ] ,
736
+ [
737
+ 2,
738
+ 4 ,
739
+ ] ,
740
+ ] ,
741
+ "importsField": "imports-field",
742
+ "moduleCondition": "import condition" ,
743
+ }
744
+ `)
745
+ })
746
+
747
+ test.runIf(isImportAttributesSupported)(
748
+ 'loadConfigFromFile with import attributes' ,
749
+ async () => {
750
+ const { config } = (await loadConfigFromFile(
751
+ {} as any ,
752
+ path.resolve(fixtures, './entry/vite.config.import-attributes.ts') ,
753
+ path.resolve(fixtures, './entry'),
754
+ ))!
755
+ expect(config).toMatchInlineSnapshot(`
756
+ {
757
+ "jsonValue": "vite",
758
+ }
759
+ `)
699
760
},
700
- ]
761
+ )
701
762
702
- for (const { fileName, content } of cases) {
703
- for (const typeField of [undefined, 'module']) {
704
- test(`load ${fileName}${typeField ? ' with package#type module' : ''}`, async () => {
705
- writePackageJson(typeField)
706
- writeConfig(fileName, content)
707
- await canLoadConfig()
708
- })
709
- }
710
- }
763
+ describe('loadConfigFromFile with configLoader: native', () => {
764
+ const fixtureRoot = path.resolve(fixtures, './native-import')
765
+
766
+ test('imports a basic js config', async () => {
767
+ const result = (await loadConfigFromFile(
768
+ {} as any,
769
+ path.resolve(fixtureRoot, 'basic.js'),
770
+ fixtureRoot,
771
+ undefined,
772
+ undefined,
773
+ 'native',
774
+ ))!
775
+ expect(result.config).toMatchInlineSnapshot(`
776
+ {
777
+ "value": "works",
778
+ }
779
+ `)
780
+ expect(result.dependencies.length).toBe(0)
781
+ })
782
+ })
711
783
})
0 commit comments