8000 :sparkles: add multi-entry support · momocow/webpack-userscript@7915c6f · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 7915c6f

Browse files
committed
✨ add multi-entry support
1 parent 134ce4b commit 7915c6f

File tree

1 file changed

+68
-41
lines changed

1 file changed

+68
-41
lines changed

lib/plugin.ts

Lines changed: 68 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import { Headers, HeadersProps } from './headers';
77

88
const { ConcatSource, RawSource } = sources;
99

10-
export type HeadersProvider = () => HeadersProps | Promise<HeadersProps>;
10+
export type HeadersProvider = (
11+
...args: any[]
12+
) => HeadersProps | Promise<HeadersProps>;
1113
export type HeadersFile = string;
1214

1315
export interface UserscriptOptions {
@@ -42,7 +44,7 @@ export class UserscriptPlugin {
4244
);
4345

4446
compiler.hooks.compilation.tap(PLUGIN, (compilation) => {
45-
compilation.hooks.processAssets.tap(
47+
compilation.hooks.processAssets.tapPromise(
4648
{
4749
name: PLUGIN,
4850
stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE,
@@ -89,42 +91,45 @@ export class UserscriptPlugin {
8991
const { context, inputFileSystem } = this.compiler;
9092
const { root, headers: headersOptions } = this.options;
9193

92-
const defaultProps = await this.loadDefault(
94+
const headersProps = await this.loadDefault(
9395
root ?? context,
9496
inputFileSystem,
9597
);
96-
const headersProps = await this.resolveHeadersOptions(headersOptions);
97-
const headers = this.headersFactory({
98-
...defaultProps,
99-
...headersProps,
100-
});
10198

102-
this.compilationData.set(params, { headers });
103-
}
99+
let headersProviders: HeadersProvider | undefined;
104100

105-
private async resolveHeadersOptions(
106-
headersOptions: UserscriptOptions['headers'],
107-
): Promise<HeadersProps> {
108-
const { inputFileSystem } = this.compiler;
109101
if (typeof headersOptions === 'string') {
110-
return await readJSON<HeadersProps>(
111-
headersOptions,
112-
inputFileSystem as FsReadFile,
102+
Object.assign(
103+
headersProps,
104+
await readJSON<HeadersProps>(
105+
headersOptions,
106+
inputFileSystem as FsReadFile,
107+
),
113108
);
114109
} else if (typeof headersOptions === 'function') {
115-
return await headersOptions();
110+
headersProviders = headersOptions;
116111
} else {
117-
return headersOptions ?? {};
112+
Object.assign(headersProps, headersOptions);
118113
}
114+
115+
this.compilationData.set(params, { headersProps, headersProviders });
119116
}
120117

121-
private emit(compilation: Compilation): void {
118+
private async emit(compilation: Compilation): Promise<void> {
122119
const data = this.compilationData.get(compilation.params);
123120

124121
if (!data) return;
125122

126-
for (const fileInfo of this.analyzeFileInfo(compilation)) {
127-
this.emitAssets(compilation, fileInfo, data);
123+
const fileInfoList = this.analyzeFileInfo(compilation);
124+
125+
await Promise.all(
126+
fileInfoList.map((fileInfo) =>
127+
this.emitAssets(compilation, fileInfo, data),
128+
),
129+
);
130+
131+
for (const { file } of fileInfoList) {
132+
compilation.deleteAsset(file);
128133
}
129134
}
130135

@@ -133,13 +138,13 @@ export class UserscriptPlugin {
133138

134139
for (const entrypoint of compilation.entrypoints.values()) {
135140
const chunk = entrypoint.getEntrypointChunk();
136-
for (const sourceFile of chunk.files) {
137-
let q = sourceFile.indexOf('?');
141+
for (const file of chunk.files) {
142+
let q = file.indexOf('?');
138143
if (q < 0) {
139-
q = sourceFile.length;
144+
q = file.length;
140145
}
141-
const filename = sourceFile.slice(0, q);
142-
const query = sourceFile.slice(q);
146+
const filename = file.slice(0, q);
147+
const query = file.slice(q);
143148
const extname = path.extname(filename);
144149

145150
if (extname !== '.js') {
@@ -158,44 +163,65 @@ export class UserscriptPlugin {
158163

159164
fileInfo.push({
160165
chunk,
161-
sourceFile,
166+
file,
162167
userjsFile,
163168
metajsFile,
169+
filename,
170+
basename,
171+
query,
172+
extname,
173+
dirname,
164174
});
165175
}
166176
}
167177

168178
return fileInfo;
169179
}
170180

171-
private emitAssets(
181+
private async emitAssets(
172182
compilation: Compilation,
173-
{ sourceFile, chunk, metajsFile, userjsFile }: FileInfo,
183+
fileInfo: FileInfo,
174184
data: CompilationData,
175-
): void {
176-
const headersStr = data.headers.render();
185+
): Promise<void> {
186+
const { file, chunk, metajsFile, userjsFile } = fileInfo;
177187

178-
compilation.updateAsset(
179-
sourceFile,
180-
(source) => {
181-
return new ConcatSource(headersStr, '\n', source);
182-
},
188+
const headers = this.headersFactory({
189+
...data.headersProps,
190+
...(await data.headersProviders?.(fileInfo)),
191+
});
192+
const headersStr = headers.render();
193+
194+
const sourceAsset = compilation.getAsset(file);
195+
if (!sourceAsset) {
196+
return;
197+
}
198+
199+
compilation.emitAsset(
200+
userjsFile,
201+
new ConcatSource(headersStr, '\n', sourceAsset.source),
183202
{
184203
related: { metajs: metajsFile },
204+
minimized: true,
185205
},
186206
);
187-
compilation.renameAsset(sourceFile, userjsFile);
188207
compilation.emitAsset(metajsFile, new RawSource(headersStr), {
189-
// prevent metajs from optimization
208+
related: { userjs: userjsFile },
190209
minimized: true,
191210
});
211+
212+
chunk.files.add(userjsFile);
192213
chunk.auxiliaryFiles.add(metajsFile);
193214
}
194215
}
195216

196217
export interface FileInfo {
197218
chunk: Chunk;
198-
sourceFile: string;
219+
file: string;
220+
filename: string;
221+
basename: string;
222+
query: string;
223+
extname: string;
224+
dirname: string;
199225
userjsFile: string;
200226
metajsFile: string;
201227
}
@@ -210,5 +236,6 @@ interface PackageJson {
210236
}
211237

212238
interface CompilationData {
213-
headers: Headers;
239+
headersProps: HeadersProps;
240+
headersProviders?: HeadersProvider;
214241
}

0 commit comments

Comments
 (0)
0