@marko/compiler
Version:
Marko template to JS compiler.
155 lines (130 loc) • 4.79 kB
JavaScript
;exports.__esModule = true;exports._loader = exports._finder = void 0;exports.buildLookup = buildLookup;exports.clearCaches = clearCaches;exports.excludePackage = exports.excludeDir = void 0;exports.register = register;exports.resolveOptionalTaglibs = resolveOptionalTaglibs;var _modules = _interopRequireDefault(require("@marko/compiler/modules"));
var _path = _interopRequireDefault(require("path"));
var _tryLoadTranslator = _interopRequireDefault(require("../util/try-load-translator"));
var _config = _interopRequireDefault(require("./config"));
var _finder2 = _interopRequireDefault(require("./finder"));
var _loader2 = _interopRequireDefault(require("./loader"));
var _lookup = _interopRequireDefault(require("./lookup"));
var _markoHtml = _interopRequireDefault(require("./marko-html.json"));
var _markoMath = _interopRequireDefault(require("./marko-math.json"));
var _markoSvg = _interopRequireDefault(require("./marko-svg.json"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };}const excludeDir = exports.excludeDir = _finder2.default.excludeDir;const excludePackage = exports.excludePackage = _finder2.default.excludePackage;
const registeredTaglibs = [];
const loadedTranslatorsTaglibs = new Map();
let lookupCache = Object.create(null);
register(_markoHtml.default["taglib-id"], _markoHtml.default);
register(_markoSvg.default["taglib-id"], _markoSvg.default);
register(_markoMath.default["taglib-id"], _markoMath.default);
function buildLookup(dirname, requestedTranslator, onError) {
const translator = (0, _tryLoadTranslator.default)(requestedTranslator);
if (!translator || !Array.isArray(translator.taglibs)) {
throw new Error(
"@marko/compiler: Invalid translator provided to buildLookup(dir, translator)"
);
}
let taglibsForDir = loadedTranslatorsTaglibs.get(translator);
let exclusiveTagDiscoveryDirs = undefined;
if (!taglibsForDir) {
loadedTranslatorsTaglibs.set(
translator,
taglibsForDir = registeredTaglibs.concat(
resolveOptionalTaglibs(translator.optionalTaglibs || [], onError).
concat(translator.taglibs).
map(([id, props]) => loadTaglib(id, props))
)
);
}
runAndCatchErrors(() => {
const foundMeta = _finder2.default.find._withMeta(
dirname,
taglibsForDir,
translator.tagDiscoveryDirs
);
taglibsForDir = foundMeta.taglibs;
exclusiveTagDiscoveryDirs = foundMeta.exclusiveTagDiscoveryDirs;
}, onError);
const cacheKey = taglibsForDir.
map((it) => it.id).
sort().
join();
let lookup = lookupCache[cacheKey];
if (!lookup) {
lookup = lookupCache[cacheKey] = new _lookup.default();
lookup.exclusiveTagDiscoveryDirs = exclusiveTagDiscoveryDirs;
for (let i = taglibsForDir.length; i--;) {
const taglib = taglibsForDir[i];
lookup.addTaglib(taglib);
if (taglib.imports) {
for (const importedTaglib of taglib.imports) {
if (!lookup.hasTaglib(importedTaglib)) {
lookup.addTaglib(importedTaglib);
}
}
}
}
}
return lookup;
}
function register(id, props) {
if (typeof props === "undefined") {
[id, props] = resolveTaglib(id);
}
registeredTaglibs.push(loadTaglib(id, props));
}
function clearCaches() {
_loader2.default.clearCache();
_finder2.default.clearCache();
lookupCache = Object.create(null);
}
function resolveOptionalTaglibs(taglibIds, onError) {
const resolvedTaglibs = [];
for (const id of taglibIds) {
if (hasRootDependency(id)) {
runAndCatchErrors(() => {
resolvedTaglibs.push(resolveTaglib(id));
}, onError);
}
}
return resolvedTaglibs;
}
// Used by legacy compiler api.
const _loader = exports._loader = _loader2.default;
const _finder = exports._finder = _finder2.default;
function runAndCatchErrors(fn, onError) {
if (onError) {
const prevOnError = _config.default.onError;
_config.default.onError = onError;
try {
fn();
} catch (err) {
_config.default.onError(err);
} finally {
_config.default.onError = prevOnError;
}
} else {
fn();
}
}
function loadTaglib(id, props) {
return _loader2.default.loadTaglibFromProps(_loader2.default.createTaglib(id), props);
}
function resolveTaglib(id) {
switch (id[0]) {
case ".":
case "/":
case "\\":
break;
default:
if (!id.endsWith(".json")) {
id = _path.default.join(id, "marko.json");
}
break;
}
const resolved = _modules.default.resolve(id);
return [resolved, _modules.default.require(resolved)];
}
function hasRootDependency(id) {
return !!(
_modules.default.pkg && (
_modules.default.pkg.dependencies?.[id] ||
_modules.default.pkg.devDependencies?.[id]));
}