1- import * as ESBuild from 'esbuild'
1+ import * as RsPack from '@rspack/core'
2+ import * as Memfs from 'memfs'
23import * as Zod from 'zod'
34import * as Process from 'node:process'
45import * as Path from 'node:path'
56import PackageJson from '@npmcli/package-json'
67import { CreateBanner } from './banner/index.js'
78import { SafeInitCwd } from './utils/safe-init-cwd.js'
9+ import { RunCompiler } from './utils/awaited-rspack.js'
810
911export type BuildOptions = {
1012 Minify : boolean
@@ -45,25 +47,87 @@ export async function Build(OptionsParam?: BuildOptions): Promise<void> {
4547 }
4648 } )
4749
48- const WorkerCode = await ESBuild . build ( {
49- entryPoints : [ Path . resolve ( ProjectRoot , 'userscript' , 'source' , 'ocr-worker.ts' ) ] ,
50- bundle : true ,
51- minify : Options . Minify ,
52- write : false ,
53- target : [ 'es2024' , 'chrome119' , 'firefox142' , 'safari26' ]
54- } )
50+ const TypescriptLoader = {
51+ test : / \. t s $ / ,
52+ exclude : [ '/node_modules/' ] ,
53+ loader : 'builtin:swc-loader' ,
54+ options : {
55+ jsc : {
56+ parser : {
57+ syntax : 'typescript' ,
58+ decorators : true ,
59+ dynamicImport : true
60+ }
61+ }
62+ } ,
63+ type : 'javascript/auto'
64+ } satisfies RsPack . RuleSetRule
5565
56- await ESBuild . build ( {
57- entryPoints : [ Path . resolve ( ProjectRoot , 'userscript' , 'source' , 'index.ts' ) ] ,
58- bundle : true ,
59- minify : Options . Minify ,
60- outfile : `${ ProjectRoot } /dist/NamuLink${ Options . BuildType === 'development' ? '.dev' : '' } .user.js` ,
61- banner : {
62- js : Banner
66+ const WorkerContainer = Memfs . createFsFromVolume ( new Memfs . Volume ( ) )
67+ const WorkerBuilder = RsPack . rspack ( {
68+ entry : [ Path . resolve ( ProjectRoot , 'userscript' , 'source' , 'ocr-worker.ts' ) ] ,
69+ mode : Options . BuildType ,
70+ optimization : {
71+ minimize : Options . Minify
72+ } ,
73+ target : [ 'es2024' , 'webworker' ] ,
74+ output : {
75+ path : Path . resolve ( '/' ) ,
76+ filename : 'ocr-worker.js'
6377 } ,
64- target : [ 'es2024' , 'chrome119' , 'firefox142' , 'safari26' ] ,
65- define : {
66- __OCR_WORKER_CODE__ : JSON . stringify ( WorkerCode . outputFiles [ 0 ] . text )
78+ resolve : {
79+ extensions : [ '.ts' , '.js' , '.json' ] ,
80+ extensionAlias : {
81+ '.js' : [ '.ts' , '.js' ]
82+ }
83+ } ,
84+ module : {
85+ rules : [ TypescriptLoader ]
6786 }
6887 } )
88+ //@ts -expect-error https://github.com/web-infra-dev/rspack/issues/5091
89+ WorkerBuilder . outputFileSystem = WorkerContainer
90+ await RunCompiler ( WorkerBuilder )
91+
92+ const MainBuilder = RsPack . rspack ( {
93+ entry : [ Path . resolve ( ProjectRoot , 'userscript' , 'source' , 'index.ts' ) ] ,
94+ mode : Options . BuildType ,
95+ optimization : {
96+ minimize : Options . Minify ,
97+ minimizer : [
98+ new RsPack . SwcJsMinimizerRspackPlugin ( {
99+ minimizerOptions : {
100+ format : {
101+ comments : 'all'
102+ }
103+ }
104+ } )
105+ ]
106+ } ,
107+ plugins : [
108+ new RsPack . BannerPlugin ( {
109+ banner : Banner ,
110+ raw : true
111+ } ) ,
112+ new RsPack . DefinePlugin ( {
113+ __OCR_WORKER_CODE__ : JSON . stringify ( WorkerContainer . readFileSync ( Path . resolve ( '/' , 'ocr-worker.js' ) , 'utf-8' ) )
114+ } )
115+ ] ,
116+ output : {
117+ path : Path . resolve ( ProjectRoot , 'dist' ) ,
118+ filename : `NamuLink${ Options . BuildType === 'development' ? '.dev' : '' } .user.js`
119+ } ,
120+ resolve : {
121+ extensions : [ '.ts' , '.js' , '.json' ] ,
122+ extensionAlias : {
123+ '.js' : [ '.ts' , '.js' ]
124+ }
125+ } ,
126+ module : {
127+ rules : [ TypescriptLoader ]
128+ } ,
129+ target : [ 'es2024' , 'web' ]
130+ } )
131+
132+ await RunCompiler ( MainBuilder )
69133}
0 commit comments