UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

59 lines (56 loc) 7.92 kB
import assert from "node:assert"; // Move constant to module scope to avoid recreation const BOOLEAN_MAP = { false: false, true: true }; const XML_NAMESPACE = "http://schemas.assemblee-nationale.fr/referentiel"; const XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"; export function cleanBooleanAttribute(o, key) { const stringValue = o[key]; if (stringValue === undefined || stringValue === null) { delete o[key]; return undefined; } const booleanValue = BOOLEAN_MAP[stringValue]; assert.notStrictEqual(booleanValue, undefined, `Invalid boolean value: ${key} = ${stringValue}`); o[key] = booleanValue; return booleanValue; } export function cleanIntegerAttribute(o, key) { const stringValue = o[key]; if (stringValue === undefined || stringValue === null) { delete o[key]; return undefined; } const integerValue = Number.parseInt(stringValue); assert(!Number.isNaN(integerValue), `Invalid number value: ${key} = ${stringValue}`); o[key] = integerValue; return integerValue; } /// Remove XML fields that have no use in JSON. export function cleanXmlArtefacts(o) { // Optimize namespace checks with direct property access const xmlns = o["@xmlns"] ?? o["xmlns"]; if (xmlns !== undefined) { assert.strictEqual(xmlns, XML_NAMESPACE); delete o["@xmlns"]; delete o["xmlns"]; } if (o["@xmlns:xsi"] === XSI_NAMESPACE) { delete o["@xmlns:xsi"]; } // Optimize empty checks with direct property access for (const key in o) { const value = o[key]; if (value === null) { delete o[key]; continue; } if (value === undefined) continue; if (value["@xsi:nil"] === "true" || Array.isArray(value) && value.length === 0 || !Array.isArray(value) && value.constructor === Object && Object.keys(value).length === 0) { delete o[key]; } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJCT09MRUFOX01BUCIsImZhbHNlIiwidHJ1ZSIsIlhNTF9OQU1FU1BBQ0UiLCJYU0lfTkFNRVNQQUNFIiwiY2xlYW5Cb29sZWFuQXR0cmlidXRlIiwibyIsImtleSIsInN0cmluZ1ZhbHVlIiwidW5kZWZpbmVkIiwiYm9vbGVhblZhbHVlIiwibm90U3RyaWN0RXF1YWwiLCJjbGVhbkludGVnZXJBdHRyaWJ1dGUiLCJpbnRlZ2VyVmFsdWUiLCJOdW1iZXIiLCJwYXJzZUludCIsImlzTmFOIiwiY2xlYW5YbWxBcnRlZmFjdHMiLCJ4bWxucyIsInN0cmljdEVxdWFsIiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJjb25zdHJ1Y3RvciIsIk9iamVjdCIsImtleXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xlYW5lcnMveG1sLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0XCJcblxuLy8gTW92ZSBjb25zdGFudCB0byBtb2R1bGUgc2NvcGUgdG8gYXZvaWQgcmVjcmVhdGlvblxuY29uc3QgQk9PTEVBTl9NQVAgPSB7XG4gIGZhbHNlOiBmYWxzZSxcbiAgdHJ1ZTogdHJ1ZSxcbn0gYXMgY29uc3RcblxuY29uc3QgWE1MX05BTUVTUEFDRSA9IFwiaHR0cDovL3NjaGVtYXMuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9yZWZlcmVudGllbFwiXG5jb25zdCBYU0lfTkFNRVNQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkJvb2xlYW5BdHRyaWJ1dGUoXG4gIG86IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIGtleTogc3RyaW5nLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0cmluZ1ZhbHVlID0gb1trZXldXG4gIGlmIChzdHJpbmdWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHN0cmluZ1ZhbHVlID09PSBudWxsKSB7XG4gICAgZGVsZXRlIG9ba2V5XVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICBjb25zdCBib29sZWFuVmFsdWU6IGJvb2xlYW4gPVxuICAgIEJPT0xFQU5fTUFQW3N0cmluZ1ZhbHVlIGFzIGtleW9mIHR5cGVvZiBCT09MRUFOX01BUF1cbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgIGJvb2xlYW5WYWx1ZSxcbiAgICB1bmRlZmluZWQsXG4gICAgYEludmFsaWQgYm9vbGVhbiB2YWx1ZTogJHtrZXl9ID0gJHtzdHJpbmdWYWx1ZX1gLFxuICApXG4gIG9ba2V5XSA9IGJvb2xlYW5WYWx1ZVxuICByZXR1cm4gYm9vbGVhblZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkludGVnZXJBdHRyaWJ1dGUoXG4gIG86IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIGtleTogc3RyaW5nLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RyaW5nVmFsdWUgPSBvW2tleV1cbiAgaWYgKHN0cmluZ1ZhbHVlID09PSB1bmRlZmluZWQgfHwgc3RyaW5nVmFsdWUgPT09IG51bGwpIHtcbiAgICBkZWxldGUgb1trZXldXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIGNvbnN0IGludGVnZXJWYWx1ZSA9IE51bWJlci5wYXJzZUludChzdHJpbmdWYWx1ZSlcbiAgYXNzZXJ0KFxuICAgICFOdW1iZXIuaXNOYU4oaW50ZWdlclZhbHVlKSxcbiAgICBgSW52YWxpZCBudW1iZXIgdmFsdWU6ICR7a2V5fSA9ICR7c3RyaW5nVmFsdWV9YCxcbiAgKVxuICBvW2tleV0gPSBpbnRlZ2VyVmFsdWVcbiAgcmV0dXJuIGludGVnZXJWYWx1ZVxufVxuXG4vLy8gUmVtb3ZlIFhNTCBmaWVsZHMgdGhhdCBoYXZlIG5vIHVzZSBpbiBKU09OLlxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuWG1sQXJ0ZWZhY3RzKG86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiB2b2lkIHtcbiAgLy8gT3B0aW1pemUgbmFtZXNwYWNlIGNoZWNrcyB3aXRoIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3NcbiAgY29uc3QgeG1sbnMgPSBvW1wiQHhtbG5zXCJdID8/IG9bXCJ4bWxuc1wiXVxuICBpZiAoeG1sbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh4bWxucywgWE1MX05BTUVTUEFDRSlcbiAgICBkZWxldGUgb1tcIkB4bWxuc1wiXVxuICAgIGRlbGV0ZSBvW1wieG1sbnNcIl1cbiAgfVxuXG4gIGlmIChvW1wiQHhtbG5zOnhzaVwiXSA9PT0gWFNJX05BTUVTUEFDRSkge1xuICAgIGRlbGV0ZSBvW1wiQHhtbG5zOnhzaVwiXVxuICB9XG5cbiAgLy8gT3B0aW1pemUgZW1wdHkgY2hlY2tzIHdpdGggZGlyZWN0IHByb3BlcnR5IGFjY2Vzc1xuICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvW2tleV1cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSBvW2tleV1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICBpZiAoXG4gICAgICB2YWx1ZVtcIkB4c2k6bmlsXCJdID09PSBcInRydWVcIiB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJlxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgZGVsZXRlIG9ba2V5XVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sYUFBYTs7QUFFaEM7QUFDQSxNQUFNQyxXQUFXLEdBQUc7RUFDbEJDLEtBQUssRUFBRSxLQUFLO0VBQ1pDLElBQUksRUFBRTtBQUNSLENBQVU7QUFFVixNQUFNQyxhQUFhLEdBQUcsbURBQW1EO0FBQ3pFLE1BQU1DLGFBQWEsR0FBRywyQ0FBMkM7QUFFakUsT0FBTyxTQUFTQyxxQkFBcUJBLENBQ25DQyxDQUF5QixFQUN6QkMsR0FBVyxFQUNVO0VBQ3JCLE1BQU1DLFdBQVcsR0FBR0YsQ0FBQyxDQUFDQyxHQUFHLENBQUM7RUFDMUIsSUFBSUMsV0FBVyxLQUFLQyxTQUFTLElBQUlELFdBQVcsS0FBSyxJQUFJLEVBQUU7SUFDckQsT0FBT0YsQ0FBQyxDQUFDQyxHQUFHLENBQUM7SUFDYixPQUFPRSxTQUFTO0VBQ2xCO0VBQ0EsTUFBTUMsWUFBcUIsR0FDekJWLFdBQVcsQ0FBQ1EsV0FBVyxDQUE2QjtFQUN0RFQsTUFBTSxDQUFDWSxjQUFjLENBQ25CRCxZQUFZLEVBQ1pELFNBQVMsRUFDVCwwQkFBMEJGLEdBQUcsTUFBTUMsV0FBVyxFQUNoRCxDQUFDO0VBQ0RGLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLEdBQUdHLFlBQVk7RUFDckIsT0FBT0EsWUFBWTtBQUNyQjtBQUVBLE9BQU8sU0FBU0UscUJBQXFCQSxDQUNuQ04sQ0FBeUIsRUFDekJDLEdBQVcsRUFDUztFQUNwQixNQUFNQyxXQUFXLEdBQUdGLENBQUMsQ0FBQ0MsR0FBRyxDQUFDO0VBQzFCLElBQUlDLFdBQVcsS0FBS0MsU0FBUyxJQUFJRCxXQUFXLEtBQUssSUFBSSxFQUFFO0lBQ3JELE9BQU9GLENBQUMsQ0FBQ0MsR0FBRyxDQUFDO0lBQ2IsT0FBT0UsU0FBUztFQUNsQjtFQUNBLE1BQU1JLFlBQVksR0FBR0MsTUFBTSxDQUFDQyxRQUFRLENBQUNQLFdBQVcsQ0FBQztFQUNqRFQsTUFBTSxDQUNKLENBQUNlLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDSCxZQUFZLENBQUMsRUFDM0IseUJBQXlCTixHQUFHLE1BQU1DLFdBQVcsRUFDL0MsQ0FBQztFQUNERixDQUFDLENBQUNDLEdBQUcsQ0FBQyxHQUFHTSxZQUFZO0VBQ3JCLE9BQU9BLFlBQVk7QUFDckI7O0FBRUE7QUFDQSxPQUFPLFNBQVNJLGlCQUFpQkEsQ0FBQ1gsQ0FBeUIsRUFBUTtFQUNqRTtFQUNBLE1BQU1ZLEtBQUssR0FBR1osQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJQSxDQUFDLENBQUMsT0FBTyxDQUFDO0VBQ3ZDLElBQUlZLEtBQUssS0FBS1QsU0FBUyxFQUFFO0lBQ3ZCVixNQUFNLENBQUNvQixXQUFXLENBQUNELEtBQUssRUFBRWYsYUFBYSxDQUFDO0lBQ3hDLE9BQU9HLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDbEIsT0FBT0EsQ0FBQyxDQUFDLE9BQU8sQ0FBQztFQUNuQjtFQUVBLElBQUlBLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBS0YsYUFBYSxFQUFFO0lBQ3JDLE9BQU9FLENBQUMsQ0FBQyxZQUFZLENBQUM7RUFDeEI7O0VBRUE7RUFDQSxLQUFLLE1BQU1DLEdBQUcsSUFBSUQsQ0FBQyxFQUFFO0lBQ25CLE1BQU1jLEtBQUssR0FBR2QsQ0FBQyxDQUFDQyxHQUFHLENBQUM7SUFDcEIsSUFBSWEsS0FBSyxLQUFLLElBQUksRUFBRTtNQUNsQixPQUFPZCxDQUFDLENBQUNDLEdBQUcsQ0FBQztNQUNiO0lBQ0Y7SUFFQSxJQUFJYSxLQUFLLEtBQUtYLFNBQVMsRUFBRTtJQUV6QixJQUNFVyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssTUFBTSxJQUMzQkMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUNHLE1BQU0sS0FBSyxDQUFFLElBQzNDLENBQUNGLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRixLQUFLLENBQUMsSUFDcEJBLEtBQUssQ0FBQ0ksV0FBVyxLQUFLQyxNQUFNLElBQzVCQSxNQUFNLENBQUNDLElBQUksQ0FBQ04sS0FBSyxDQUFDLENBQUNHLE1BQU0sS0FBSyxDQUFFLEVBQ2xDO01BQ0EsT0FBT2pCLENBQUMsQ0FBQ0MsR0FBRyxDQUFDO0lBQ2Y7RUFDRjtBQUNGIiwiaWdub3JlTGlzdCI6W119