UNPKG

glov-build-preresolve

Version:

Sub-module path resolving task processor for glov-build

89 lines (81 loc) 2.29 kB
////////////////////////////////////////////////////////////////////////// // By default, resolves any 'glov/foo.js' strings to appropriate relative // paths assuming glov is located in the root of the source. const path = require('path'); function defaultPathRegexGenerator(key) { // Old default: // return new RegExp(`['"]${key}/([^'"]+\\.js)['"]`, 'g'); return new RegExp(`['"]${key}/([^'"]+)['"]`, 'g'); } const default_options = { // Source for resolving paths source: 'source', // Map from module name to local path within the source modules: { glov: 'glov', }, filter: /\.js$/, path_regex_generator: defaultPathRegexGenerator, }; // Another example: // { dir_map: '': ['common'], path_regex: /'common\/([^']+\.js)'/g } function forwardSlashes(str) { return str.replace(/\\/g, '/'); } function defaults(dest, src) { for (let f in src) { if (dest[f] === undefined) { dest[f] = src[f]; } } return dest; } module.exports = function glovPreResolve(params) { params = params || {}; params = defaults(params, default_options); let { source, filter, modules, path_regex_generator } = params; let module_data = {}; for (let key in modules) { module_data[key] = { path_regex: path_regex_generator(key), dest: modules[key], }; } return { input: [`${source}:**`], type: 'single', func: function (job, done) { let file = job.getFile(); if (!file.relative.match(filter)) { job.out(file); return void done(); } let contents = file.contents.toString(); let count = 0; Object.keys(module_data).forEach(function (key) { let { path_regex, dest } = module_data[key]; contents = contents.replace(path_regex, function (full, filename) { ++count; let relative = forwardSlashes(path.relative(path.dirname(file.relative), `${dest}/${filename}`)); if (relative[0] !== '.') { relative = `./${relative}`; } return `'${relative}'`; }); }); if (!count) { job.out(file); return void done(); } job.out({ relative: file.relative, contents, }); done(); }, version: [ params, 2, ], }; };