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.44 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", "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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ5YW1sIiwiaW5kZXhCeUtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwibWFwIiwia2V5IiwiaW5kZXgiLCJzb3J0S2V5RnJvbVN0cmluZyIsInMiLCJyZXBsYWNlIiwibWF0Y2giLCJwYWRTdGFydCIsInJhd1BhcmFtZXRlckZyb21ZYW1sIiwicmF3UGFyYW1ldGVyWWFtbCIsImxvYWQiLCJzY2hlbWEiLCJKU09OX1NDSEVNQSIsInVuaXRzRnJvbVlhbWwiLCJ1bml0c1lhbWwiLCJ5YW1sRnJvbVJhd1BhcmFtZXRlciIsInJhd1BhcmFtZXRlciIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0FycmF5SW5kZW50IiwicXVvdGluZ1R5cGUiLCJzb3J0S2V5cyIsImtleUEiLCJrZXlCIiwiaW5kZXhBIiwiaW5kZXhCIiwidW5kZWZpbmVkIiwibnVtYmVyQSIsIk51bWJlciIsIm51bWJlckIiLCJpc05hTiIsImxvY2FsZUNvbXBhcmUiXSwic291cmNlcyI6WyIuLi9zcmMveWFtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeWFtbCBmcm9tIFwianMteWFtbFwiXG5cbmNvbnN0IGluZGV4QnlLZXk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICBcImZpbGVfcGF0aFwiLFxuICAgIFwiZGVzY3JpcHRpb25cIixcbiAgICBcImJyYWNrZXRzXCIsXG4gICAgXCJ0aHJlc2hvbGRcIixcbiAgICBcImFtb3VudFwiLFxuICAgIFwiYmFzZVwiLFxuICAgIFwicmF0ZVwiLFxuICAgIFwiYXZlcmFnZV9yYXRlXCIsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBcIm1ldGFkYXRhXCIsXG4gICAgXCJkb2N1bWVudGF0aW9uXCIsXG4gICAgXCJkb2N1bWVudGF0aW9uX3N0YXJ0XCIsXG5cbiAgICAvLyBNZXRhZGF0YSBrZXlzXG4gICAgXCJzaG9ydF9sYWJlbFwiLFxuICAgIFwibGFzdF92YWx1ZV9zdGlsbF92YWxpZF9vblwiLFxuICAgIFwibGFiZWxfZW5cIixcbiAgICBcInNob3J0X2xhYmVsX2VuXCIsXG4gICAgXCJpcHBfY3N2X2lkXCIsXG4gICAgXCJ1bml0XCIsXG4gICAgXCJyZWZlcmVuY2VcIixcbiAgICBcImluZmxhdG9yXCIsXG4gICAgXCJpbmZsYXRvcl9yZWZlcmVuY2VcIixcbiAgICBcIm9mZmljaWFsX2pvdXJuYWxfZGF0ZVwiLFxuICAgIFwibm90ZXNcIixcblxuICAgIC8vIFJlZmVyZW5jZXMga2V5c1xuICAgIFwidGl0bGVcIixcbiAgICBcImhyZWZcIixcbiAgXS5tYXAoKGtleSwgaW5kZXgpID0+IFtrZXksIGluZGV4XSksXG4pXG5cbi8vLyBBZGQgMHMgdG8gdGhlIGxlZnQgb2YgbnVtYmVycyBpbnNpZGUgdGV4dHMsIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHByb3Blcmx5XG4vLy8gc29ydGVkLiBGb3IgZXhhbXBsZSBcInRyYW5jaGVfMVwiIGJlY29tZXMgXCJ0cmFuY2hlXzAwMDFcIiAmIFwidHJhbmNoZV8xMFwiIGJlY29tZXNcbi8vLyBcInRyYW5jaGVfMDAxMFwiLlxuLy8vIEFsc28gZW5zdXJlIHRoYXQga2V5cyBzdGFydGluZyB3aXRoIFwiYmVmb3JlX1wiIGFyZSBiZWZvcmUga2V5cyBzdGFydGluZyB3aXRoXG4vLy8gXCJhZnRlcl9cIi5cbmZ1bmN0aW9uIHNvcnRLZXlGcm9tU3RyaW5nKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzXG4gICAgLnJlcGxhY2UoL1xcZCsvZywgKG1hdGNoKSA9PiBtYXRjaC5wYWRTdGFydCgxMCwgXCIwXCIpKVxuICAgIC5yZXBsYWNlKC9eYWZ0ZXJfLywgXCJiZWZvcmZfXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXdQYXJhbWV0ZXJGcm9tWWFtbChyYXdQYXJhbWV0ZXJZYW1sOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHlhbWwubG9hZChyYXdQYXJhbWV0ZXJZYW1sLCB7XG4gICAgc2NoZW1hOiB5YW1sLkpTT05fU0NIRU1BLCAvLyBLZWVwIGRhdGVzIGFzIHN0cmluZ3MuXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bml0c0Zyb21ZYW1sKHVuaXRzWWFtbDogc3RyaW5nKSB7XG4gIHJldHVybiB5YW1sLmxvYWQodW5pdHNZYW1sLCB7XG4gICAgc2NoZW1hOiB5YW1sLkpTT05fU0NIRU1BLCAvLyBLZWVwIGRhdGVzIGFzIHN0cmluZ3MuXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5YW1sRnJvbVJhd1BhcmFtZXRlcihyYXdQYXJhbWV0ZXI6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHlhbWxcbiAgICAgIC5kdW1wKHJhd1BhcmFtZXRlciwge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0FycmF5SW5kZW50OiB0cnVlLFxuICAgICAgICBxdW90aW5nVHlwZTogJ1wiJyxcbiAgICAgICAgc29ydEtleXM6IChrZXlBOiBzdHJpbmcsIGtleUI6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4QSA9IGluZGV4QnlLZXlba2V5QV1cbiAgICAgICAgICBjb25zdCBpbmRleEIgPSBpbmRleEJ5S2V5W2tleUJdXG4gICAgICAgICAgaWYgKGluZGV4QSA9PT0gdW5kZWZpbmVkICYmIGluZGV4QiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJBID0gTnVtYmVyKGtleUEpXG4gICAgICAgICAgICBjb25zdCBudW1iZXJCID0gTnVtYmVyKGtleUIpXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bWJlckEpICYmIE51bWJlci5pc05hTihudW1iZXJCKVxuICAgICAgICAgICAgICA/IHNvcnRLZXlGcm9tU3RyaW5nKGtleUEpLmxvY2FsZUNvbXBhcmUoc29ydEtleUZyb21TdHJpbmcoa2V5QikpXG4gICAgICAgICAgICAgIDogbnVtYmVyQSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyAtMSAvLyBLZXlBIG11c3QgYmUgYmVmb3JlIG51bWJlckIuXG4gICAgICAgICAgICAgICAgOiBudW1iZXJCID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8gMSAvLyBOdW1iZXJBIG11c3QgYmUgYWZ0ZXIga2V5Qi5cbiAgICAgICAgICAgICAgICAgIDogbnVtYmVyQSAtIG51bWJlckJcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGluZGV4QSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDEgLy8gS2V5QSBtdXN0IGJlIGFmdGVyIGtleUIuXG4gICAgICAgICAgICA6IGluZGV4QiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gLTEgLy8gS2V5QSBtdXN0IGJlIGJlZm9yZSBrZXlCLlxuICAgICAgICAgICAgICA6IGluZGV4QSAtIGluZGV4QlxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC8vIFJlbW92ZSBxdW90ZXMgYXJvdW5kIGluc3RhbnQga2V5cy5cbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAvXiggKilcIigwMDAxLTAxLTAxfFsxMl1cXGR7M30oLSgwWzEtOV18MVswMTJdKSgtKDBbMS05XXxbMTJdXFxkfDNbMDFdKSk/KT8pXCI6L2dtLFxuICAgICAgICBcIiQxJDI6XCIsXG4gICAgICApXG4gICAgICAvLyBSZW1vdmUgcXVvdGVzIGFyb3VuZCBpbnRlZ2VyIGtleXMuXG4gICAgICAucmVwbGFjZSgvXiggKilcIihcXGQrKVwiOi9nbSwgXCIkMSQyOlwiKVxuICApXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLElBQUksTUFBTSxTQUFTO0FBRTFCLE1BQU1DLFVBQXFDLEdBQUdDLE1BQU0sQ0FBQ0MsV0FBVyxDQUM5RCxDQUNFLE1BQU0sRUFDTixXQUFXLEVBQ1gsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixVQUFVLEVBQ1YsZUFB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