Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions examples/jsdom/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const { JSDOM } = require('jsdom');
const { Compiler, Runtime } = require('@adobe/htlengine');

const code = ''
+ '<sly data-sly-use.doc="helper.js"/>'
+ '<sly data-sly-use.doc="./helper.js"/>'
+ '<!DOCTYPE html>'
+ '<html><head><title>${doc.title}</title></head>\n'
+ '<body>\n'
Expand All @@ -40,8 +40,7 @@ async function run() {
// setup the HTL compiler
const compiler = new Compiler().withRuntimeVar('document');

// compile the script to a executable template function
const template = await compiler.compileToFunction(code);
const template = await compiler.compileToFunction(code, __dirname, require);

// generate the input data using JSDOM
const document = new JSDOM(html).window.document;
Expand Down
24 changes: 16 additions & 8 deletions src/compiler/Compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,16 +170,24 @@ module.exports = class Compiler {
* @async
* @param {String} source HTL template code
* @param {String} baseDir the base directory to resolve file references
* @param {NodeRequire} localRequire Require function that will be used to load modules.
* @returns {Promise<Function>} the resulting function
*/
async compileToFunction(source, baseDir) {
async compileToFunction(source, baseDir, localRequire = require) {
const js = await this.compileToString(source, baseDir);
// poor men's module loader
// eslint-disable-next-line no-new-func
const template = new Function('module', 'require', js);
const module = {};
template.call(null, module, require);
return module.exports;
const template = new Function('exports', 'require', 'module', '__filename', '__dirname', js);
const mod = {
id: '.',
exports: {},
filename: 'internal',
children: [],
parent: null,
dirname: baseDir,
require: localRequire,
};
template.call(null, mod.exports, mod.require, mod, mod.filename, mod.dirname);
return mod.exports;
}

/**
Expand Down Expand Up @@ -240,7 +248,7 @@ module.exports = class Compiler {
i -= 1;
} else {
let file = c.filename;
if (file.startsWith('./')) {
if (file.startsWith('./') || file.startsWith('../')) {
file = path.resolve(baseDir, file);
}
let name = mods[file];
Expand Down Expand Up @@ -301,7 +309,7 @@ module.exports = class Compiler {
// make path relative to output directory
if (path.isAbsolute(file)) {
// eslint-disable-next-line no-param-reassign
file = path.relative(this._dir, file);
file = `.${path.sep}${path.relative(this._dir, file)}`;
}
imports += ` const ${name} = require(${JSON.stringify(file)});\n`;
});
Expand Down