UNPKG

3.27 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const fs = require("fs");
4const path = require("path");
5const glob = require("glob");
6const denodeify = require("denodeify");
7const flattenDeep = require('lodash/flattenDeep');
8const globPromise = denodeify(glob);
9const statPromise = denodeify(fs.stat);
10function isDirectory(path) {
11 try {
12 return fs.statSync(path).isDirectory();
13 }
14 catch (_) {
15 return false;
16 }
17}
18// Adds an asset to the compilation assets;
19function addAsset(compilation, asset) {
20 const realPath = path.resolve(asset.originPath, asset.relativePath);
21 // Make sure that asset keys use forward slashes, otherwise webpack dev server
22 const servedPath = path.join(asset.destinationPath, asset.relativePath).replace(/\\/g, '/');
23 // Don't re-add existing assets.
24 if (compilation.assets[servedPath]) {
25 return Promise.resolve();
26 }
27 // Read file and add it to assets;
28 return statPromise(realPath)
29 .then((stat) => compilation.assets[servedPath] = {
30 size: () => stat.size,
31 source: () => fs.readFileSync(realPath)
32 });
33}
34class 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 // Force nodir option, since we can't add dirs to assets.
42 globOptions.nodir = true;
43 // Process patterns.
44 patterns = patterns.map(pattern => {
45 // Convert all string patterns to Pattern type.
46 pattern = typeof pattern === 'string' ? { glob: pattern } : pattern;
47 // Add defaults
48 // Input is always resolved relative to the defaultCwd (appRoot)
49 pattern.input = path.resolve(defaultCwd, pattern.input || '');
50 pattern.output = pattern.output || '';
51 pattern.glob = pattern.glob || '';
52 // Convert dir patterns to globs.
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 // Create an array of promises for each pattern glob
60 const globs = patterns.map((pattern) => new Promise((resolve, reject) =>
61 // Individual patterns can override cwd
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 // Wait for all globs.
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}
78exports.GlobCopyWebpackPlugin = GlobCopyWebpackPlugin;
79//# sourceMappingURL=/users/hansl/sources/angular-cli/plugins/glob-copy-webpack-plugin.js.map
\No newline at end of file