@openfisca/json-model
Version:
Library to handle informations extracted in JSON or YAML format from OpenFisca parameters, variables, etc
112 lines • 15.9 kB
JavaScript
export class AstTransformer {
reduceErrorByKey(input, output, errorByKey) {
errorByKey = Object.fromEntries(Object.entries(errorByKey).filter(([, error]) => error != null));
const result = {
input,
output
};
if (Object.keys(errorByKey).length !== 0) {
result.error = errorByKey;
}
return result;
}
reduceMapErrors(results) {
return reduceMapErrors(results);
}
transform(input) {
const transformer = this[`transform_${input.ast_class}`] ?? this.transformGeneric;
return transformer.bind(this)(input);
}
transformGeneric(input) {
const outputByKey = {};
const errorByKey = {};
for (const [key, value] of Object.entries(input)) {
const attributeTransformer = this[`transform_${input.ast_class}_${key}`] ?? this.transformGenericAttribute;
const {
output,
error
} = attributeTransformer.bind(this)(input, key, value);
outputByKey[key] = output;
errorByKey[key] = error;
}
return this.transformGenericOutputByKey(input, outputByKey, errorByKey);
}
transformGenericAttribute(input, key, value) {
if (value === null) {
return {
input: value,
output: value
};
}
if (Array.isArray(value)) {
return reduceMapErrors(value.map(item => this.transformGenericAttribute(input, key, item)));
}
if (typeof value === "object" && value.ast_class !== undefined) {
return this.transform(value);
}
return {
input: value,
output: value
};
}
transformGenericOutputByKey(input, outputByKey, errorByKey) {
return this.reduceErrorByKey(input, outputByKey, errorByKey);
}
}
export class AstVisitor {
visit(node) {
const visitor = this[`visit_${node.ast_class}`] ?? this.visitGeneric;
visitor.bind(this)(node);
}
visitGeneric(node) {
for (const [key, value] of Object.entries(node)) {
if (key === "ast_class") {
continue;
}
const attributeVisitor = this[`visit_${node.ast_class}_${key}`] ?? this.visitGenericAttribute;
attributeVisitor.bind(this)(node, key, value);
}
}
visitGenericAttribute(node, key, value) {
if (value === null) {
return;
}
if (Array.isArray(value)) {
value.map(item => this.visitGenericAttribute(node, key, item));
}
if (typeof value === "object" && value.ast_class !== undefined) {
this.visit(value);
}
}
}
export function reduceMapErrors(results) {
const {
inputs,
outputs,
errorByIndex
} = results.reduce((accumulator, {
input,
output,
error
}, index) => {
accumulator.inputs.push(input);
accumulator.outputs.push(output);
if (error !== undefined) {
accumulator.errorByIndex[index] = error;
}
return accumulator;
}, {
inputs: [],
outputs: [],
errorByIndex: {}
});
const result = {
input: inputs,
output: outputs
};
if (Object.keys(errorByIndex).length !== 0) {
result.error = errorByIndex;
}
return result;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBc3RUcmFuc2Zvcm1lciIsInJlZHVjZUVycm9yQnlLZXkiLCJpbnB1dCIsIm91dHB1dCIsImVycm9yQnlLZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJmaWx0ZXIiLCJlcnJvciIsInJlc3VsdCIsImtleXMiLCJsZW5ndGgiLCJyZWR1Y2VNYXBFcnJvcnMiLCJyZXN1bHRzIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtZXIiLCJhc3RfY2xhc3MiLCJ0cmFuc2Zvcm1HZW5lcmljIiwiYmluZCIsIm91dHB1dEJ5S2V5Iiwia2V5IiwidmFsdWUiLCJhdHRyaWJ1dGVUcmFuc2Zvcm1lciIsInRyYW5zZm9ybUdlbmVyaWNBdHRyaWJ1dGUiLCJ0cmFuc2Zvcm1HZW5lcmljT3V0cHV0QnlLZXkiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpdGVtIiwidW5kZWZpbmVkIiwiQXN0VmlzaXRvciIsInZpc2l0Iiwibm9kZSIsInZpc2l0b3IiLCJ2aXNpdEdlbmVyaWMiLCJhdHRyaWJ1dGVWaXNpdG9yIiwidmlzaXRHZW5lcmljQXR0cmlidXRlIiwiaW5wdXRzIiwib3V0cHV0cyIsImVycm9yQnlJbmRleCIsInJlZHVjZSIsImFjY3VtdWxhdG9yIiwiaW5kZXgiLCJwdXNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FzdC92aXNpdG9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQXN0VHJhbnNmb3JtZXI8XG4gIElucHV0VHlwZSBleHRlbmRzIHsgYXN0X2NsYXNzOiB1bmtub3duIH0sXG4gIE91dHB1dFR5cGUsXG4+IHtcbiAgcmVkdWNlRXJyb3JCeUtleShcbiAgICBpbnB1dDogSW5wdXRUeXBlLFxuICAgIG91dHB1dDogT3V0cHV0VHlwZSxcbiAgICBlcnJvckJ5S2V5OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgKTogeyBpbnB1dDogSW5wdXRUeXBlOyBvdXRwdXQ6IE91dHB1dFR5cGU7IGVycm9yPzogdW5rbm93biB9IHtcbiAgICBlcnJvckJ5S2V5ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZXJyb3JCeUtleSkuZmlsdGVyKChbLCBlcnJvcl0pID0+IGVycm9yICE9IG51bGwpLFxuICAgIClcbiAgICBjb25zdCByZXN1bHQ6IHtcbiAgICAgIGlucHV0OiBJbnB1dFR5cGVcbiAgICAgIG91dHB1dDogT3V0cHV0VHlwZVxuICAgICAgZXJyb3I/OiB1bmtub3duXG4gICAgfSA9IHtcbiAgICAgIGlucHV0LFxuICAgICAgb3V0cHV0LFxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoZXJyb3JCeUtleSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSBlcnJvckJ5S2V5XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJlZHVjZU1hcEVycm9ycyhcbiAgICByZXN1bHRzOiB7IGlucHV0OiBJbnB1dFR5cGU7IG91dHB1dDogT3V0cHV0VHlwZTsgZXJyb3I/OiB1bmtub3duIH1bXSxcbiAgKToge1xuICAgIGlucHV0OiBJbnB1dFR5cGVbXVxuICAgIG91dHB1dDogT3V0cHV0VHlwZVtdXG4gICAgZXJyb3I/OiB1bmtub3duXG4gIH0ge1xuICAgIHJldHVybiByZWR1Y2VNYXBFcnJvcnMocmVzdWx0cylcbiAgfVxuXG4gIHRyYW5zZm9ybShpbnB1dDogSW5wdXRUeXBlKToge1xuICAgIGlucHV0OiBJbnB1dFR5cGVcbiAgICBvdXRwdXQ6IE91dHB1dFR5cGVcbiAgICBlcnJvcj86IHVua25vd25cbiAgfSB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPVxuICAgICAgKFxuICAgICAgICB0aGlzIGFzIHVua25vd24gYXMge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IChpbnB1dDogSW5wdXRUeXBlKSA9PiB7XG4gICAgICAgICAgICBpbnB1dDogSW5wdXRUeXBlXG4gICAgICAgICAgICBvdXRwdXQ6IE91dHB1dFR5cGVcbiAgICAgICAgICAgIGVycm9yPzogdW5rbm93blxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVtgdHJhbnNmb3JtXyR7aW5wdXQuYXN0X2NsYXNzfWBdID8/IHRoaXMudHJhbnNmb3JtR2VuZXJpY1xuICAgIHJldHVybiB0cmFuc2Zvcm1lci5iaW5kKHRoaXMpKGlucHV0KVxuICB9XG5cbiAgdHJhbnNmb3JtR2VuZXJpYyhpbnB1dDogSW5wdXRUeXBlKToge1xuICAgIGlucHV0OiBJbnB1dFR5cGVcbiAgICBvdXRwdXQ6IE91dHB1dFR5cGVcbiAgICBlcnJvcj86IHVua25vd25cbiAgfSB7XG4gICAgY29uc3Qgb3V0cHV0QnlLZXk6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cbiAgICBjb25zdCBlcnJvckJ5S2V5OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVUcmFuc2Zvcm1lciA9XG4gICAgICAgIChcbiAgICAgICAgICB0aGlzIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogKFxuICAgICAgICAgICAgICBpbnB1dDogSW5wdXRUeXBlLFxuICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgICAgICApID0+IHsgaW5wdXQ6IHVua25vd247IG91dHB1dDogdW5rbm93bjsgZXJyb3I/OiB1bmtub3duIH1cbiAgICAgICAgICB9XG4gICAgICAgIClbYHRyYW5zZm9ybV8ke2lucHV0LmFzdF9jbGFzc31fJHtrZXl9YF0gPz9cbiAgICAgICAgdGhpcy50cmFuc2Zvcm1HZW5lcmljQXR0cmlidXRlXG4gICAgICBjb25zdCB7IG91dHB1dCwgZXJyb3IgfSA9IGF0dHJpYnV0ZVRyYW5zZm9ybWVyLmJpbmQodGhpcykoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgKVxuICAgICAgb3V0cHV0QnlLZXlba2V5XSA9IG91dHB1dFxuICAgICAgZXJyb3JCeUtleVtrZXldID0gZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1HZW5lcmljT3V0cHV0QnlLZXkoaW5wdXQsIG91dHB1dEJ5S2V5LCBlcnJvckJ5S2V5KVxuICB9XG5cbiAgdHJhbnNmb3JtR2VuZXJpY0F0dHJpYnV0ZShcbiAgICBpbnB1dDogSW5wdXRUeXBlLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICApOiB7IGVycm9yPzogdW5rbm93bjsgaW5wdXQ6IHVua25vd247IG91dHB1dDogdW5rbm93biB9IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IGlucHV0OiB2YWx1ZSwgb3V0cHV0OiB2YWx1ZSB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJlZHVjZU1hcEVycm9ycyhcbiAgICAgICAgdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLnRyYW5zZm9ybUdlbmVyaWNBdHRyaWJ1dGUoaW5wdXQsIGtleSwgaXRlbSkpLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICh2YWx1ZSBhcyBJbnB1dFR5cGUpLmFzdF9jbGFzcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0odmFsdWUgYXMgSW5wdXRUeXBlKVxuICAgIH1cbiAgICByZXR1cm4geyBpbnB1dDogdmFsdWUsIG91dHB1dDogdmFsdWUgfVxuICB9XG5cbiAgdHJhbnNmb3JtR2VuZXJpY091dHB1dEJ5S2V5KFxuICAgIGlucHV0OiBJbnB1dFR5cGUsXG4gICAgb3V0cHV0QnlLZXk6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbiAgICB9LFxuICAgIGVycm9yQnlLZXk6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbiAgICB9LFxuICApOiB7IGlucHV0OiBJbnB1dFR5cGU7IG91dHB1dDogT3V0cHV0VHlwZTsgZXJyb3I/OiB1bmtub3duIH0ge1xuICAgIHJldHVybiB0aGlzLnJlZHVjZUVycm9yQnlLZXkoaW5wdXQsIG91dHB1dEJ5S2V5IGFzIE91dHB1dFR5cGUsIGVycm9yQnlLZXkpXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzdFZpc2l0b3I8SW5wdXRUeXBlIGV4dGVuZHMgeyBhc3RfY2xhc3M6IHVua25vd24gfT4ge1xuICB2aXNpdChub2RlOiBJbnB1dFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpdG9yID1cbiAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyBba2V5OiBzdHJpbmddOiAobm9kZTogSW5wdXRUeXBlKSA9PiB2b2lkIH0pW1xuICAgICAgICBgdmlzaXRfJHtub2RlLmFzdF9jbGFzc31gXG4gICAgICBdID8/IHRoaXMudmlzaXRHZW5lcmljXG4gICAgdmlzaXRvci5iaW5kKHRoaXMpKG5vZGUpXG4gIH1cblxuICB2aXNpdEdlbmVyaWMobm9kZTogSW5wdXRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiYXN0X2NsYXNzXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVZpc2l0b3IgPVxuICAgICAgICAoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IChcbiAgICAgICAgICAgICAgbm9kZTogSW5wdXRUeXBlLFxuICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgICAgICApID0+IHZvaWRcbiAgICAgICAgICB9XG4gICAgICAgIClbYHZpc2l0XyR7bm9kZS5hc3RfY2xhc3N9XyR7a2V5fWBdID8/IHRoaXMudmlzaXRHZW5lcmljQXR0cmlidXRlXG4gICAgICBhdHRyaWJ1dGVWaXNpdG9yLmJpbmQodGhpcykobm9kZSwga2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICB2aXNpdEdlbmVyaWNBdHRyaWJ1dGUobm9kZTogSW5wdXRUeXBlLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLm1hcCgoaXRlbSkgPT4gdGhpcy52aXNpdEdlbmVyaWNBdHRyaWJ1dGUobm9kZSwga2V5LCBpdGVtKSlcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAodmFsdWUgYXMgSW5wdXRUeXBlKS5hc3RfY2xhc3MgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy52aXNpdCh2YWx1ZSBhcyBJbnB1dFR5cGUpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VNYXBFcnJvcnM8SW5wdXRUeXBlLCBPdXRwdXRUeXBlPihcbiAgcmVzdWx0czogeyBpbnB1dDogSW5wdXRUeXBlOyBvdXRwdXQ6IE91dHB1dFR5cGU7IGVycm9yPzogdW5rbm93biB9W10sXG4pOiB7XG4gIGlucHV0OiBJbnB1dFR5cGVbXVxuICBvdXRwdXQ6IE91dHB1dFR5cGVbXVxuICBlcnJvcj86IHsgW2luZGV4OiBudW1iZXJdOiB1bmtub3duIH1cbn0ge1xuICBjb25zdCB7IGlucHV0cywgb3V0cHV0cywgZXJyb3JCeUluZGV4IH0gPSByZXN1bHRzLnJlZHVjZShcbiAgICAoYWNjdW11bGF0b3IsIHsgaW5wdXQsIG91dHB1dCwgZXJyb3IgfSwgaW5kZXgpID0+IHtcbiAgICAgIGFjY3VtdWxhdG9yLmlucHV0cy5wdXNoKGlucHV0KVxuICAgICAgYWNjdW11bGF0b3Iub3V0cHV0cy5wdXNoKG91dHB1dClcbiAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQnlJbmRleFtpbmRleF0gPSBlcnJvclxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yXG4gICAgfSxcbiAgICB7IGlucHV0czogW10sIG91dHB1dHM6IFtdLCBlcnJvckJ5SW5kZXg6IHt9IH0gYXMge1xuICAgICAgaW5wdXRzOiBJbnB1dFR5cGVbXVxuICAgICAgb3V0cHV0czogT3V0cHV0VHlwZVtdXG4gICAgICBlcnJvckJ5SW5kZXg6IHsgW2luZGV4OiBudW1iZXJdOiB1bmtub3duIH1cbiAgICB9LFxuICApXG4gIGNvbnN0IHJlc3VsdDoge1xuICAgIGlucHV0OiBJbnB1dFR5cGVbXVxuICAgIG91dHB1dDogT3V0cHV0VHlwZVtdXG4gICAgZXJyb3I/OiB7IFtpbmRleDogbnVtYmVyXTogdW5rbm93biB9XG4gIH0gPSB7IGlucHV0OiBpbnB1dHMsIG91dHB1dDogb3V0cHV0cyB9XG4gIGlmIChPYmplY3Qua2V5cyhlcnJvckJ5SW5kZXgpLmxlbmd0aCAhPT0gMCkge1xuICAgIHJlc3VsdC5lcnJvciA9IGVycm9yQnlJbmRleFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxjQUFjLENBR3pCO0VBQ0FDLGdCQUFnQkEsQ0FDZEMsS0FBZ0IsRUFDaEJDLE1BQWtCLEVBQ2xCQyxVQUFzQyxFQUNxQjtJQUMzREEsVUFBVSxHQUFHQyxNQUFNLENBQUNDLFdBQVcsQ0FDN0JELE1BQU0sQ0FBQ0UsT0FBTyxDQUFDSCxVQUFVLENBQUMsQ0FBQ0ksTUFBTSxDQUFDLENBQUMsR0FBR0MsS0FBSyxDQUFDLEtBQUtBLEtBQUssSUFBSSxJQUFJLENBQ2hFLENBQUM7SUFD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