tarima
Version:
Templating madness!
114 lines (89 loc) • 3.05 kB
JavaScript
;
const reImport = require('rewrite-imports');
const reExport = require('rewrite-exports');
const path = require('path');
const support = require('../support');
const _args = /([^=]+)=(["'])([^"']+?)\2|([^=]+)(?=\b)/g;
const _use = /("|')use strict\1;?/g;
const quoteMap = [
[/"/g, '"'],
[/'/g, "'"],
[/</g, '<'],
[/>/g, '>'],
];
function unquote(value) {
return quoteMap.reduce((prev, cur) => prev.replace(cur[0], cur[1]), value);
}
function processOutput(params) {
const _prefix = params.runtimes.join('\n');
if (_prefix) {
params.source = `${_prefix}\n${params.source}`;
}
// replace root-references in all generated code
params.source = params.source.replace(support.RE_FAKE_ROOT, '/');
if (params.isScript) {
const fixedFormat = (params.options.rollup || {}).format || '';
// rewrite imports for non-esm envs only!
if (!params._import && fixedFormat.indexOf('es') !== 0) {
params.source = reExport(reImport(params.source));
}
if (params.options.strict !== true) {
params.source = params.source.replace(_use, '');
}
if ((params.options.sourceMaps || params.options.compileDebug)
&& params.sourceMap && params.source.indexOf('sourceMappingURL') === -1) {
params.source += `\n//# sourceMappingURL=${support.toUrl(params.sourceMap)}`;
}
} else {
// custom tag-helpers
if (params.options.helpers) {
params.source = params.source.replace(params.options.helpers._regex, (_, tag, attrs, content) => {
const data = (attrs.match(_args) || []).reduce((prev, cur) => {
try {
const values = cur.split('=');
const key = values.shift().trim();
const val = values.length
? JSON.parse(values.join('='))
: 'true';
prev[key] = support.isJSON(val)
? JSON.parse(unquote(val))
: val;
} catch (e) {
throw new Error(`Failed while parsing: ${_}. ${e.message}`);
}
return prev;
}, {});
data.body = data.body || content;
return params.options.helpers[tag](data, params);
});
}
if ((params.options.sourceMaps || params.options.compileDebug)
&& params.sourceMap && params.source.indexOf('sourceMappingURL') === -1) {
params.source += `\n/*# sourceMappingURL=${support.toUrl(params.sourceMap)}*/`;
}
}
}
module.exports = (params, cb) => {
return err => {
if (err) {
return cb(err);
}
if (!params.source) {
cb(new Error(`Empty source from '${params.filename}'`));
}
if (params._chunks) {
params._chunks.forEach((info, key) => {
const chunk = {
...params,
source: info.code,
sourceMap: info.map,
filename: path.join(path.dirname(params.filename), info.name),
};
processOutput(chunk);
params._chunks[key] = chunk;
});
}
processOutput(params);
cb(undefined, params);
};
};