70 lines
1.6 KiB
JavaScript
70 lines
1.6 KiB
JavaScript
"use strict";
|
|
|
|
function moduleResolve(part, options) {
|
|
let moduleResolved;
|
|
for (let i = 0, l = options.modules.length; i < l; i++) {
|
|
const module = options.modules[i];
|
|
moduleResolved = module.resolve(part, options);
|
|
if (moduleResolved) {
|
|
return moduleResolved;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function resolve(options) {
|
|
const resolved = [];
|
|
const baseNullGetter = options.baseNullGetter;
|
|
const { compiled, scopeManager } = options;
|
|
options.nullGetter = (part, sm) => {
|
|
return baseNullGetter(part, sm || scopeManager);
|
|
};
|
|
options.resolved = resolved;
|
|
const errors = [];
|
|
return Promise.all(
|
|
compiled
|
|
.filter(function (part) {
|
|
return ["content", "tag"].indexOf(part.type) === -1;
|
|
})
|
|
.reduce(function (promises, part) {
|
|
const moduleResolved = moduleResolve(part, options);
|
|
let result;
|
|
if (moduleResolved) {
|
|
result = moduleResolved.then(function (value) {
|
|
resolved.push({ tag: part.value, value, lIndex: part.lIndex });
|
|
});
|
|
} else if (part.type === "placeholder") {
|
|
result = scopeManager
|
|
.getValueAsync(part.value, { part })
|
|
.then(function (value) {
|
|
if (value == null) {
|
|
value = options.nullGetter(part);
|
|
}
|
|
resolved.push({
|
|
tag: part.value,
|
|
value,
|
|
lIndex: part.lIndex,
|
|
});
|
|
return value;
|
|
});
|
|
} else {
|
|
return;
|
|
}
|
|
promises.push(
|
|
result.catch(function (e) {
|
|
if (e.length > 1) {
|
|
errors.push(...e);
|
|
} else {
|
|
errors.push(e);
|
|
}
|
|
})
|
|
);
|
|
return promises;
|
|
}, [])
|
|
).then(function () {
|
|
return { errors, resolved };
|
|
});
|
|
}
|
|
|
|
module.exports = resolve;
|