@@ -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