11import { describe , expect , test } from 'vitest' ;
22import { checkCSSModule } from './checker.js' ;
3+ import { createExportBuilder } from './export-builder.js' ;
34import { createResolver } from './resolver.js' ;
45import { fakeCSSModule } from './test/css-module.js' ;
5- import { fakeAtImportTokenImporter , fakeAtValueTokenImporter , fakeAtValueTokenImporterValue } from './test/token.js' ;
6- import type { ExportBuilder } from './type.js' ;
6+ import {
7+ fakeAtImportTokenImporter ,
8+ fakeAtValueTokenImporter ,
9+ fakeAtValueTokenImporterValue ,
10+ fakeToken ,
11+ } from './test/token.js' ;
12+ import type { CSSModule } from './type.js' ;
713
814const resolver = createResolver ( { } , undefined ) ;
915
16+ function prepareCheckerArgs < const T extends CSSModule [ ] > ( cssModules : T ) {
17+ const getCSSModule = ( path : string ) => cssModules . find ( ( m ) => m . fileName === path ) ;
18+ const matchesPattern = ( path : string ) => path . endsWith ( '.module.css' ) ;
19+ const exportBuilder = createExportBuilder ( {
20+ getCSSModule,
21+ matchesPattern,
22+ resolver,
23+ } ) ;
24+ return { cssModules, exportBuilder, matchesPattern, resolver, getCSSModule } ;
25+ }
26+
1027describe ( 'checkCSSModule' , ( ) => {
1128 test ( 'report diagnostics for non-existing module' , ( ) => {
12- const cssModule = fakeCSSModule ( {
13- fileName : '/a.module.css' ,
14- tokenImporters : [
15- fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
16- fakeAtValueTokenImporter ( { from : './c.module.css' , values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] } ) ,
17- ] ,
18- } ) ;
19- const exportBuilder : ExportBuilder = {
20- build : ( ) => ( { allTokens : [ ] } ) ,
21- clearCache : ( ) => { } ,
22- } ;
23- const matchesPattern = ( ) => true ;
24- const getCSSModule = ( ) => undefined ;
25- const diagnostics = checkCSSModule ( cssModule , exportBuilder , matchesPattern , resolver , getCSSModule ) ;
29+ const args = prepareCheckerArgs ( [
30+ fakeCSSModule ( {
31+ fileName : '/a.module.css' ,
32+ tokenImporters : [
33+ fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
34+ fakeAtValueTokenImporter ( {
35+ from : './c.module.css' ,
36+ values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] ,
37+ } ) ,
38+ ] ,
39+ } ) ,
40+ ] ) ;
41+ const diagnostics = checkCSSModule (
42+ args . cssModules [ 0 ] ,
43+ args . exportBuilder ,
44+ args . matchesPattern ,
45+ args . resolver ,
46+ args . getCSSModule ,
47+ ) ;
2648 expect ( diagnostics ) . toMatchInlineSnapshot ( `
2749 [
2850 {
@@ -55,22 +77,28 @@ describe('checkCSSModule', () => {
5577 ` ) ;
5678 } ) ;
5779 test ( 'report diagnostics for non-exported token' , ( ) => {
58- const cssModule = fakeCSSModule ( {
59- fileName : '/a.module.css' ,
60- tokenImporters : [
61- fakeAtValueTokenImporter ( {
62- from : './b.module.css' ,
63- values : [ fakeAtValueTokenImporterValue ( { name : 'b_1' } ) , fakeAtValueTokenImporterValue ( { name : 'b_2' } ) ] ,
64- } ) ,
65- ] ,
66- } ) ;
67- const exportBuilder : ExportBuilder = {
68- build : ( ) => ( { allTokens : [ 'b_1' ] } ) ,
69- clearCache : ( ) => { } ,
70- } ;
71- const matchesPattern = ( ) => true ;
72- const getCSSModule = ( ) => cssModule ;
73- const diagnostics = checkCSSModule ( cssModule , exportBuilder , matchesPattern , resolver , getCSSModule ) ;
80+ const args = prepareCheckerArgs ( [
81+ fakeCSSModule ( {
82+ fileName : '/a.module.css' ,
83+ tokenImporters : [
84+ fakeAtValueTokenImporter ( {
85+ from : './b.module.css' ,
86+ values : [ fakeAtValueTokenImporterValue ( { name : 'b_1' } ) , fakeAtValueTokenImporterValue ( { name : 'b_2' } ) ] ,
87+ } ) ,
88+ ] ,
89+ } ) ,
90+ fakeCSSModule ( {
91+ fileName : '/b.module.css' ,
92+ localTokens : [ fakeToken ( { name : 'b_1' } ) ] ,
93+ } ) ,
94+ ] ) ;
95+ const diagnostics = checkCSSModule (
96+ args . cssModules [ 0 ] ,
97+ args . exportBuilder ,
98+ args . matchesPattern ,
99+ args . resolver ,
100+ args . getCSSModule ,
101+ ) ;
74102 expect ( diagnostics ) . toMatchInlineSnapshot ( `
75103 [
76104 {
@@ -90,35 +118,41 @@ describe('checkCSSModule', () => {
90118 ` ) ;
91119 } ) ;
92120 test ( 'ignore token importers for unresolvable modules' , ( ) => {
93- const cssModule = fakeCSSModule ( {
94- fileName : '/a.module.css' ,
95- tokenImporters : [ fakeAtImportTokenImporter ( { from : './unresolvable.module.css' } ) ] ,
96- } ) ;
97- const exportBuilder : ExportBuilder = {
98- build : ( ) => ( { allTokens : [ ] } ) ,
99- clearCache : ( ) => { } ,
100- } ;
101- const matchesPattern = ( ) => true ;
102- const resolver = ( ) => undefined ;
103- const getCSSModule = ( ) => undefined ;
104- const diagnostics = checkCSSModule ( cssModule , exportBuilder , matchesPattern , resolver , getCSSModule ) ;
121+ const args = prepareCheckerArgs ( [
122+ fakeCSSModule ( {
123+ fileName : '/a.module.css' ,
124+ tokenImporters : [ fakeAtImportTokenImporter ( { from : './unresolvable.module.css' } ) ] ,
125+ } ) ,
126+ ] ) ;
127+ const diagnostics = checkCSSModule (
128+ args . cssModules [ 0 ] ,
129+ args . exportBuilder ,
130+ args . matchesPattern ,
131+ ( ) => undefined , // Simulate unresolvable module
132+ args . getCSSModule ,
133+ ) ;
105134 expect ( diagnostics ) . toEqual ( [ ] ) ;
106135 } ) ;
107136 test ( 'ignore token importers that do not match the pattern' , ( ) => {
108- const cssModule = fakeCSSModule ( {
109- fileName : '/a.module.css' ,
110- tokenImporters : [
111- fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
112- fakeAtValueTokenImporter ( { from : './c.module.css' , values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] } ) ,
113- ] ,
114- } ) ;
115- const exportBuilder : ExportBuilder = {
116- build : ( ) => ( { allTokens : [ ] } ) ,
117- clearCache : ( ) => { } ,
118- } ;
119- const matchesPattern = ( ) => false ;
120- const getCSSModule = ( ) => undefined ;
121- const diagnostics = checkCSSModule ( cssModule , exportBuilder , matchesPattern , resolver , getCSSModule ) ;
137+ const args = prepareCheckerArgs ( [
138+ fakeCSSModule ( {
139+ fileName : '/a.module.css' ,
140+ tokenImporters : [
141+ fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
142+ fakeAtValueTokenImporter ( {
143+ from : './c.module.css' ,
144+ values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] ,
145+ } ) ,
146+ ] ,
147+ } ) ,
148+ ] ) ;
149+ const diagnostics = checkCSSModule (
150+ args . cssModules [ 0 ] ,
151+ args . exportBuilder ,
152+ ( path : string ) => path === '/a.module.css' , // Only match the current module
153+ args . resolver ,
154+ args . getCSSModule ,
155+ ) ;
122156 expect ( diagnostics ) . toEqual ( [ ] ) ;
123157 } ) ;
124158} ) ;
0 commit comments