Skip to content

Commit f324097

Browse files
committed
Support monorepo on turbopack
1 parent d2587b6 commit f324097

File tree

6 files changed

+84
-10
lines changed

6 files changed

+84
-10
lines changed

packages/next-plugin/src/__tests__/preload.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('preload', () => {
6363
const singleCss = false
6464
const cssDir = '/output/css'
6565

66-
preload(excludeRegex, libPackage, singleCss, cssDir)
66+
preload(excludeRegex, libPackage, singleCss, cssDir, [])
6767

6868
expect(globSync).toHaveBeenCalledWith(
6969
['**/*.tsx', '**/*.ts', '**/*.js', '**/*.mjs'],
@@ -81,7 +81,7 @@ describe('preload', () => {
8181
.mockReturnValueOnce('src/App.tsx')
8282
.mockReturnValueOnce('src/components/Button.tsx')
8383
.mockReturnValueOnce('.next/page.tsx')
84-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
84+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
8585

8686
expect(codeExtract).toHaveBeenCalledTimes(2)
8787
expect(codeExtract).toHaveBeenCalledWith(
@@ -106,7 +106,7 @@ describe('preload', () => {
106106
[Symbol.dispose]: vi.fn(),
107107
})
108108

109-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
109+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
110110

111111
expect(writeFileSync).toHaveBeenCalledWith(
112112
join('/output/css', 'styles.css'),
@@ -127,7 +127,7 @@ describe('preload', () => {
127127
})
128128
vi.mocked(getCss).mockReturnValue('')
129129

130-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
130+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
131131

132132
expect(writeFileSync).toHaveBeenCalledWith(
133133
join('/output/css', 'devup-ui.css'),
@@ -147,7 +147,7 @@ describe('preload', () => {
147147
[Symbol.dispose]: vi.fn(),
148148
})
149149

150-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
150+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
151151

152152
expect(writeFileSync).toHaveBeenCalledWith(
153153
join('/output/css', 'styles.css'),
@@ -167,7 +167,7 @@ describe('preload', () => {
167167
[Symbol.dispose]: vi.fn(),
168168
})
169169

170-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
170+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
171171

172172
expect(writeFileSync).toHaveBeenCalledWith(
173173
join('/output/css', 'styles.css'),
@@ -181,7 +181,7 @@ describe('preload', () => {
181181
const singleCss = true
182182
const cssDir = '/custom/css/dir'
183183

184-
preload(/node_modules/, libPackage, singleCss, cssDir)
184+
preload(/node_modules/, libPackage, singleCss, cssDir, [])
185185

186186
expect(codeExtract).toHaveBeenCalledWith(
187187
expect.stringMatching(/App\.tsx$/),
@@ -218,7 +218,7 @@ describe('preload', () => {
218218
[Symbol.dispose]: vi.fn(),
219219
})
220220

221-
preload(/node_modules/, '@devup-ui/react', false, '/output/css')
221+
preload(/node_modules/, '@devup-ui/react', false, '/output/css', [])
222222

223223
expect(writeFileSync).toHaveBeenCalledTimes(3)
224224
expect(writeFileSync).toHaveBeenCalledWith(
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { existsSync } from 'node:fs'
2+
import { dirname, join } from 'node:path'
3+
4+
/**
5+
* find package root
6+
*
7+
* Find the root of the package by checking the package.json file
8+
* @returns
9+
*/
10+
export function findTopPackageRoot(pwd = process.cwd()) {
11+
let current = pwd
12+
let topWithPackage: string | null = null
13+
14+
while (true) {
15+
if (existsSync(join(current, 'package.json'))) {
16+
topWithPackage = current
17+
}
18+
19+
const parent = dirname(current)
20+
if (parent === current) {
21+
break
22+
}
23+
current = parent
24+
}
25+
26+
return topWithPackage ?? pwd
27+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { readFileSync } from 'node:fs'
2+
3+
export function getPackageName(packageJsonPath: string) {
4+
const packageJson = readFileSync(packageJsonPath, 'utf-8')
5+
const packageJsonObject = JSON.parse(packageJson)
6+
return packageJsonObject.name
7+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { readFileSync } from 'node:fs'
2+
import { join } from 'node:path'
3+
4+
/**
5+
* has local package
6+
*
7+
* Check if the include workspace:* package is a local package
8+
* @returns
9+
*/
10+
export function hasLocalPackage() {
11+
const packageJson = readFileSync(join(process.cwd(), 'package.json'), 'utf-8')
12+
const packageJsonObject = JSON.parse(packageJson)
13+
return Object.values(packageJsonObject.dependencies ?? {}).some(
14+
(pkg: unknown) => typeof pkg === 'string' && pkg.includes('workspace:'),
15+
)
16+
}

packages/next-plugin/src/plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export function DevupUI(
9797
writeFileSync(join(cssDir, 'devup-ui.css'), getCss(null, false))
9898
} else {
9999
// build
100-
preload(excludeRegex, libPackage, singleCss, cssDir)
100+
preload(excludeRegex, libPackage, singleCss, cssDir, include)
101101
}
102102
const defaultSheet = JSON.parse(exportSheet())
103103
const defaultClassMap = JSON.parse(exportClassMap())

packages/next-plugin/src/preload.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,44 @@
11
import { readFileSync, realpathSync, writeFileSync } from 'node:fs'
2-
import { basename, join, relative } from 'node:path'
2+
import { basename, dirname, join, relative } from 'node:path'
33

44
import { codeExtract, getCss } from '@devup-ui/wasm'
55
import { globSync } from 'glob'
6+
7+
import { findTopPackageRoot } from './find-top-package-root'
8+
import { getPackageName } from './get-package-name'
9+
import { hasLocalPackage } from './has-localpackage'
10+
611
export function preload(
712
excludeRegex: RegExp,
813
libPackage: string,
914
singleCss: boolean,
1015
cssDir: string,
16+
include: string[],
17+
pwd = process.cwd(),
1118
) {
19+
if (include.length > 0 && hasLocalPackage()) {
20+
const packageRoot = findTopPackageRoot()
21+
const collected = globSync(['package.json', '!**/node_modules/**'], {
22+
follow: true,
23+
absolute: true,
24+
cwd: packageRoot,
25+
})
26+
.filter((file) => include.includes(getPackageName(file)))
27+
.map((file) => dirname(file))
28+
29+
for (const file of collected) {
30+
preload(excludeRegex, libPackage, singleCss, cssDir, include, file)
31+
}
32+
return
33+
}
1234
const collected = globSync(['**/*.tsx', '**/*.ts', '**/*.js', '**/*.mjs'], {
1335
follow: true,
1436
absolute: true,
37+
cwd: pwd,
1538
})
1639
// fix multi core build issue
1740
collected.sort()
41+
// console.log('collected', collected)
1842
for (const file of collected) {
1943
const filePath = relative(process.cwd(), realpathSync(file))
2044
if (

0 commit comments

Comments
 (0)