UNPKG

@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
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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