11import { describe , expect , test } from 'vitest' ;
22import { checkCSSModule } from './checker.js' ;
3+ import { createExportBuilder } from './export-builder.js' ;
4+ import { resolve } from './path.js' ;
35import { createResolver } from './resolver.js' ;
46import { fakeCSSModule } from './test/css-module.js' ;
5- import { fakeAtImportTokenImporter , fakeAtValueTokenImporter , fakeAtValueTokenImporterValue } from './test/token.js' ;
6- import type { ExportBuilder } from './type.js' ;
7+ import {
8+ fakeAtImportTokenImporter ,
9+ fakeAtValueTokenImporter ,
10+ fakeAtValueTokenImporterValue ,
11+ fakeToken ,
12+ } from './test/token.js' ;
13+ import type { CSSModule } from './type.js' ;
714
815const resolver = createResolver ( { } , undefined ) ;
916
17+ function prepareCheckerArgs < const T extends CSSModule [ ] > ( cssModules : T ) {
18+ const getCSSModule = ( path : string ) => cssModules . find ( ( m ) => resolve ( m . fileName ) === resolve ( path ) ) ;
19+ const matchesPattern = ( path : string ) => path . endsWith ( '.module.css' ) ;
20+ const exportBuilder = createExportBuilder ( {
21+ getCSSModule,
22+ matchesPattern,
23+ resolver,
24+ } ) ;
25+ return { cssModules, exportBuilder, matchesPattern, resolver, getCSSModule } ;
26+ }
27+
1028describe ( 'checkCSSModule' , ( ) => {
1129 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 ) ;
30+ const args = prepareCheckerArgs ( [
31+ fakeCSSModule ( {
32+ fileName : '/a.module.css' ,
33+ tokenImporters : [
34+ fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
35+ fakeAtValueTokenImporter ( {
36+ from : './c.module.css' ,
37+ values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] ,
38+ } ) ,
39+ ] ,
40+ } ) ,
41+ ] ) ;
42+ const diagnostics = checkCSSModule (
43+ args . cssModules [ 0 ] ,
44+ args . exportBuilder ,
45+ args . matchesPattern ,
46+ args . resolver ,
47+ args . getCSSModule ,
48+ ) ;
2649 expect ( diagnostics ) . toMatchInlineSnapshot ( `
2750 [
2851 {
@@ -55,22 +78,28 @@ describe('checkCSSModule', () => {
5578 ` ) ;
5679 } ) ;
5780 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 ) ;
81+ const args = prepareCheckerArgs ( [
82+ fakeCSSModule ( {
83+ fileName : '/a.module.css' ,
84+ tokenImporters : [
85+ fakeAtValueTokenImporter ( {
86+ from : './b.module.css' ,
87+ values : [ fakeAtValueTokenImporterValue ( { name : 'b_1' } ) , fakeAtValueTokenImporterValue ( { name : 'b_2' } ) ] ,
88+ } ) ,
89+ ] ,
90+ } ) ,
91+ fakeCSSModule ( {
92+ fileName : '/b.module.css' ,
93+ localTokens : [ fakeToken ( { name : 'b_1' } ) ] ,
94+ } ) ,
95+ ] ) ;
96+ const diagnostics = checkCSSModule (
97+ args . cssModules [ 0 ] ,
98+ args . exportBuilder ,
99+ args . matchesPattern ,
100+ args . resolver ,
101+ args . getCSSModule ,
102+ ) ;
74103 expect ( diagnostics ) . toMatchInlineSnapshot ( `
75104 [
76105 {
@@ -90,35 +119,41 @@ describe('checkCSSModule', () => {
90119 ` ) ;
91120 } ) ;
92121 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 ) ;
122+ const args = prepareCheckerArgs ( [
123+ fakeCSSModule ( {
124+ fileName : '/a.module.css' ,
125+ tokenImporters : [ fakeAtImportTokenImporter ( { from : './unresolvable.module.css' } ) ] ,
126+ } ) ,
127+ ] ) ;
128+ const diagnostics = checkCSSModule (
129+ args . cssModules [ 0 ] ,
130+ args . exportBuilder ,
131+ args . matchesPattern ,
132+ ( ) => undefined , // Simulate unresolvable module
133+ args . getCSSModule ,
134+ ) ;
105135 expect ( diagnostics ) . toEqual ( [ ] ) ;
106136 } ) ;
107137 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 ) ;
138+ const args = prepareCheckerArgs ( [
139+ fakeCSSModule ( {
140+ fileName : '/a.module.css' ,
141+ tokenImporters : [
142+ fakeAtImportTokenImporter ( { from : './b.module.css' } ) ,
143+ fakeAtValueTokenImporter ( {
144+ from : './c.module.css' ,
145+ values : [ fakeAtValueTokenImporterValue ( { name : 'c_1' } ) ] ,
146+ } ) ,
147+ ] ,
148+ } ) ,
149+ ] ) ;
150+ const diagnostics = checkCSSModule (
151+ args . cssModules [ 0 ] ,
152+ args . exportBuilder ,
153+ ( path : string ) => path === '/a.module.css' , // Only match the current module
154+ args . resolver ,
155+ args . getCSSModule ,
156+ ) ;
122157 expect ( diagnostics ) . toEqual ( [ ] ) ;
123158 } ) ;
124159} ) ;
0 commit comments