forked from angular/angular-cli
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathglob-copy-webpack-plugin.ts
51 lines (42 loc) · 1.64 KB
/
glob-copy-webpack-plugin.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import * as fs from 'fs';
import * as path from 'path';
import * as glob from 'glob';
import * as denodeify from 'denodeify';
const globPromise = <any>denodeify(glob);
const statPromise = <any>denodeify(fs.stat);
export interface GlobCopyWebpackPluginOptions {
patterns: string[];
globOptions: any;
}
export class GlobCopyWebpackPlugin {
constructor(private options: GlobCopyWebpackPluginOptions) { }
apply(compiler: any): void {
let { patterns, globOptions } = this.options;
let context = globOptions.cwd || compiler.options.context;
// convert dir patterns to globs
patterns = patterns.map(pattern => fs.statSync(path.resolve(context, pattern)).isDirectory()
? pattern += '/**/*'
: pattern
);
// force nodir option, since we can't add dirs to assets
globOptions.nodir = true;
compiler.plugin('emit', (compilation: any, cb: any) => {
let globs = patterns.map(pattern => globPromise(pattern, globOptions));
let addAsset = (relPath: string) => compilation.assets[relPath]
// don't re-add to assets
? Promise.resolve()
: statPromise(path.resolve(context, relPath))
.then((stat: any) => compilation.assets[relPath] = {
size: () => stat.size,
source: () => fs.readFileSync(path.resolve(context, relPath))
});
Promise.all(globs)
// flatten results
.then(globResults => [].concat.apply([], globResults))
// add each file to compilation assets
.then(relPaths => relPaths.forEach((relPath: string) => addAsset(relPath)))
.catch((err) => compilation.errors.push(err))
.then(cb);
});
}
}