UNPKG

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
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;