@@ -6,6 +6,9 @@ import { join } from 'node:path'
66import { codeExtract , getCss } from '@devup-ui/wasm'
77import { globSync } from 'glob'
88
9+ import { findTopPackageRoot } from '../find-top-package-root'
10+ import { getPackageName } from '../get-package-name'
11+ import { hasLocalPackage } from '../has-localpackage'
912import { preload } from '../preload'
1013
1114// Mock dependencies
@@ -33,6 +36,18 @@ vi.mock('@devup-ui/wasm', () => ({
3336 getCss : vi . fn ( ) ,
3437} ) )
3538
39+ vi . mock ( '../find-top-package-root' , ( ) => ( {
40+ findTopPackageRoot : vi . fn ( ) ,
41+ } ) )
42+
43+ vi . mock ( '../get-package-name' , ( ) => ( {
44+ getPackageName : vi . fn ( ) ,
45+ } ) )
46+
47+ vi . mock ( '../has-localpackage' , ( ) => ( {
48+ hasLocalPackage : vi . fn ( ) ,
49+ } ) )
50+
3651describe ( 'preload' , ( ) => {
3752 beforeEach ( ( ) => {
3853 vi . clearAllMocks ( )
@@ -63,13 +78,14 @@ describe('preload', () => {
6378 const singleCss = false
6479 const cssDir = '/output/css'
6580
66- preload ( excludeRegex , libPackage , singleCss , cssDir )
81+ preload ( excludeRegex , libPackage , singleCss , cssDir , [ ] )
6782
6883 expect ( globSync ) . toHaveBeenCalledWith (
6984 [ '**/*.tsx' , '**/*.ts' , '**/*.js' , '**/*.mjs' ] ,
7085 {
7186 follow : true ,
7287 absolute : true ,
88+ cwd : expect . any ( String ) ,
7389 } ,
7490 )
7591 } )
@@ -81,7 +97,7 @@ describe('preload', () => {
8197 . mockReturnValueOnce ( 'src/App.tsx' )
8298 . mockReturnValueOnce ( 'src/components/Button.tsx' )
8399 . mockReturnValueOnce ( '.next/page.tsx' )
84- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
100+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
85101
86102 expect ( codeExtract ) . toHaveBeenCalledTimes ( 2 )
87103 expect ( codeExtract ) . toHaveBeenCalledWith (
@@ -106,7 +122,7 @@ describe('preload', () => {
106122 [ Symbol . dispose ] : vi . fn ( ) ,
107123 } )
108124
109- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
125+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
110126
111127 expect ( writeFileSync ) . toHaveBeenCalledWith (
112128 join ( '/output/css' , 'styles.css' ) ,
@@ -127,7 +143,7 @@ describe('preload', () => {
127143 } )
128144 vi . mocked ( getCss ) . mockReturnValue ( '' )
129145
130- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
146+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
131147
132148 expect ( writeFileSync ) . toHaveBeenCalledWith (
133149 join ( '/output/css' , 'devup-ui.css' ) ,
@@ -147,7 +163,7 @@ describe('preload', () => {
147163 [ Symbol . dispose ] : vi . fn ( ) ,
148164 } )
149165
150- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
166+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
151167
152168 expect ( writeFileSync ) . toHaveBeenCalledWith (
153169 join ( '/output/css' , 'styles.css' ) ,
@@ -167,7 +183,7 @@ describe('preload', () => {
167183 [ Symbol . dispose ] : vi . fn ( ) ,
168184 } )
169185
170- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
186+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
171187
172188 expect ( writeFileSync ) . toHaveBeenCalledWith (
173189 join ( '/output/css' , 'styles.css' ) ,
@@ -181,7 +197,7 @@ describe('preload', () => {
181197 const singleCss = true
182198 const cssDir = '/custom/css/dir'
183199
184- preload ( / n o d e _ m o d u l e s / , libPackage , singleCss , cssDir )
200+ preload ( / n o d e _ m o d u l e s / , libPackage , singleCss , cssDir , [ ] )
185201
186202 expect ( codeExtract ) . toHaveBeenCalledWith (
187203 expect . stringMatching ( / A p p \. t s x $ / ) ,
@@ -218,7 +234,7 @@ describe('preload', () => {
218234 [ Symbol . dispose ] : vi . fn ( ) ,
219235 } )
220236
221- preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' )
237+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ ] )
222238
223239 expect ( writeFileSync ) . toHaveBeenCalledTimes ( 3 )
224240 expect ( writeFileSync ) . toHaveBeenCalledWith (
@@ -232,4 +248,63 @@ describe('preload', () => {
232248 'utf-8' ,
233249 )
234250 } )
251+
252+ it ( 'should recurse into local workspaces when include is provided' , ( ) => {
253+ const files = [ 'src/App.tsx' ]
254+ vi . mocked ( findTopPackageRoot ) . mockReturnValue ( '/repo' )
255+ vi . mocked ( hasLocalPackage )
256+ . mockReturnValueOnce ( true )
257+ . mockReturnValueOnce ( false )
258+ vi . mocked ( globSync )
259+ . mockReturnValueOnce ( [
260+ '/repo/packages/pkg-a/package.json' ,
261+ '/repo/packages/pkg-b/package.json' ,
262+ ] )
263+ . mockReturnValueOnce ( files )
264+ vi . mocked ( getPackageName )
265+ . mockReturnValueOnce ( 'pkg-a' )
266+ . mockReturnValueOnce ( 'pkg-b' )
267+ vi . mocked ( realpathSync ) . mockReturnValueOnce ( 'src/App.tsx' )
268+
269+ preload ( / n o d e _ m o d u l e s / , '@devup-ui/react' , false , '/output/css' , [ 'pkg-a' ] )
270+
271+ expect ( findTopPackageRoot ) . toHaveBeenCalled ( )
272+ expect ( globSync ) . toHaveBeenCalledWith (
273+ [ 'package.json' , '!**/node_modules/**' ] ,
274+ {
275+ follow : true ,
276+ absolute : true ,
277+ cwd : '/repo' ,
278+ } ,
279+ )
280+ expect ( codeExtract ) . toHaveBeenCalledTimes ( 1 )
281+ expect ( realpathSync ) . toHaveBeenCalledWith ( 'src/App.tsx' )
282+ } )
283+
284+ it ( 'should skip test and build outputs based on filters' , ( ) => {
285+ vi . mocked ( globSync ) . mockReturnValue ( [
286+ 'src/App.test.tsx' ,
287+ '.next/page.tsx' ,
288+ 'out/index.js' ,
289+ 'src/keep.ts' ,
290+ ] )
291+ vi . mocked ( realpathSync )
292+ . mockReturnValueOnce ( 'src/App.test.tsx' )
293+ . mockReturnValueOnce ( '.next/page.tsx' )
294+ . mockReturnValueOnce ( 'out/index.js' )
295+ . mockReturnValueOnce ( 'src/keep.ts' )
296+
297+ preload ( / e x c l u d e / , '@devup-ui/react' , false , '/output/css' , [ ] )
298+
299+ expect ( codeExtract ) . toHaveBeenCalledTimes ( 1 )
300+ expect ( codeExtract ) . toHaveBeenCalledWith (
301+ expect . stringMatching ( / k e e p \. t s $ / ) ,
302+ 'const Button = () => <div>Hello</div>' ,
303+ '@devup-ui/react' ,
304+ '/output/css' ,
305+ false ,
306+ false ,
307+ true ,
308+ )
309+ } )
235310} )
0 commit comments