@tricoteuses/assemblee 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +26 -8
  2. package/lib/amendements-40Z7OJLT.js +682 -0
  3. package/lib/amendements-DcffXOt8.js +154 -0
  4. package/lib/api.d.ts +0 -1
  5. package/lib/cleaners/actes_legislatifs.d.ts +0 -1
  6. package/lib/cleaners/acteurs.d.ts +0 -1
  7. package/lib/cleaners/amendements.d.ts +0 -1
  8. package/lib/cleaners/debats.d.ts +0 -1
  9. package/lib/cleaners/documents.d.ts +0 -1
  10. package/lib/cleaners/dossiers_legislatifs.d.ts +0 -1
  11. package/lib/cleaners/index.d.ts +0 -1
  12. package/lib/cleaners/organes.d.ts +0 -1
  13. package/lib/cleaners/questions.d.ts +0 -1
  14. package/lib/cleaners/reunions.d.ts +0 -1
  15. package/lib/cleaners/scrutins.d.ts +0 -1
  16. package/lib/cleaners/xml.d.ts +0 -1
  17. package/lib/cleaners.js +508 -1082
  18. package/lib/datasets.d.ts +0 -1
  19. package/lib/dates.d.ts +0 -1
  20. package/lib/dossiers_legislatifs.d.ts +1 -3
  21. package/lib/file_systems.d.ts +0 -1
  22. package/lib/git.d.ts +0 -1
  23. package/lib/index.d.ts +8 -9
  24. package/lib/index.js +857 -1211
  25. package/lib/inserters.d.ts +0 -1
  26. package/lib/loaders-DX6btNsl.js +4201 -0
  27. package/lib/loaders.d.ts +0 -1
  28. package/lib/loaders.js +27 -983
  29. package/lib/logger.d.ts +0 -1
  30. package/lib/organes.d.ts +0 -1
  31. package/lib/parse-Ccs6wcUg.js +2512 -0
  32. package/lib/parsers/index.d.ts +0 -1
  33. package/lib/parsers/plf.d.ts +0 -1
  34. package/lib/parsers/recherche_amendements.d.ts +3 -1
  35. package/lib/parsers/textes_lois.d.ts +0 -1
  36. package/lib/parsers.js +292 -287
  37. package/lib/raw_types/acteurs_et_organes.d.ts +0 -1
  38. package/lib/raw_types/agendas.d.ts +0 -1
  39. package/lib/raw_types/amendements.d.ts +0 -1
  40. package/lib/raw_types/debats.d.ts +0 -1
  41. package/lib/raw_types/dossiers_legislatifs.d.ts +8 -9
  42. package/lib/raw_types/questions.d.ts +0 -1
  43. package/lib/raw_types/scrutins.d.ts +0 -1
  44. package/lib/schemas/acteurs_et_organes.json +26 -26
  45. package/lib/schemas/agendas.json +47 -47
  46. package/lib/schemas/amendements.json +69 -68
  47. package/lib/schemas/dossiers_legislatifs.json +112 -112
  48. package/lib/schemas/questions.json +25 -25
  49. package/lib/schemas/scrutins.json +15 -15
  50. package/lib/scripts/add_links_to_documents.d.ts +0 -1
  51. package/lib/scripts/clean_reorganized_data.d.ts +0 -1
  52. package/lib/scripts/copy-schemas.d.ts +0 -1
  53. package/lib/scripts/diff_amendements.d.ts +0 -1
  54. package/lib/scripts/document_dossiers_legislatifs.d.ts +0 -1
  55. package/lib/scripts/generate-json-schemas.d.ts +0 -1
  56. package/lib/scripts/get_today_reunions.d.ts +0 -1
  57. package/lib/scripts/merge_scrutins.d.ts +0 -1
  58. package/lib/scripts/process_open_dataset.d.ts +0 -1
  59. package/lib/scripts/raw_types_from_amendements.d.ts +0 -1
  60. package/lib/scripts/reorganize_data.d.ts +0 -1
  61. package/lib/scripts/retrieve_deputes_photos.d.ts +0 -1
  62. package/lib/scripts/retrieve_documents.d.ts +0 -1
  63. package/lib/scripts/retrieve_open_data.d.ts +0 -1
  64. package/lib/scripts/retrieve_pending_amendments.d.ts +0 -1
  65. package/lib/scripts/retrieve_senateurs_photos.d.ts +0 -1
  66. package/lib/scripts/shared/cli_helpers.d.ts +0 -1
  67. package/lib/scripts/test_iter_load.d.ts +0 -1
  68. package/lib/scripts/test_load.d.ts +0 -1
  69. package/lib/scripts/test_load_big_files.d.ts +0 -1
  70. package/lib/scripts/validate_json.d.ts +0 -1
  71. package/lib/shared_types/codes_actes.d.ts +0 -1
  72. package/lib/strings.d.ts +0 -1
  73. package/lib/types/acteurs_et_organes.d.ts +26 -27
  74. package/lib/types/agendas.d.ts +21 -22
  75. package/lib/types/amendements.d.ts +76 -51
  76. package/lib/types/debats.d.ts +0 -1
  77. package/lib/types/dossiers_legislatifs.d.ts +51 -52
  78. package/lib/types/legislatures.d.ts +0 -1
  79. package/lib/types/questions.d.ts +22 -25
  80. package/lib/types/scrutins.d.ts +15 -16
  81. package/lib/urls.d.ts +0 -1
  82. package/package.json +12 -4
  83. package/lib/amendements-CN7bRFdP.js +0 -259
  84. package/lib/amendements-CN7bRFdP.js.map +0 -1
  85. package/lib/amendements-Cg1lyCBp.js +0 -735
  86. package/lib/amendements-Cg1lyCBp.js.map +0 -1
  87. package/lib/api.d.ts.map +0 -1
  88. package/lib/cleaners/actes_legislatifs.d.ts.map +0 -1
  89. package/lib/cleaners/acteurs.d.ts.map +0 -1
  90. package/lib/cleaners/amendements.d.ts.map +0 -1
  91. package/lib/cleaners/debats.d.ts.map +0 -1
  92. package/lib/cleaners/documents.d.ts.map +0 -1
  93. package/lib/cleaners/dossiers_legislatifs.d.ts.map +0 -1
  94. package/lib/cleaners/index.d.ts.map +0 -1
  95. package/lib/cleaners/organes.d.ts.map +0 -1
  96. package/lib/cleaners/questions.d.ts.map +0 -1
  97. package/lib/cleaners/reunions.d.ts.map +0 -1
  98. package/lib/cleaners/scrutins.d.ts.map +0 -1
  99. package/lib/cleaners/xml.d.ts.map +0 -1
  100. package/lib/cleaners.js.map +0 -1
  101. package/lib/datasets.d.ts.map +0 -1
  102. package/lib/dates.d.ts.map +0 -1
  103. package/lib/debats-BwZYgzXe.js +0 -3978
  104. package/lib/debats-BwZYgzXe.js.map +0 -1
  105. package/lib/dossiers_legislatifs.d.ts.map +0 -1
  106. package/lib/file_systems.d.ts.map +0 -1
  107. package/lib/git.d.ts.map +0 -1
  108. package/lib/index.d.ts.map +0 -1
  109. package/lib/index.js.map +0 -1
  110. package/lib/inserters.d.ts.map +0 -1
  111. package/lib/loaders.d.ts.map +0 -1
  112. package/lib/loaders.js.map +0 -1
  113. package/lib/logger.d.ts.map +0 -1
  114. package/lib/organes.d.ts.map +0 -1
  115. package/lib/parse-CzW8NHW5.js +0 -2850
  116. package/lib/parse-CzW8NHW5.js.map +0 -1
  117. package/lib/parsers/index.d.ts.map +0 -1
  118. package/lib/parsers/plf.d.ts.map +0 -1
  119. package/lib/parsers/recherche_amendements.d.ts.map +0 -1
  120. package/lib/parsers/textes_lois.d.ts.map +0 -1
  121. package/lib/parsers.js.map +0 -1
  122. package/lib/raw_types/acteurs_et_organes.d.ts.map +0 -1
  123. package/lib/raw_types/agendas.d.ts.map +0 -1
  124. package/lib/raw_types/amendements.d.ts.map +0 -1
  125. package/lib/raw_types/debats.d.ts.map +0 -1
  126. package/lib/raw_types/dossiers_legislatifs.d.ts.map +0 -1
  127. package/lib/raw_types/questions.d.ts.map +0 -1
  128. package/lib/raw_types/scrutins.d.ts.map +0 -1
  129. package/lib/schemas/acteurs_et_organes.d.json +0 -982
  130. package/lib/schemas/agendas.d.json +0 -1561
  131. package/lib/schemas/amendements.d.json +0 -1901
  132. package/lib/schemas/debats.d.json +0 -623
  133. package/lib/schemas/dossiers_legislatifs.d.json +0 -3690
  134. package/lib/schemas/legislatures.d.json +0 -17
  135. package/lib/schemas/questions.d.json +0 -520
  136. package/lib/schemas/scrutins.d.json +0 -517
  137. package/lib/scripts/add_links_to_documents.d.ts.map +0 -1
  138. package/lib/scripts/clean_reorganized_data.d.ts.map +0 -1
  139. package/lib/scripts/copy-schemas.d.ts.map +0 -1
  140. package/lib/scripts/diff_amendements.d.ts.map +0 -1
  141. package/lib/scripts/document_dossiers_legislatifs.d.ts.map +0 -1
  142. package/lib/scripts/generate-json-schemas.d.ts.map +0 -1
  143. package/lib/scripts/get_today_reunions.d.ts.map +0 -1
  144. package/lib/scripts/merge_scrutins.d.ts.map +0 -1
  145. package/lib/scripts/process_open_dataset.d.ts.map +0 -1
  146. package/lib/scripts/raw_types_from_amendements.d.ts.map +0 -1
  147. package/lib/scripts/reorganize_data.d.ts.map +0 -1
  148. package/lib/scripts/retrieve_deputes_photos.d.ts.map +0 -1
  149. package/lib/scripts/retrieve_documents.d.ts.map +0 -1
  150. package/lib/scripts/retrieve_open_data.d.ts.map +0 -1
  151. package/lib/scripts/retrieve_pending_amendments.d.ts.map +0 -1
  152. package/lib/scripts/retrieve_senateurs_photos.d.ts.map +0 -1
  153. package/lib/scripts/shared/cli_helpers.d.ts.map +0 -1
  154. package/lib/scripts/test_iter_load.d.ts.map +0 -1
  155. package/lib/scripts/test_load.d.ts.map +0 -1
  156. package/lib/scripts/test_load_big_files.d.ts.map +0 -1
  157. package/lib/scripts/validate_json.d.ts.map +0 -1
  158. package/lib/shared_types/codes_actes.d.ts.map +0 -1
  159. package/lib/strings.d.ts.map +0 -1
  160. package/lib/types/acteurs_et_organes.d.ts.map +0 -1
  161. package/lib/types/agendas.d.ts.map +0 -1
  162. package/lib/types/amendements.d.ts.map +0 -1
  163. package/lib/types/debats.d.ts.map +0 -1
  164. package/lib/types/dossiers_legislatifs.d.ts.map +0 -1
  165. package/lib/types/legislatures.d.ts.map +0 -1
  166. package/lib/types/questions.d.ts.map +0 -1
  167. package/lib/types/scrutins.d.ts.map +0 -1
  168. package/lib/urls.d.ts.map +0 -1
