1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const fs = require("fs");
|
4 | const path = require("path");
|
5 | const glob = require("glob");
|
6 | const denodeify = require("denodeify");
|
7 | const flattenDeep = require('lodash/flattenDeep');
|
8 | const globPromise = denodeify(glob);
|
9 | const statPromise = denodeify(fs.stat);
|
10 | function isDirectory(path) {
|
11 | try {
|
12 | return fs.statSync(path).isDirectory();
|
13 | }
|
14 | catch (_) {
|
15 | return false;
|
16 | }
|
17 | }
|
18 |
|
19 | function addAsset(compilation, asset) {
|
20 | const realPath = path.resolve(asset.originPath, asset.relativePath);
|
21 |
|
22 | const servedPath = path.join(asset.destinationPath, asset.relativePath).replace(/\\/g, '/');
|
23 |
|
24 | if (compilation.assets[servedPath]) {
|
25 | return Promise.resolve();
|
26 | }
|
27 |
|
28 | return statPromise(realPath)
|
29 | .then((stat) => compilation.assets[servedPath] = {
|
30 | size: () => stat.size,
|
31 | source: () => fs.readFileSync(realPath)
|
32 | });
|
33 | }
|
34 | class GlobCopyWebpackPlugin {
|
35 | constructor(options) {
|
36 | this.options = options;
|
37 | }
|
38 | apply(compiler) {
|
39 | let { patterns, globOptions } = this.options;
|
40 | const defaultCwd = globOptions.cwd || compiler.options.context;
|
41 |
|
42 | globOptions.nodir = true;
|
43 |
|
44 | patterns = patterns.map(pattern => {
|
45 |
|
46 | pattern = typeof pattern === 'string' ? { glob: pattern } : pattern;
|
47 |
|
48 |
|
49 | pattern.input = path.resolve(defaultCwd, pattern.input || '');
|
50 | pattern.output = pattern.output || '';
|
51 | pattern.glob = pattern.glob || '';
|
52 |
|
53 | if (isDirectory(path.resolve(pattern.input, pattern.glob))) {
|
54 | pattern.glob = pattern.glob + '/**/*';
|
55 | }
|
56 | return pattern;
|
57 | });
|
58 | compiler.plugin('emit', (compilation, cb) => {
|
59 |
|
60 | const globs = patterns.map((pattern) => new Promise((resolve, reject) =>
|
61 |
|
62 | globPromise(pattern.glob, Object.assign({}, globOptions, { cwd: pattern.input }))
|
63 | .then((globResults) => globResults.map(res => ({
|
64 | originPath: pattern.input,
|
65 | destinationPath: pattern.output,
|
66 | relativePath: res
|
67 | })))
|
68 | .then((asset) => resolve(asset))
|
69 | .catch(reject)));
|
70 |
|
71 | Promise.all(globs)
|
72 | .then(assets => flattenDeep(assets))
|
73 | .then(assets => Promise.all(assets.map((asset) => addAsset(compilation, asset))))
|
74 | .then(() => cb());
|
75 | });
|
76 | }
|
77 | }
|
78 | exports.GlobCopyWebpackPlugin = GlobCopyWebpackPlugin;
|
79 |
|
\ | No newline at end of file |