parcel-bundler
Version:
<p align="center"> <a href="https://parceljs.org/" target="_blank"> <img alt="Parcel" src="https://user-images.githubusercontent.com/19409/31321658-f6aed0f2-ac3d-11e7-8100-1587e676e0ec.png" width="749"> </a> </p>
85 lines (68 loc) • 1.89 kB
JavaScript
const Asset = require('../Asset');
const glob = require('glob');
const micromatch = require('micromatch');
const path = require('path');
class GlobAsset extends Asset {
constructor(name, pkg, options) {
super(name, pkg, options);
this.type = null; // allows this asset to be included in any type bundle
}
async load() {
let regularExpressionSafeName = this.name;
if (process.platform === 'win32')
regularExpressionSafeName = regularExpressionSafeName.replace(/\\/g, '/');
let files = glob.sync(regularExpressionSafeName, {
strict: true,
nodir: true
});
let re = micromatch.makeRe(regularExpressionSafeName, {capture: true});
let matches = {};
for (let file of files) {
let match = file.match(re);
let parts = match
.slice(1)
.filter(Boolean)
.reduce((a, p) => a.concat(p.split('/')), []);
let relative =
'./' + path.relative(path.dirname(this.name), file.normalize('NFC'));
set(matches, parts, relative);
this.addDependency(relative);
}
return matches;
}
generate() {
return {
js: 'module.exports = ' + generate(this.contents) + ';'
};
}
}
function generate(matches, indent = '') {
if (typeof matches === 'string') {
return `require(${JSON.stringify(matches)})`;
}
let res = indent + '{';
let first = true;
for (let key in matches) {
if (!first) {
res += ',';
}
res += `\n${indent} ${JSON.stringify(key)}: ${generate(
matches[key],
indent + ' '
)}`;
first = false;
}
res += '\n' + indent + '}';
return res;
}
function set(obj, path, value) {
for (let i = 0; i < path.length - 1; i++) {
let part = path[i];
if (obj[part] == null) {
obj[part] = {};
}
obj = obj[part];
}
obj[path[path.length - 1]] = value;
}
module.exports = GlobAsset;