@@ -637,6 +637,154 @@ describe('bunfig', () => {
637
637
port : 443 ,
638
638
} )
639
639
} )
640
+
641
+ it ( 'should find config inside ./config directory' , async ( ) => {
642
+ const nestedDir = resolve ( testConfigDir , 'config' )
643
+ mkdirSync ( nestedDir , { recursive : true } )
644
+
645
+ const name = 'local-in-config'
646
+ const configPath = resolve ( nestedDir , `${ name } .config.ts` )
647
+ writeFileSync ( configPath , `export default { source: 'config-dir' }` )
648
+
649
+ const result = await loadConfig < { source : string } > ( {
650
+ name,
651
+ cwd : testConfigDir ,
652
+ defaultConfig : { source : 'default' } ,
653
+ } )
654
+
655
+ expect ( result ) . toEqual ( { source : 'config-dir' } )
656
+ } )
657
+
658
+ it ( 'should find config inside ./.config directory' , async ( ) => {
659
+ const nestedDir = resolve ( testConfigDir , '.config' )
660
+ mkdirSync ( nestedDir , { recursive : true } )
661
+
662
+ const name = 'local-in-dot-config'
663
+ const configPath = resolve ( nestedDir , `${ name } .config.ts` )
664
+ writeFileSync ( configPath , `export default { source: 'dot-config-dir' }` )
665
+
666
+ const result = await loadConfig < { source : string } > ( {
667
+ name,
668
+ cwd : testConfigDir ,
669
+ defaultConfig : { source : 'default' } ,
670
+ } )
671
+
672
+ expect ( result ) . toEqual ( { source : 'dot-config-dir' } )
673
+ } )
674
+
675
+ it ( 'should prefer bare name over name.config inside config directories' , async ( ) => {
676
+ const name = 'prefer-bare'
677
+ const dirConfig = resolve ( testConfigDir , 'config' )
678
+ const dirDotConfig = resolve ( testConfigDir , '.config' )
679
+ mkdirSync ( dirConfig , { recursive : true } )
680
+ mkdirSync ( dirDotConfig , { recursive : true } )
681
+
682
+ // In ./config: place both bare and *.config; bare should win
683
+ writeFileSync ( resolve ( dirConfig , `${ name } .ts` ) , `export default { where: 'config-bare' }` )
684
+ writeFileSync ( resolve ( dirConfig , `${ name } .config.ts` ) , `export default { where: 'config-suffixed' }` )
685
+
686
+ // In ./.config: place both; but ./config is searched before ./.config, so above should win regardless
687
+ writeFileSync ( resolve ( dirDotConfig , `${ name } .ts` ) , `export default { where: 'dot-config-bare' }` )
688
+ writeFileSync ( resolve ( dirDotConfig , `${ name } .config.ts` ) , `export default { where: 'dot-config-suffixed' }` )
689
+
690
+ const result = await loadConfig < { where : string } > ( {
691
+ name,
692
+ cwd : testConfigDir ,
693
+ defaultConfig : { where : 'default' } ,
694
+ } )
695
+
696
+ expect ( result ) . toEqual ( { where : 'config-bare' } )
697
+ } )
698
+
699
+ it ( 'should support bare alias names inside config directories' , async ( ) => {
700
+ const name = 'alias-bare'
701
+ const dirConfig = resolve ( testConfigDir , 'config' )
702
+ mkdirSync ( dirConfig , { recursive : true } )
703
+
704
+ // Only create alias files, both bare and suffixed; bare should take precedence in config dir
705
+ writeFileSync ( resolve ( dirConfig , `tls.ts` ) , `export default { target: 'alias-bare' }` )
706
+ writeFileSync ( resolve ( dirConfig , `tls.config.ts` ) , `export default { target: 'alias-suffixed' }` )
707
+
708
+ const result = await loadConfig < { target : string } > ( {
709
+ name,
710
+ alias : 'tls' ,
711
+ cwd : testConfigDir ,
712
+ defaultConfig : { target : 'default' } ,
713
+ } )
714
+
715
+ expect ( result ) . toEqual ( { target : 'alias-bare' } )
716
+ } )
717
+
718
+ it ( 'should respect directory precedence: base > config > .config > custom configDir' , async ( ) => {
719
+ const name = 'precedence-test'
720
+
721
+ // Prepare directories
722
+ const dirBase = testConfigDir
723
+ const dirConfig = resolve ( testConfigDir , 'config' )
724
+ const dirDotConfig = resolve ( testConfigDir , '.config' )
725
+ const dirExtras = resolve ( testConfigDir , 'extras' )
726
+ mkdirSync ( dirConfig , { recursive : true } )
727
+ mkdirSync ( dirDotConfig , { recursive : true } )
728
+ mkdirSync ( dirExtras , { recursive : true } )
729
+
730
+ // Write same-named configs in all locations with different sources
731
+ writeFileSync ( resolve ( dirExtras , `${ name } .config.ts` ) , `export default { source: 'extras' }` )
732
+ writeFileSync ( resolve ( dirDotConfig , `${ name } .config.ts` ) , `export default { source: 'dot-config' }` )
733
+ writeFileSync ( resolve ( dirConfig , `${ name } .config.ts` ) , `export default { source: 'config' }` )
734
+ writeFileSync ( resolve ( dirBase , `${ name } .config.ts` ) , `export default { source: 'base' }` )
735
+
736
+ const result = await loadConfig < { source : string } > ( {
737
+ name,
738
+ cwd : testConfigDir ,
739
+ configDir : 'extras' ,
740
+ defaultConfig : { source : 'default' } ,
741
+ verbose : false ,
742
+ } )
743
+
744
+ // Base directory should win
745
+ expect ( result ) . toEqual ( { source : 'base' } )
746
+ } )
747
+
748
+ it ( 'should prioritize ./config over ./.config and custom configDir when base is missing' , async ( ) => {
749
+ const name = 'precedence-no-base'
750
+
751
+ const dirConfig = resolve ( testConfigDir , 'config' )
752
+ const dirDotConfig = resolve ( testConfigDir , '.config' )
753
+ const dirExtras = resolve ( testConfigDir , 'extras' )
754
+ mkdirSync ( dirConfig , { recursive : true } )
755
+ mkdirSync ( dirDotConfig , { recursive : true } )
756
+ mkdirSync ( dirExtras , { recursive : true } )
757
+
758
+ writeFileSync ( resolve ( dirExtras , `${ name } .config.ts` ) , `export default { source: 'extras' }` )
759
+ writeFileSync ( resolve ( dirDotConfig , `${ name } .config.ts` ) , `export default { source: 'dot-config' }` )
760
+ writeFileSync ( resolve ( dirConfig , `${ name } .config.ts` ) , `export default { source: 'config' }` )
761
+
762
+ const result = await loadConfig < { source : string } > ( {
763
+ name,
764
+ cwd : testConfigDir ,
765
+ configDir : 'extras' ,
766
+ defaultConfig : { source : 'default' } ,
767
+ } )
768
+
769
+ expect ( result ) . toEqual ( { source : 'config' } )
770
+ } )
771
+
772
+ it ( 'should use a custom configDir when provided' , async ( ) => {
773
+ const extrasDir = resolve ( testConfigDir , 'extras' )
774
+ mkdirSync ( extrasDir , { recursive : true } )
775
+
776
+ const name = 'custom-config-dir'
777
+ writeFileSync ( resolve ( extrasDir , `${ name } .config.ts` ) , `export default { source: 'extras' }` )
778
+
779
+ const result = await loadConfig < { source : string } > ( {
780
+ name,
781
+ cwd : testConfigDir ,
782
+ configDir : 'extras' ,
783
+ defaultConfig : { source : 'default' } ,
784
+ } )
785
+
786
+ expect ( result ) . toEqual ( { source : 'extras' } )
787
+ } )
640
788
} )
641
789
642
790
describe ( 'config function' , ( ) => {
0 commit comments