docxtemplater/es6/resolve.js
2021-09-04 10:15:02 +05:00

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;