@@ -4,7 +4,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
44
55import { setupTestDirectory } from "../test-utils/test-directories.js" ;
66import { writeFileContent } from "../utils/file.js" ;
7- import type { Logger } from "../utils/logger.js" ;
7+ import { fallbackLogger , type Logger } from "../utils/logger.js" ;
88import { ConfigResolver } from "./config-resolver.js" ;
99
1010const { getHomeDirectoryMock } = vi . hoisted ( ( ) => {
@@ -155,6 +155,73 @@ describe("config-resolver", () => {
155155
156156 expect ( config . getSilent ( ) ) . toBe ( true ) ;
157157 } ) ;
158+
159+ it ( "should re-configure the supplied logger from config-file silent/verbose" , async ( ) => {
160+ const configContent = JSON . stringify ( {
161+ outputRoots : [ "./" ] ,
162+ silent : true ,
163+ verbose : false ,
164+ } ) ;
165+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
166+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
167+ const fallbackConfigureSpy = vi . spyOn ( fallbackLogger , "configure" ) ;
168+
169+ try {
170+ await ConfigResolver . resolve ( { configPath : join ( testDir , "rulesync.jsonc" ) } , { logger } ) ;
171+
172+ expect ( logger . configure ) . toHaveBeenCalledWith ( { verbose : false , silent : true } ) ;
173+ expect ( fallbackConfigureSpy ) . toHaveBeenCalledWith ( { verbose : false , silent : true } ) ;
174+ } finally {
175+ fallbackConfigureSpy . mockRestore ( ) ;
176+ }
177+ } ) ;
178+
179+ it ( "should re-configure the supplied logger with CLI flags winning over the config file" , async ( ) => {
180+ const configContent = JSON . stringify ( {
181+ outputRoots : [ "./" ] ,
182+ silent : false ,
183+ verbose : false ,
184+ } ) ;
185+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
186+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
187+
188+ await ConfigResolver . resolve (
189+ { configPath : join ( testDir , "rulesync.jsonc" ) , silent : true , verbose : true } ,
190+ { logger } ,
191+ ) ;
192+
193+ expect ( logger . configure ) . toHaveBeenCalledWith ( { verbose : true , silent : true } ) ;
194+ } ) ;
195+
196+ it ( "should enable logger verbose from config-file verbose" , async ( ) => {
197+ const configContent = JSON . stringify ( {
198+ outputRoots : [ "./" ] ,
199+ verbose : true ,
200+ } ) ;
201+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
202+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
203+
204+ await ConfigResolver . resolve ( { configPath : join ( testDir , "rulesync.jsonc" ) } , { logger } ) ;
205+
206+ expect ( logger . configure ) . toHaveBeenCalledWith ( { verbose : true , silent : false } ) ;
207+ } ) ;
208+
209+ it ( "should not touch the fallbackLogger when no logger is supplied" , async ( ) => {
210+ const configContent = JSON . stringify ( {
211+ outputRoots : [ "./" ] ,
212+ silent : true ,
213+ } ) ;
214+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
215+ const fallbackConfigureSpy = vi . spyOn ( fallbackLogger , "configure" ) ;
216+
217+ try {
218+ await ConfigResolver . resolve ( { configPath : join ( testDir , "rulesync.jsonc" ) } ) ;
219+
220+ expect ( fallbackConfigureSpy ) . not . toHaveBeenCalled ( ) ;
221+ } finally {
222+ fallbackConfigureSpy . mockRestore ( ) ;
223+ }
224+ } ) ;
158225 } ) ;
159226
160227 describe ( "config file targets (getConfigFileTargets)" , ( ) => {
@@ -559,7 +626,7 @@ describe("config-resolver", () => {
559626 join ( inputRoot , "rulesync.jsonc" ) ,
560627 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
561628 ) ;
562- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
629+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
563630
564631 await ConfigResolver . resolve (
565632 {
@@ -572,25 +639,25 @@ describe("config-resolver", () => {
572639 expect ( logger . warn ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Ignoring "global: true"' ) ) ;
573640 } ) ;
574641
575- it ( "should fall back to console.warn when no logger is supplied" , async ( ) => {
642+ it ( "should fall back to the shared fallbackLogger when no logger is supplied" , async ( ) => {
576643 const inputRoot = join ( testDir , "central-rules" ) ;
577644 await writeFileContent (
578645 join ( inputRoot , "rulesync.jsonc" ) ,
579646 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
580647 ) ;
581- const consoleWarnSpy = vi . spyOn ( console , "warn" ) . mockImplementation ( ( ) => { } ) ;
648+ const fallbackWarnSpy = vi . spyOn ( fallbackLogger , "warn" ) . mockImplementation ( ( ) => { } ) ;
582649
583650 try {
584651 await ConfigResolver . resolve ( {
585652 configPath : "rulesync.jsonc" ,
586653 inputRoot,
587654 } ) ;
588655
589- expect ( consoleWarnSpy ) . toHaveBeenCalledWith (
656+ expect ( fallbackWarnSpy ) . toHaveBeenCalledWith (
590657 expect . stringContaining ( 'Ignoring "global: true"' ) ,
591658 ) ;
592659 } finally {
593- consoleWarnSpy . mockRestore ( ) ;
660+ fallbackWarnSpy . mockRestore ( ) ;
594661 }
595662 } ) ;
596663
@@ -604,7 +671,7 @@ describe("config-resolver", () => {
604671 join ( testDir , "rulesync.jsonc" ) ,
605672 JSON . stringify ( { inputRoot : configuredRoot , global : true } ) ,
606673 ) ;
607- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
674+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
608675
609676 const config = await ConfigResolver . resolve (
610677 {
@@ -623,7 +690,7 @@ describe("config-resolver", () => {
623690 join ( inputRoot , "rulesync.jsonc" ) ,
624691 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
625692 ) ;
626- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
693+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
627694
628695 await ConfigResolver . resolve (
629696 {
0 commit comments