@openfisca/json-model
Version:
Library to handle informations extracted in JSON or YAML format from OpenFisca parameters, variables, etc
51 lines (50 loc) • 9.59 kB
JavaScript
import yaml from "js-yaml";
const indexByKey = Object.fromEntries(["name", "file_path", "description", "brackets", "threshold", "amount", "base", "rate", "average_rate", "values", "metadata", "documentation", "documentation_start",
// Metadata keys
"short_label", "last_value_still_valid_on", "label_en", "short_label_en", "ipp_csv_id", "unit", "reference", "revaluation_type", "revaluation_reference", "inflator", "inflator_reference", "official_journal_date", "notes",
// References keys
"title", "href"].map((key, index) => [key, index]));
/// Add 0s to the left of numbers inside texts, to ensure that they are properly
/// sorted. For example "tranche_1" becomes "tranche_0001" & "tranche_10" becomes
/// "tranche_0010".
/// Also ensure that keys starting with "before_" are before keys starting with
/// "after_".
function sortKeyFromString(s) {
return s.replace(/\d+/g, match => match.padStart(10, "0")).replace(/^after_/, "beforf_");
}
export function rawParameterFromYaml(rawParameterYaml) {
return yaml.load(rawParameterYaml, {
schema: yaml.JSON_SCHEMA // Keep dates as strings.
});
}
export function unitsFromYaml(unitsYaml) {
return yaml.load(unitsYaml, {
schema: yaml.JSON_SCHEMA // Keep dates as strings.
});
}
export function yamlFromRawParameter(rawParameter) {
return yaml.dump(rawParameter, {
lineWidth: -1,
noArrayIndent: true,
quotingType: '"',
sortKeys: (keyA, keyB) => {
const indexA = indexByKey[keyA];
const indexB = indexByKey[keyB];
if (indexA === undefined && indexB === undefined) {
const numberA = Number(keyA);
const numberB = Number(keyB);
return Number.isNaN(numberA) && Number.isNaN(numberB) ? sortKeyFromString(keyA).localeCompare(sortKeyFromString(keyB)) : numberA === undefined ? -1 // KeyA must be before numberB.
: numberB === undefined ? 1 // NumberA must be after keyB.
: numberA - numberB;
}
return indexA === undefined ? 1 // KeyA must be after keyB.
: indexB === undefined ? -1 // KeyA must be before keyB.
: indexA - indexB;
}
})
// Remove quotes around instant keys.
.replace(/^( *)"(0001-01-01|[12]\d{3}(-(0[1-9]|1[012])(-(0[1-9]|[12]\d|3[01]))?)?)":/gm, "$1$2:")
// Remove quotes around integer keys.
.replace(/^( *)"(\d+)":/gm, "$1$2:");
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ5YW1sIiwiaW5kZXhCeUtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwibWFwIiwia2V5IiwiaW5kZXgiLCJzb3J0S2V5RnJvbVN0cmluZyIsInMiLCJyZXBsYWNlIiwibWF0Y2giLCJwYWRTdGFydCIsInJhd1BhcmFtZXRlckZyb21ZYW1sIiwicmF3UGFyYW1ldGVyWWFtbCIsImxvYWQiLCJzY2hlbWEiLCJKU09OX1NDSEVNQSIsInVuaXRzRnJvbVlhbWwiLCJ1bml0c1lhbWwiLCJ5YW1sRnJvbVJhd1BhcmFtZXRlciIsInJhd1BhcmFtZXRlciIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0FycmF5SW5kZW50IiwicXVvdGluZ1R5cGUiLCJzb3J0S2V5cyIsImtleUEiLCJrZXlCIiwiaW5kZXhBIiwiaW5kZXhCIiwidW5kZWZpbmVkIiwibnVtYmVyQSIsIk51bWJlciIsIm51bWJlckIiLCJpc05hTiIsImxvY2FsZUNvbXBhcmUiXSwic291cmNlcyI6WyIuLi9zcmMveWFtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeWFtbCBmcm9tIFwianMteWFtbFwiXG5cbmNvbnN0IGluZGV4QnlLZXk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICBcImZpbGVfcGF0aFwiLFxuICAgIFwiZGVzY3JpcHRpb25cIixcbiAgICBcImJyYWNrZXRzXCIsXG4gICAgXCJ0aHJlc2hvbGRcIixcbiAgICBcImFtb3VudFwiLFxuICAgIFwiYmFzZVwiLFxuICAgIFwicmF0ZVwiLFxuICAgIFwiYXZlcmFnZV9yYXRlXCIsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBcIm1ldGFkYXRhXCIsXG4gICAgXCJkb2N1bWVudGF0aW9uXCIsXG4gICAgXCJkb2N1bWVudGF0aW9uX3N0YXJ0XCIsXG5cbiAgICAvLyBNZXRhZGF0YSBrZXlzXG4gICAgXCJzaG9ydF9sYWJlbFwiLFxuICAgIFwibGFzdF92YWx1ZV9zdGlsbF92YWxpZF9vblwiLFxuICAgIFwibGFiZWxfZW5cIixcbiAgICBcInNob3J0X2xhYmVsX2VuXCIsXG4gICAgXCJpcHBfY3N2X2lkXCIsXG4gICAgXCJ1bml0XCIsXG4gICAgXCJyZWZlcmVuY2VcIixcbiAgICBcInJldmFsdWF0aW9uX3R5cGVcIixcbiAgICBcInJldmFsdWF0aW9uX3JlZmVyZW5jZVwiLFxuICAgIFwiaW5mbGF0b3JcIixcbiAgICBcImluZmxhdG9yX3JlZmVyZW5jZVwiLFxuICAgIFwib2ZmaWNpYWxfam91cm5hbF9kYXRlXCIsXG4gICAgXCJub3Rlc1wiLFxuXG4gICAgLy8gUmVmZXJlbmNlcyBrZXlzXG4gICAgXCJ0aXRsZVwiLFxuICAgIFwiaHJlZlwiLFxuICBdLm1hcCgoa2V5LCBpbmRleCkgPT4gW2tleSwgaW5kZXhdKSxcbilcblxuLy8vIEFkZCAwcyB0byB0aGUgbGVmdCBvZiBudW1iZXJzIGluc2lkZSB0ZXh0cywgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgcHJvcGVybHlcbi8vLyBzb3J0ZWQuIEZvciBleGFtcGxlIFwidHJhbmNoZV8xXCIgYmVjb21lcyBcInRyYW5jaGVfMDAwMVwiICYgXCJ0cmFuY2hlXzEwXCIgYmVjb21lc1xuLy8vIFwidHJhbmNoZV8wMDEwXCIuXG4vLy8gQWxzbyBlbnN1cmUgdGhhdCBrZXlzIHN0YXJ0aW5nIHdpdGggXCJiZWZvcmVfXCIgYXJlIGJlZm9yZSBrZXlzIHN0YXJ0aW5nIHdpdGhcbi8vLyBcImFmdGVyX1wiLlxuZnVuY3Rpb24gc29ydEtleUZyb21TdHJpbmcoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFxkKy9nLCAobWF0Y2gpID0+IG1hdGNoLnBhZFN0YXJ0KDEwLCBcIjBcIikpXG4gICAgLnJlcGxhY2UoL15hZnRlcl8vLCBcImJlZm9yZl9cIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhd1BhcmFtZXRlckZyb21ZYW1sKHJhd1BhcmFtZXRlcllhbWw6IHN0cmluZykge1xuICByZXR1cm4geWFtbC5sb2FkKHJhd1BhcmFtZXRlcllhbWwsIHtcbiAgICBzY2hlbWE6IHlhbWwuSlNPTl9TQ0hFTUEsIC8vIEtlZXAgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXRzRnJvbVlhbWwodW5pdHNZYW1sOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHlhbWwubG9hZCh1bml0c1lhbWwsIHtcbiAgICBzY2hlbWE6IHlhbWwuSlNPTl9TQ0hFTUEsIC8vIEtlZXAgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHlhbWxGcm9tUmF3UGFyYW1ldGVyKHJhd1BhcmFtZXRlcjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgeWFtbFxuICAgICAgLmR1bXAocmF3UGFyYW1ldGVyLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQXJyYXlJbmRlbnQ6IHRydWUsXG4gICAgICAgIHF1b3RpbmdUeXBlOiAnXCInLFxuICAgICAgICBzb3J0S2V5czogKGtleUE6IHN0cmluZywga2V5Qjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXhBID0gaW5kZXhCeUtleVtrZXlBXVxuICAgICAgICAgIGNvbnN0IGluZGV4QiA9IGluZGV4QnlLZXlba2V5Ql1cbiAgICAgICAgICBpZiAoaW5kZXhBID09PSB1bmRlZmluZWQgJiYgaW5kZXhCID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckEgPSBOdW1iZXIoa2V5QSlcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckIgPSBOdW1iZXIoa2V5QilcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtYmVyQSkgJiYgTnVtYmVyLmlzTmFOKG51bWJlckIpXG4gICAgICAgICAgICAgID8gc29ydEtleUZyb21TdHJpbmcoa2V5QSkubG9jYWxlQ29tcGFyZShzb3J0S2V5RnJvbVN0cmluZyhrZXlCKSlcbiAgICAgICAgICAgICAgOiBudW1iZXJBID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IC0xIC8vIEtleUEgbXVzdCBiZSBiZWZvcmUgbnVtYmVyQi5cbiAgICAgICAgICAgICAgICA6IG51bWJlckIgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyAxIC8vIE51bWJlckEgbXVzdCBiZSBhZnRlciBrZXlCLlxuICAgICAgICAgICAgICAgICAgOiBudW1iZXJBIC0gbnVtYmVyQlxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5kZXhBID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMSAvLyBLZXlBIG11c3QgYmUgYWZ0ZXIga2V5Qi5cbiAgICAgICAgICAgIDogaW5kZXhCID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAtMSAvLyBLZXlBIG11c3QgYmUgYmVmb3JlIGtleUIuXG4gICAgICAgICAgICAgIDogaW5kZXhBIC0gaW5kZXhCXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLy8gUmVtb3ZlIHF1b3RlcyBhcm91bmQgaW5zdGFudCBrZXlzLlxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIC9eKCAqKVwiKDAwMDEtMDEtMDF8WzEyXVxcZHszfSgtKDBbMS05XXwxWzAxMl0pKC0oMFsxLTldfFsxMl1cXGR8M1swMV0pKT8pPylcIjovZ20sXG4gICAgICAgIFwiJDEkMjpcIixcbiAgICAgIClcbiAgICAgIC8vIFJlbW92ZSBxdW90ZXMgYXJvdW5kIGludGVnZXIga2V5cy5cbiAgICAgIC5yZXBsYWNlKC9eKCAqKVwiKFxcZCspXCI6L2dtLCBcIiQxJDI6XCIpXG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsSUFBSSxNQUFNLFNBQVM7QUFFMUIsTUFBTUMsVUFBcUMsR0FBR0MsTUFBTSxDQUFDQyxXQUFXLENBQzlELENBQ0UsTUFBTSxFQUNOLFdBQVcsRUFDWCxhQUFhLEVBQ2IsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFR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