package/lib/parsers.js CHANGED
@@ -1,16 +1,16 @@
1
- import assert from "node:assert";
2
- import { JSDOM } from "jsdom";
3
- import { t as toDate, a as addLeadingZeros, p as parse$1, q as fr } from "./parse-CzW8NHW5.js";
4
- import deepEqual from "deep-equal";
5
- import fs from "fs-extra";
6
- import frontMatter from "front-matter";
7
- import jsYaml from "js-yaml";
8
- import path from "node:path";
9
- import { parse } from "node-html-parser";
10
- import { d as cleanAmendement } from "./amendements-CN7bRFdP.js";
11
- import { C as Convert } from "./amendements-Cg1lyCBp.js";
12
- function parseHeader(header) {
13
- const headersMapping = [
1
+ import e from "node:assert";
2
+ import { JSDOM as z } from "jsdom";
3
+ import { t as Q, a as v, p as k, q as J } from "./parse-Ccs6wcUg.js";
4
+ import Z from "deep-equal";
5
+ import q from "fs-extra";
6
+ import K from "front-matter";
7
+ import W from "js-yaml";
8
+ import F from "node:path";
9
+ import { parse as X } from "node-html-parser";
10
+ import { d as G } from "./amendements-DcffXOt8.js";
11
+ import { C as ee } from "./amendements-40Z7OJLT.js";
12
+ function te(i) {
13
+ const t = [
14
14
  { regex: /^(RAPPORT_)?ANNEXE(_|$)|^ETAT_/, level: 0, name: "Annexe" },
15
15
  { regex: /^TOME_/, level: 1, name: "Tome" },
16
16
  {
@@ -39,80 +39,61 @@ function parseHeader(header) {
39
39
  name: "CMP"
40
40
  }
41
41
  ];
42
- for (const { regex, level, name } of headersMapping) {
43
- if (regex.test(header)) {
44
- return [level, name];
45
- }
46
- }
42
+ for (const { regex: a, level: r, name: m } of t)
43
+ if (a.test(i))
44
+ return [r, m];
47
45
  return [null, ""];
48
46
  }
49
- function cleanText(text) {
50
- return text?.replace(/[\n\t]+/g, "").trim() || "";
47
+ function P(i) {
48
+ return i?.replace(/[\n\t]+/g, "").trim() || "";
51
49
  }
52
- const excludedAlineas = [
50
+ const ne = [
53
51
  /^Délibéré en séance publique/,
54
52
  /^Fait le/,
55
53
  /^La Présidente,$/,
56
54
  /^Le Président,$/,
57
55
  /^Signé/
58
56
  ];
59
- function isExcludedAlinea(text) {
60
- return excludedAlineas.some((regex) => regex.test(text));
57
+ function ae(i) {
58
+ return ne.some((t) => t.test(i));
61
59
  }
62
- function parseTexte(assembleeUrl, page) {
63
- const html = page.replace(/(<style[\w\W]+style>)/g, "");
64
- const { window } = new JSDOM(html);
65
- const document = window.document;
66
- assert.strictEqual(document.children.length, 1);
67
- const htmlElement = document.children[0];
68
- assert.strictEqual(htmlElement.children.length, 2);
69
- const bodyElement = htmlElement.children[1];
70
- let currentSection = bodyElement.children?.[1];
71
- if (bodyElement.children.length < 3 || currentSection.tagName !== "BR") {
60
+ function he(i, t) {
61
+ const a = t.replace(/(<style[\w\W]+style>)/g, ""), { window: r } = new z(a), m = r.document;
62
+ e.strictEqual(m.children.length, 1);
63
+ const d = m.children[0];
64
+ e.strictEqual(d.children.length, 2);
65
+ const u = d.children[1];
66
+ let n = u.children?.[1];
67
+ if (u.children.length < 3 || n.tagName !== "BR")
72
68
  return {
73
69
  error: null,
74
70
  subdivisions: [],
75
- url: assembleeUrl
71
+ url: i
76
72
  };
77
- }
78
- assert.strictEqual(bodyElement.children[0].tagName, "DIV");
79
- let alineaElement = null;
80
- let isMultiLinesHeader = false;
81
- let level = null;
82
- let state = "section";
83
- const levels = [];
84
- const subdivisions = [];
85
- let subdivisionAlineas = [];
86
- let subdivisionHeaders = [];
73
+ e.strictEqual(u.children[0].tagName, "DIV");
74
+ let o = null, s = !1, f = null, l = "section";
75
+ const c = [], S = [];
76
+ let p = [], g = [];
87
77
  try {
88
- while (state !== null) {
89
- switch (state) {
78
+ for (; l !== null; )
79
+ switch (l) {
90
80
  case "section":
91
- if (!currentSection.nextElementSibling) {
92
- state = null;
93
- } else {
94
- currentSection = currentSection.nextElementSibling;
95
- if (currentSection.tagName === "DIV") {
96
- alineaElement = currentSection.firstElementChild;
97
- if (alineaElement && !currentSection.id.includes("ftn")) {
98
- state = "alineaElement";
99
- }
100
- } else {
101
- assert(["BR", "HR", "P"].includes(currentSection.tagName), `Unexpected tag name "${currentSection.tagName}" for body child section`);
102
- }
103
- }
81
+ n.nextElementSibling ? (n = n.nextElementSibling, n.tagName === "DIV" ? (o = n.firstElementChild, o && !n.id.includes("ftn") && (l = "alineaElement")) : e(
82
+ ["BR", "HR", "P"].includes(n.tagName),
83
+ `Unexpected tag name "${n.tagName}" for body child section`
84
+ )) : l = null;
104
85
  break;
105
86
  case "alineaElement":
106
- if (!alineaElement) {
107
- state = "nextAlineaElement";
87
+ if (!o) {
88
+ l = "nextAlineaElement";
108
89
  break;
109
90
  }
110
- switch (alineaElement.tagName) {
91
+ switch (o.tagName) {
111
92
  case "DIV":
112
93
  case "OL":
113
94
  case "BR":
114
95
  case "SPAN":
115
- state = "nextAlineaElement";
96
+ l = "nextAlineaElement";
116
97
  break;
117
98
  case "H4":
118
99
  case "P":
@@ -122,272 +103,296 @@ function parseTexte(assembleeUrl, page) {
122
103
  return {
123
104
  error: {
124
105
  code: -2,
125
- message: `Unexpected tag name for alinea element: ${alineaElement.tagName}`
106
+ message: `Unexpected tag name for alinea element: ${o.tagName}`
126
107
  }
127
108
  };
128
109
  }
129
- const nameComputed = cleanText(alineaElement.textContent).normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_").toUpperCase();
130
- const [nextLevel, paragraphType] = parseHeader(nameComputed);
131
- if (!nameComputed || nextLevel !== null && nextLevel < 0) {
132
- state = "nextAlineaElement";
110
+ const E = P(o.textContent).normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_").toUpperCase(), [x, T] = te(E);
111
+ if (!E || x !== null && x < 0) {
112
+ l = "nextAlineaElement";
133
113
  break;
134
114
  }
135
- const lineHtml = cleanText(alineaElement.outerHTML);
136
- const lineText = cleanText(alineaElement.textContent);
137
- if (nextLevel === null) {
138
- if (isExcludedAlinea(lineText)) {
139
- state = "nextAlineaElement";
115
+ const h = P(o.outerHTML), $ = P(o.textContent);
116
+ if (x === null) {
117
+ if (ae($)) {
118
+ l = "nextAlineaElement";
140
119
  break;
141
120
  }
142
- if (subdivisionHeaders.length === 0 || isMultiLinesHeader && subdivisionAlineas.length === 0) {
143
- subdivisionHeaders.push({ texte: lineText, html: lineHtml });
144
- } else {
145
- subdivisionAlineas.push({ texte: lineText, html: lineHtml });
146
- }
147
- if (isMultiLinesHeader && subdivisionHeaders.length >= 2) {
148
- isMultiLinesHeader = false;
149
- }
121
+ g.length === 0 || s && p.length === 0 ? g.push({ texte: $, html: h }) : p.push({ texte: $, html: h }), s && g.length >= 2 && (s = !1);
150
122
  } else {
151
- level = nextLevel;
152
- while (levels.length > 0 && level < levels[levels.length - 1]) {
153
- levels.pop();
154
- }
155
- if (levels.length === 0 || level > levels[levels.length - 1]) {
156
- levels.push(level);
157
- }
158
- subdivisionAlineas = [];
159
- subdivisionHeaders = [{ texte: lineText, html: lineHtml }];
160
- isMultiLinesHeader = !nameComputed.match(/^ARTICLES?_/) && !nameComputed.match(/^EXPOSE_DES_MOTIFS$/);
161
- subdivisions.push({
162
- id: `D_${nameComputed}`,
163
- type: paragraphType,
164
- niveau: level + 1,
165
- niveauRelatif: levels.length,
166
- titres: subdivisionHeaders,
167
- alineas: subdivisionAlineas
123
+ for (f = x; c.length > 0 && f < c[c.length - 1]; )
124
+ c.pop();
125
+ (c.length === 0 || f > c[c.length - 1]) && c.push(f), p = [], g = [{ texte: $, html: h }], s = !E.match(/^ARTICLES?_/) && !E.match(/^EXPOSE_DES_MOTIFS$/), S.push({
126
+ id: `D_${E}`,
127
+ type: T,
128
+ niveau: f + 1,
129
+ niveauRelatif: c.length,
130
+ titres: g,
131
+ alineas: p
168
132
  });
169
133
  }
170
- state = "nextAlineaElement";
134
+ l = "nextAlineaElement";
171
135
  break;
172
136
  case "nextAlineaElement":
173
- if (!alineaElement) {
174
- state = "section";
137
+ if (!o) {
138
+ l = "section";
175
139
  break;
176
140
  }
177
- alineaElement = alineaElement.nextElementSibling;
178
- state = alineaElement ? "alineaElement" : "section";
141
+ o = o.nextElementSibling, l = o ? "alineaElement" : "section";
179
142
  break;
180
143
  default:
181
- throw new Error(`Unexpected state: ${state}`);
144
+ throw new Error(`Unexpected state: ${l}`);
182
145
  }
183
- }
184
- const result = {
146
+ const w = {
185
147
  error: null,
186
- subdivisions,
187
- url: assembleeUrl
148
+ subdivisions: S,
149
+ url: i
188
150
  };
189
- subdivisionAlineas = [];
190
- subdivisionHeaders = [];
191
- return result;
151
+ return p = [], g = [], w;
192
152
  } finally {
193
- window.close();
153
+ r.close();
194
154
  }
195
155
  }
196
- function formatISO(date, options) {
197
- const date_ = toDate(date, options?.in);
198
- if (isNaN(+date_)) {
156
+ function j(i, t) {
157
+ const a = Q(i, t?.in);
158
+ if (isNaN(+a))
199
159
  throw new RangeError("Invalid time value");
160
+ const r = t?.format ?? "extended", m = t?.representation ?? "complete";
161
+ let d = "", u = "";
162
+ const n = r === "extended" ? "-" : "", o = r === "extended" ? ":" : "";
163
+ if (m !== "time") {
164
+ const s = v(a.getDate(), 2), f = v(a.getMonth() + 1, 2);
165
+ d = `${v(a.getFullYear(), 4)}${n}${f}${n}${s}`;
200
166
  }
201
- const format = options?.format ?? "extended";
202
- const representation = options?.representation ?? "complete";
203
- let result = "";
204
- let tzOffset = "";
205
- const dateDelimiter = format === "extended" ? "-" : "";
206
- const timeDelimiter = format === "extended" ? ":" : "";
207
- if (representation !== "time") {
208
- const day = addLeadingZeros(date_.getDate(), 2);
209
- const month = addLeadingZeros(date_.getMonth() + 1, 2);
210
- const year = addLeadingZeros(date_.getFullYear(), 4);
211
- result = `${year}${dateDelimiter}${month}${dateDelimiter}${day}`;
167
+ if (m !== "date") {
168
+ const s = a.getTimezoneOffset();
169
+ if (s !== 0) {
170
+ const g = Math.abs(s), w = v(Math.trunc(g / 60), 2), E = v(g % 60, 2);
171
+ u = `${s < 0 ? "+" : "-"}${w}:${E}`;
172
+ } else
173
+ u = "Z";
174
+ const f = v(a.getHours(), 2), l = v(a.getMinutes(), 2), c = v(a.getSeconds(), 2), S = d === "" ? "" : "T", p = [f, l, c].join(o);
175
+ d = `${d}${S}${p}${u}`;
212
176
  }
213
- if (representation !== "date") {
214
- const offset = date_.getTimezoneOffset();
215
- if (offset !== 0) {
216
- const absoluteOffset = Math.abs(offset);
217
- const hourOffset = addLeadingZeros(Math.trunc(absoluteOffset / 60), 2);
218
- const minuteOffset = addLeadingZeros(absoluteOffset % 60, 2);
219
- const sign = offset < 0 ? "+" : "-";
220
- tzOffset = `${sign}${hourOffset}:${minuteOffset}`;
221
- } else {
222
- tzOffset = "Z";
223
- }
224
- const hour = addLeadingZeros(date_.getHours(), 2);
225
- const minute = addLeadingZeros(date_.getMinutes(), 2);
226
- const second = addLeadingZeros(date_.getSeconds(), 2);
227
- const separator = result === "" ? "" : "T";
228
- const time = [hour, minute, second].join(timeDelimiter);
229
- result = `${result}${separator}${time}${tzOffset}`;
230
- }
231
- return result;
177
+ return d;
232
178
  }
233
- async function* iterRechercheAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options = {}) {
234
- for await (const [amendementUrlPath, amendement] of iterRechercheRawAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options)) {
235
- cleanAmendement(amendement);
236
- yield [
237
- amendementUrlPath,
238
- Convert.toAmendement(JSON.stringify(amendement))
179
+ async function* Se(i, t, a, r, m, d = {}) {
180
+ for await (const [
181
+ u,
182
+ n
183
+ ] of le(
184
+ i,
185
+ t,
186
+ a,
187
+ r,
188
+ m,
189
+ d
190
+ ))
191
+ G(n), yield [
192
+ u,
193
+ ee.toAmendement(JSON.stringify(n))
239
194
  ];
240
- }
241
195
  }
242
- async function* iterRechercheRawAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options = {}) {
243
- await fs.ensureDir(amendementsSearchCacheDir);
244
- assert.strictEqual(/[?&]date_depot=/.exec(url), null, `URL ${url} already contains a deposit date`);
245
- assert.strictEqual(/[?&]order=/.exec(url), null, `URL ${url} already contains a sort order`);
246
- assert.strictEqual(/[?&]page=/.exec(url), null, `URL ${url} already contains a page number`);
247
- if (incremental) {
248
- assert.notStrictEqual(/[?&]etat=/.exec(url), null, `In incremental mode, URL ${url} must contain an "etat" query parameter`);
249
- }
250
- url += (url.includes("?") ? "&" : "?") + "order=date_depot,desc&page=1";
251
- if (minDateDepot != null) {
252
- assert.notStrictEqual(/\d{4}-\d{2}-\d{2}/.exec(minDateDepot), null, `Invalid format for minimum date: ${minDateDepot}`);
253
- }
254
- let amendementNumber = 0;
255
- iterSearchPages: while (true) {
256
- if (options.verbose) {
257
- console.log(`Fetching amendements search page at ${url}…`);
258
- }
259
- const response = await fetch(url);
260
- assert(response.ok, `Retrieval of search page at ${url} failed with error: ${response.status} ${response.statusText}`);
261
- const page = await response.text();
262
- const html = parse(page);
263
- if (html.querySelector("div.no-result") !== null) {
196
+ async function* le(i, t, a, r, m, d = {}) {
197
+ await q.ensureDir(i), e.strictEqual(
198
+ /[?&]date_depot=/.exec(t),
199
+ null,
200
+ `URL ${t} already contains a deposit date`
201
+ ), e.strictEqual(
202
+ /[?&]order=/.exec(t),
203
+ null,
204
+ `URL ${t} already contains a sort order`
205
+ ), e.strictEqual(
206
+ /[?&]page=/.exec(t),
207
+ null,
208
+ `URL ${t} already contains a page number`
209
+ ), a && e.notStrictEqual(
210
+ /[?&]etat=/.exec(t),
211
+ null,
212
+ `In incremental mode, URL ${t} must contain an "etat" query parameter`
213
+ ), t += (t.includes("?") ? "&" : "?") + "order=date_depot,desc&page=1", r != null && e.notStrictEqual(
214
+ /\d{4}-\d{2}-\d{2}/.exec(r),
215
+ null,
216
+ `Invalid format for minimum date: ${r}`
217
+ );
218
+ let u = 0;
219
+ e: for (; ; ) {
220
+ d.verbose && console.log(`Fetching amendements search page at ${t}…`);
221
+ const n = await fetch(t);
222
+ e(
223
+ n.ok,
224
+ `Retrieval of search page at ${t} failed with error: ${n.status} ${n.statusText}`
225
+ );
226
+ const o = await n.text(), s = X(o);
227
+ if (s.querySelector("div.no-result") !== null)
264
228
  break;
265
- }
266
- const amendementsCountDiv = html.querySelector("div.mirror-card-subtitle");
267
- assert.notStrictEqual(amendementsCountDiv, null);
268
- const amendementsCount = parseInt(/\d+/.exec(amendementsCountDiv.text)[0]);
269
- const amendementsDiv = html.querySelector("div.amendement-list--results-table");
270
- assert.notStrictEqual(amendementsDiv, null);
271
- const amendementsTable = amendementsDiv.querySelector("table");
272
- assert.notStrictEqual(amendementsTable, null);
273
- const tfootTr = amendementsTable.querySelector("tfoot > tr");
274
- assert.notStrictEqual(tfootTr, null);
275
- const tfootTrCells = tfootTr.querySelectorAll("td, th").map((cell) => cell.text);
276
- assert(deepEqual(tfootTrCells, [
277
- "",
278
- "",
279
- "Dossier législatif",
280
- "Emplacement",
281
- "Auteur",
282
- "État",
283
- "Sort",
284
- "Date d'examen",
285
- "Examiné par",
286
- "Texte visé",
287
- "Date de dépôt"
288
- ]), `Unexpected columns in ${JSON.stringify(tfootTrCells, null, 2)}`);
289
- const amendementsTr = amendementsTable.querySelectorAll("tbody > tr");
290
- assert.notStrictEqual(amendementsTr.length, 0);
291
- for (const amendementTr of amendementsTr) {
292
- amendementNumber++;
293
- if (minDateDepot != null || minDateExamen != null) {
294
- const amendementTdList = amendementTr.querySelectorAll("td");
295
- assert.strictEqual(amendementTdList.length, 11, `Unexpected number of columns in amendment row: ${amendementTr.outerHTML}`);
296
- if (minDateDepot != null) {
297
- const dateDepotTd = amendementTdList[10];
298
- const dateDepot = formatISO(parse$1(dateDepotTd.text, "d MMMM y", /* @__PURE__ */ new Date(), {
299
- locale: fr
300
- }), { representation: "date" });
301
- if (dateDepot < minDateDepot) {
302
- break iterSearchPages;
303
- }
229
+ const f = s.querySelector("div.mirror-card-subtitle");
230
+ e.notStrictEqual(f, null);
231
+ const l = parseInt(/\d+/.exec(f.text)[0]), c = s.querySelector(
232
+ "div.amendement-list--results-table"
233
+ );
234
+ e.notStrictEqual(c, null);
235
+ const S = c.querySelector("table");
236
+ e.notStrictEqual(S, null);
237
+ const p = S.querySelector("tfoot > tr");
238
+ e.notStrictEqual(p, null);
239
+ const g = p.querySelectorAll("td, th").map((T) => T.text);
240
+ e(
241
+ Z(g, [
242
+ "",
243
+ "",
244
+ "Dossier législatif",
245
+ "Emplacement",
246
+ "Auteur",
247
+ "État",
248
+ "Sort",
249
+ "Date d'examen",
250
+ "Examiné par",
251
+ "Texte visé",
252
+ "Date de dépôt"
253
+ ]),
254
+ `Unexpected columns in ${JSON.stringify(g, null, 2)}`
255
+ );
256
+ const w = S.querySelectorAll("tbody > tr");
257
+ e.notStrictEqual(w.length, 0);
258
+ for (const T of w) {
259
+ if (u++, r != null || m != null) {
260
+ const b = T.querySelectorAll("td");
261
+ if (e.strictEqual(
262
+ b.length,
263
+ 11,
264
+ `Unexpected number of columns in amendment row: ${T.outerHTML}`
265
+ ), r != null) {
266
+ const R = b[10];
267
+ if (j(
268
+ k(R.text, "d MMMM y", /* @__PURE__ */ new Date(), {
269
+ locale: J
270
+ }),
271
+ { representation: "date" }
272
+ ) < r)
273
+ break e;
304
274
  }
305
- if (minDateExamen != null) {
306
- const dateExamenTd = amendementTdList[7];
307
- if (dateExamenTd.text) {
308
- const dateExamen = formatISO(parse$1(dateExamenTd.text, "d MMMM y", /* @__PURE__ */ new Date(), {
309
- locale: fr
310
- }), { representation: "date" });
311
- if (dateExamen < minDateExamen) {
312
- continue;
313
- }
314
- }
275
+ if (m != null) {
276
+ const R = b[7];
277
+ if (R.text && j(
278
+ k(R.text, "d MMMM y", /* @__PURE__ */ new Date(), {
279
+ locale: J
280
+ }),
281
+ { representation: "date" }
282
+ ) < m)
283
+ continue;
315
284
  }
316
285
  }
317
- const amendementUrlPath = amendementTr.getAttribute("data-href");
318
- assert.notStrictEqual(amendementUrlPath, void 0);
319
- const amendementUrlPathSplitted = amendementUrlPath.split("/");
320
- assert.strictEqual(amendementUrlPathSplitted[0], "", `Unexpected URL path for amendement: ${amendementUrlPath}`);
321
- assert.strictEqual(amendementUrlPathSplitted[1], "dyn", `Unexpected URL path for amendement: ${amendementUrlPath}`);
322
- const amendementSearchCacheFilePath = path.join(amendementsSearchCacheDir, ...amendementUrlPathSplitted.slice(2)) + ".html";
323
- await fs.ensureDir(path.dirname(amendementSearchCacheFilePath));
324
- const existingAmendementSearchCache = await fs.pathExists(amendementSearchCacheFilePath) ? await fs.readFile(amendementSearchCacheFilePath, "utf8") : null;
325
- const amendementTrOuterHtml = amendementTr.outerHTML;
326
- const amendementSearchCache = `---
327
- ${jsYaml.dump({
328
- position: amendementsCount - amendementNumber,
329
- search: url.replace(/&page=[\d]+/, "")
330
- }, {
331
- sortKeys: true
332
- })}---
333
-
334
- ${amendementTrOuterHtml}`;
335
- if (amendementSearchCache === existingAmendementSearchCache) {
336
- if (incremental) {
337
- break iterSearchPages;
286
+ const h = T.getAttribute("data-href");
287
+ e.notStrictEqual(h, void 0);
288
+ const $ = h.split("/");
289
+ e.strictEqual(
290
+ $[0],
291
+ "",
292
+ `Unexpected URL path for amendement: ${h}`
293
+ ), e.strictEqual(
294
+ $[1],
295
+ "dyn",
296
+ `Unexpected URL path for amendement: ${h}`
297
+ );
298
+ const A = F.join(
299
+ i,
300
+ ...$.slice(2)
301
+ ) + ".html";
302
+ await q.ensureDir(F.dirname(A));
303
+ const y = await q.pathExists(
304
+ A
305
+ ) ? await q.readFile(A, "utf8") : null, L = T.outerHTML, U = `---
306
+ ${W.dump(
307
+ {
308
+ position: l - u,
309
+ search: t.replace(/&page=[\d]+/, "")
310
+ },
311
+ {
312
+ sortKeys: !0
338
313
  }
314
+ )}---
315
+
316
+ ${L}`;
317
+ if (U === y) {
318
+ if (a)
319
+ break e;
339
320
  continue;
340
321
  }
341
- if (existingAmendementSearchCache !== null && frontMatter(existingAmendementSearchCache).body === amendementTrOuterHtml) {
322
+ if (y !== null && K(y).body === L)
342
323
  continue;
343
- }
344
- if (options.verbose) {
345
- if (existingAmendementSearchCache === null) {
346
- console.log(`Adding amendement search cache: ${amendementSearchCacheFilePath}…`);
347
- } else {
348
- console.log(`Updating amendement search cache: ${amendementSearchCacheFilePath}…`);
349
- }
350
- }
351
- const amendementHtmlUrl = new URL(amendementUrlPath, "https://www.assemblee-nationale.fr/").toString();
352
- const amendementHtmlResponse = await fetch(amendementHtmlUrl);
353
- if (amendementHtmlResponse.status === 404) {
354
- console.log(`Amendement HTML page not found at ${amendementHtmlUrl}. Skipping.`);
324
+ d.verbose && console.log(
325
+ y === null ? `Adding amendement search cache: ${A}…` : `Updating amendement search cache: ${A}…`
326
+ );
327
+ const _ = new URL(
328
+ h,
329
+ "https://www.assemblee-nationale.fr/"
330
+ ).toString(), O = await fetch(_);
331
+ if (O.status === 404) {
332
+ console.log(
333
+ `Amendement HTML page not found at ${_}. Skipping.`
334
+ );
355
335
  continue;
356
336
  }
357
- assert(amendementHtmlResponse.ok, `Retrieval of amendement HTML page at ${amendementHtmlUrl} failed with error: ${amendementHtmlResponse.status} ${amendementHtmlResponse.statusText}`);
358
- const amendementHtmlPage = await amendementHtmlResponse.text();
359
- const amendementHtml = parse(amendementHtmlPage);
360
- const formatsLi = amendementHtml.querySelectorAll("li.mirror-card-header--options--content--item");
361
- assert.notStrictEqual(formatsLi.length, 0);
362
- const jsonLi = formatsLi.find((formatLi) => {
363
- const formatSpan = formatLi.querySelector("a > span");
364
- assert.notStrictEqual(formatSpan, null, `No <span> in <a> found in ${formatLi.toString()}`);
365
- return formatSpan.text === "Version JSON";
337
+ e(
338
+ O.ok,
339
+ `Retrieval of amendement HTML page at ${_} failed with error: ${O.status} ${O.statusText}`
340
+ );
341
+ const V = await O.text(), N = X(V).querySelectorAll(
342
+ "li.mirror-card-header--options--content--item"
343
+ );
344
+ e.notStrictEqual(N.length, 0);
345
+ const I = N.find((b) => {
346
+ const R = b.querySelector("a > span");
347
+ return e.notStrictEqual(
348
+ R,
349
+ null,
350
+ `No <span> in <a> found in ${b.toString()}`
351
+ ), R.text === "Version JSON";
366
352
  });
367
- assert.notStrictEqual(jsonLi, void 0, `No JSON version found for amendement at ${amendementHtmlUrl}`);
368
- const jsonA = jsonLi.querySelector("a");
369
- assert.notStrictEqual(jsonA, null, `No <a> found in ${jsonLi.toString()}`);
370
- const amendementJsonUrlPath = jsonA.getAttribute("href");
371
- assert.notStrictEqual(amendementJsonUrlPath, void 0, `No URL found for JSON version of amendement: ${jsonLi.toString()}`);
372
- const amendementJsonUrl = new URL(amendementJsonUrlPath, "https://www.assemblee-nationale.fr/").toString();
373
- const amendementJsonResponse = await fetch(amendementJsonUrl);
374
- assert(amendementJsonResponse.ok, `Retrieval of amendement JSON page at ${amendementJsonUrl} failed with error: ${amendementJsonResponse.status} ${amendementJsonResponse.statusText}`);
375
- const amendement = await amendementJsonResponse.json();
376
- yield [amendementUrlPath, amendement];
377
- await fs.writeFile(amendementSearchCacheFilePath, amendementSearchCache, "utf8");
353
+ e.notStrictEqual(
354
+ I,
355
+ void 0,
356
+ `No JSON version found for amendement at ${_}`
357
+ );
358
+ const C = I.querySelector("a");
359
+ e.notStrictEqual(
360
+ C,
361
+ null,
362
+ `No <a> found in ${I.toString()}`
363
+ );
364
+ const H = C.getAttribute("href");
365
+ e.notStrictEqual(
366
+ H,
367
+ void 0,
368
+ `No URL found for JSON version of amendement: ${I.toString()}`
369
+ );
370
+ const D = new URL(
371
+ H,
372
+ "https://www.assemblee-nationale.fr/"
373
+ ).toString(), M = await fetch(D);
374
+ e(
375
+ M.ok,
376
+ `Retrieval of amendement JSON page at ${D} failed with error: ${M.status} ${M.statusText}`
377
+ );
378
+ const B = await M.json();
379
+ yield [h, B], await q.writeFile(
380
+ A,
381
+ U,
382
+ "utf8"
383
+ );
378
384
  }
379
- const paginationA = html.querySelector("div.an-pagination--item > i.an-icons-chevron-right ~ a");
380
- if (paginationA === null) {
385
+ const E = s.querySelector(
386
+ "div.an-pagination--item > i.an-icons-chevron-right ~ a"
387
+ );
388
+ if (E === null)
381
389
  break;
382
- }
383
- const urlPath = paginationA.getAttribute("href");
384
- assert.notStrictEqual(urlPath, void 0);
385
- url = new URL(urlPath, "https://www.assemblee-nationale.fr/").toString();
390
+ const x = E.getAttribute("href");
391
+ e.notStrictEqual(x, void 0), t = new URL(x, "https://www.assemblee-nationale.fr/").toString();
386
392
  }
387
393
  }
388
394
  export {
389
- iterRechercheAmendements,
390
- iterRechercheRawAmendements,
391
- parseTexte
395
+ Se as iterRechercheAmendements,
396
+ le as iterRechercheRawAmendements,
397
+ he as parseTexte
392
398
  };
393
- //# sourceMappingURL=parsers.js.map