@@ -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,82 @@ 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+ fallbackLogger . configure ( { verbose : false , silent : false } ) ;
177+ }
178+ } ) ;
179+
180+ it ( "should re-configure the supplied logger with CLI flags winning over the config file" , async ( ) => {
181+ const configContent = JSON . stringify ( {
182+ outputRoots : [ "./" ] ,
183+ silent : false ,
184+ verbose : false ,
185+ } ) ;
186+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
187+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
188+
189+ try {
190+ await ConfigResolver . resolve (
191+ { configPath : join ( testDir , "rulesync.jsonc" ) , silent : true , verbose : true } ,
192+ { logger } ,
193+ ) ;
194+
195+ expect ( logger . configure ) . toHaveBeenCalledWith ( { verbose : true , silent : true } ) ;
196+ } finally {
197+ fallbackLogger . configure ( { verbose : false , silent : false } ) ;
198+ }
199+ } ) ;
200+
201+ it ( "should enable logger verbose from config-file verbose" , async ( ) => {
202+ const configContent = JSON . stringify ( {
203+ outputRoots : [ "./" ] ,
204+ verbose : true ,
205+ } ) ;
206+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
207+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
208+
209+ try {
210+ await ConfigResolver . resolve ( { configPath : join ( testDir , "rulesync.jsonc" ) } , { logger } ) ;
211+
212+ expect ( logger . configure ) . toHaveBeenCalledWith ( { verbose : true , silent : false } ) ;
213+ } finally {
214+ fallbackLogger . configure ( { verbose : false , silent : false } ) ;
215+ }
216+ } ) ;
217+
218+ it ( "should not touch the fallbackLogger when no logger is supplied" , async ( ) => {
219+ const configContent = JSON . stringify ( {
220+ outputRoots : [ "./" ] ,
221+ silent : true ,
222+ } ) ;
223+ await writeFileContent ( join ( testDir , "rulesync.jsonc" ) , configContent ) ;
224+ const fallbackConfigureSpy = vi . spyOn ( fallbackLogger , "configure" ) ;
225+
226+ try {
227+ await ConfigResolver . resolve ( { configPath : join ( testDir , "rulesync.jsonc" ) } ) ;
228+
229+ expect ( fallbackConfigureSpy ) . not . toHaveBeenCalled ( ) ;
230+ } finally {
231+ fallbackConfigureSpy . mockRestore ( ) ;
232+ }
233+ } ) ;
158234 } ) ;
159235
160236 describe ( "config file targets (getConfigFileTargets)" , ( ) => {
@@ -559,7 +635,7 @@ describe("config-resolver", () => {
559635 join ( inputRoot , "rulesync.jsonc" ) ,
560636 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
561637 ) ;
562- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
638+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
563639
564640 await ConfigResolver . resolve (
565641 {
@@ -572,25 +648,25 @@ describe("config-resolver", () => {
572648 expect ( logger . warn ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Ignoring "global: true"' ) ) ;
573649 } ) ;
574650
575- it ( "should fall back to console.warn when no logger is supplied" , async ( ) => {
651+ it ( "should fall back to the shared fallbackLogger when no logger is supplied" , async ( ) => {
576652 const inputRoot = join ( testDir , "central-rules" ) ;
577653 await writeFileContent (
578654 join ( inputRoot , "rulesync.jsonc" ) ,
579655 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
580656 ) ;
581- const consoleWarnSpy = vi . spyOn ( console , "warn" ) . mockImplementation ( ( ) => { } ) ;
657+ const fallbackWarnSpy = vi . spyOn ( fallbackLogger , "warn" ) . mockImplementation ( ( ) => { } ) ;
582658
583659 try {
584660 await ConfigResolver . resolve ( {
585661 configPath : "rulesync.jsonc" ,
586662 inputRoot,
587663 } ) ;
588664
589- expect ( consoleWarnSpy ) . toHaveBeenCalledWith (
665+ expect ( fallbackWarnSpy ) . toHaveBeenCalledWith (
590666 expect . stringContaining ( 'Ignoring "global: true"' ) ,
591667 ) ;
592668 } finally {
593- consoleWarnSpy . mockRestore ( ) ;
669+ fallbackWarnSpy . mockRestore ( ) ;
594670 }
595671 } ) ;
596672
@@ -604,7 +680,7 @@ describe("config-resolver", () => {
604680 join ( testDir , "rulesync.jsonc" ) ,
605681 JSON . stringify ( { inputRoot : configuredRoot , global : true } ) ,
606682 ) ;
607- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
683+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
608684
609685 const config = await ConfigResolver . resolve (
610686 {
@@ -623,7 +699,7 @@ describe("config-resolver", () => {
623699 join ( inputRoot , "rulesync.jsonc" ) ,
624700 JSON . stringify ( { outputRoots : [ "./" ] , global : true } ) ,
625701 ) ;
626- const logger = { warn : vi . fn ( ) } as unknown as Logger ;
702+ const logger = { warn : vi . fn ( ) , configure : vi . fn ( ) } as unknown as Logger ;
627703
628704 await ConfigResolver . resolve (
629705 {
0 commit comments