diff --git a/npm/packs/aspnetcore.mvc.ui/gulp/copy-resources.js b/npm/packs/aspnetcore.mvc.ui/gulp/copy-resources.js index ff22d3cd53..03b9dc1e4a 100644 --- a/npm/packs/aspnetcore.mvc.ui/gulp/copy-resources.js +++ b/npm/packs/aspnetcore.mvc.ui/gulp/copy-resources.js @@ -4,7 +4,9 @@ var gulp = require("gulp"), merge = require("merge-stream"), - rimraf = require("rimraf"), + fse = require('fs-extra'), + glob = require('glob'), + micromatch = require('micromatch'), path = require("path"), extendObject = require('extend-object'); @@ -41,13 +43,42 @@ return undefined; } } - - function cleanFiles() { - if (resourceMapping.clean) { - for (var i = 0; i < resourceMapping.clean.length; i++) { - rimraf.sync(replaceAliases(resourceMapping.clean[i]) + '/**/*', { force: true }); - } - } + + function cleanDirsAndFiles(patterns) { + const { dirs, files } = findDirsAndFiles(patterns); + + files.forEach(file => fse.unlinkSync(file)); + dirs.forEach(dir => { + try { + fse.rmdirSync(dir); + } catch (_) {} + }); + } + + function findDirsAndFiles(patterns) { + const dirs = []; + const files = []; + + const list = glob.sync('**/*', { dot: true }); + + const matches = micromatch(list, normalizeGlob(patterns), { + dot: true, + }); + + matches.forEach(match => { + if (!fse.pathExistsSync(match)) return; + + (fse.statSync(match).isDirectory() ? dirs : files).push(match); + }); + + return { dirs, files }; + } + + function normalizeGlob(patterns) { + return patterns.map(pattern => { + const prefix = /\*$/.test(pattern) ? '' : '/**'; + return replaceAliases(pattern).replace(/(!?)\.\//, '$1') + prefix; + }); } function normalizeResourceMapping(resourcemapping) { @@ -106,7 +137,7 @@ rootPath = path; resourceMapping = normalizeResourceMapping(buildResourceMapping(rootPath)); - cleanFiles(); + cleanDirsAndFiles(resourceMapping.clean); var tasks = [];