1- import slash from "slash" ;
21import { existsSync , promises } from "fs" ;
3- import { dirname , relative , join } from "path" ;
2+ import { dirname , resolve } from "path" ;
3+ import Piscina from "piscina" ;
44import { CompileStatus } from "./constants" ;
55import { CliOptions } from "./options" ;
6- import { compile , exists } from "./util" ;
7- import { outputResult } from "./compile " ;
6+ import { exists , getDest } from "./util" ;
7+ import handleCompile from "./dirWorker " ;
88import {
99 globSources ,
1010 isCompilableExtension ,
@@ -26,53 +26,8 @@ declare module "fs" {
2626
2727const { mkdir, rmdir, rm, copyFile, unlink } = promises ;
2828
29- const cwd = process . cwd ( ) ;
3029const recursive = { recursive : true } ;
3130
32- /**
33- * Removes the leading directory, including all parent relative paths
34- */
35- function stripComponents ( filename : string ) {
36- const components = filename . split ( "/" ) . slice ( 1 ) ;
37- if ( ! components . length ) {
38- return filename ;
39- }
40- while ( components [ 0 ] === ".." ) {
41- components . shift ( ) ;
42- }
43- return components . join ( "/" ) ;
44- }
45-
46- function getDest ( filename : string , outDir : string , ext ?: string ) {
47- const relativePath = slash ( relative ( cwd , filename ) ) ;
48- let base = stripComponents ( relativePath ) ;
49- if ( ext ) {
50- base = base . replace ( / \. \w * $ / , ext ) ;
51- }
52- return join ( outDir , base ) ;
53- }
54-
55- async function handleCompile (
56- filename : string ,
57- outDir : string ,
58- sync : boolean ,
59- swcOptions : Options
60- ) {
61- const dest = getDest ( filename , outDir , ".js" ) ;
62- const sourceFileName = slash ( relative ( dirname ( dest ) , filename ) ) ;
63-
64- const options = { ...swcOptions , sourceFileName } ;
65-
66- const result = await compile ( filename , options , sync , dest ) ;
67-
68- if ( result ) {
69- await outputResult ( result , filename , dest , options ) ;
70- return CompileStatus . Compiled ;
71- } else {
72- return CompileStatus . Omitted ;
73- }
74- }
75-
7631async function handleCopy ( filename : string , outDir : string ) {
7732 const dest = getDest ( filename , outDir ) ;
7833 const dir = dirname ( dest ) ;
@@ -126,7 +81,12 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
12681 if ( sync ) {
12782 for ( const filename of compilable ) {
12883 try {
129- const result = await handleCompile ( filename , outDir , sync , swcOptions ) ;
84+ const result = await handleCompile ( {
85+ filename,
86+ outDir,
87+ sync,
88+ swcOptions,
89+ } ) ;
13090 results . set ( filename , result ) ;
13191 } catch ( err : any ) {
13292 console . error ( err . message ) ;
@@ -143,10 +103,16 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
143103 }
144104 }
145105 } else {
106+ const workers = new Piscina ( {
107+ filename : resolve ( __dirname , "./dirWorker.js" ) ,
108+ maxThreads : cliOptions . workers ,
109+ concurrentTasksPerWorker : 2 ,
110+ } ) ;
111+
146112 await Promise . all ( [
147113 Promise . allSettled (
148- compilable . map ( file =>
149- handleCompile ( file , outDir , sync , swcOptions ) . catch ( err => {
114+ compilable . map ( filename =>
115+ workers . run ( { filename , outDir, sync, swcOptions } ) . catch ( err => {
150116 console . error ( err . message ) ;
151117 throw err ;
152118 } )
@@ -264,12 +230,12 @@ async function watchCompilation(cliOptions: CliOptions, swcOptions: Options) {
264230 if ( isCompilableExtension ( filename , extensions ) ) {
265231 try {
266232 const start = process . hrtime ( ) ;
267- const result = await handleCompile (
233+ const result = await handleCompile ( {
268234 filename,
269235 outDir,
270236 sync,
271- swcOptions
272- ) ;
237+ swcOptions,
238+ } ) ;
273239 if ( ! quiet && result === CompileStatus . Compiled ) {
274240 const end = process . hrtime ( start ) ;
275241 console . log (
0 commit comments