@webdiscus/pug-loader
Version:
Pug loader renders Pug files into HTML or compiles them into a template function.
97 lines (83 loc) • 3.11 kB
JavaScript
const Resolver = require('../Resolver');
const { ScriptCollection } = require('../Modules');
const { stringifyJSON, hmrFile } = require('../Utils');
/**
* Compile into template function and export a JS module.
*/
class CompileMethod {
constructor({ templateFile, templateName, esModule }) {
this.templateFile = templateFile;
this.templateName = templateName;
this.exportCode = esModule ? 'export default ' : 'module.exports=';
}
/**
* Returns the string as require() with interpolated value for a resource file.
*
* @param {string} value The required file.
* @param {string} issuer The issuer of required file.
* @return {string}
*/
require(value, issuer) {
const interpolatedValue = Resolver.interpolate(value, issuer);
return `require(${interpolatedValue})`;
}
/**
* Returns the string as require() with interpolated value for the script file.
* The filename from the script tag will be stored for usage in pug-plugin.
*
* @param {string} value The required file.
* @param {string} issuer The issuer of required file.
* @return {string}
*/
requireScript(value, issuer) {
const resolvedFile = Resolver.interpolate(value, issuer, 'script');
ScriptCollection.add(resolvedFile, this.templateFile);
return `require('${resolvedFile}')`;
}
/**
* Returns the string as require() with interpolated value for the style file.
*
* @param {string} value The required file.
* @param {string} issuer The issuer of required file.
* @return {string}
*/
requireStyle(value, issuer) {
const resolvedFile = Resolver.interpolate(value, issuer, 'style');
return `require('${resolvedFile}')`;
}
/**
* Export the compiled template function contained resolved source asset files.
* Note: the export is required for `compile` mode.
*
* @param {string} templateFunction The source code of the template function.
* @param {{}} data The object with external variables passed in template from data option.
* @return {string} The exported template function.
*/
export(templateFunction, data ) {
const functionName = this.templateName;
const exportFunctionName = 'exportFn';
if (!Object.keys(data).length) {
return `${templateFunction};${this.exportCode}${functionName};`;
}
return `${templateFunction};
var data = ${stringifyJSON(data)};
var ${exportFunctionName} = (context) => ${functionName}(Object.assign(data, context));
${this.exportCode}${exportFunctionName};`;
}
/**
* Export code with error message.
*
* @param {Error} error
* @param {Function} getErrorMessage
* @param {string} issuer
* @return {string}
*/
exportError(error, getErrorMessage, issuer) {
const requireHmrScript = `' + require('${hmrFile}') + '`;
const errStr = error.toString().replace(/'/g, "\\'");
const message = getErrorMessage.call(null, errStr, requireHmrScript);
ScriptCollection.add(hmrFile, this.templateFile);
return this.exportCode + `() => '${message}';`;
}
}
module.exports = CompileMethod;