@tricoteuses/senat 3.1.22 → 3.1.24

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 (391) hide show
  1. package/LICENSE.md +32 -32
  2. package/README.md +326 -326
  3. package/lib/src/index.d.ts +1 -0
  4. package/lib/src/other_types/collaborateurs.d.ts +5 -0
  5. package/lib/src/parsers/collaborateurs.d.ts +44 -0
  6. package/lib/src/parsers/collaborateurs.js +157 -0
  7. package/lib/src/rich_types/sens.d.ts +5 -0
  8. package/lib/src/scripts/data-download.js +1 -0
  9. package/lib/src/scripts/retrieve_collaborateurs.js +166 -0
  10. package/lib/src/scripts/retrieve_cr_seance.js +34 -25
  11. package/lib/src/scripts/retrieve_videos.js +13 -8
  12. package/lib/src/scripts/shared/incremental_import_sql.js +866 -859
  13. package/lib/src/scripts/shared/schema_version.js +84 -84
  14. package/lib/src/scripts/shared/staging_metadata_sql.js +214 -214
  15. package/lib/src/scripts/validate_prefixed_tables.js +12 -12
  16. package/lib/src/server/ameli.js +14 -13
  17. package/lib/src/server/conversion_textes.js +106 -106
  18. package/lib/src/server/debats.js +10 -10
  19. package/lib/src/server/documents.js +22 -22
  20. package/lib/src/server/dosleg.js +33 -33
  21. package/lib/src/server/questions.js +10 -10
  22. package/lib/src/server/scrutins.js +3 -3
  23. package/lib/src/server/sens.js +19 -19
  24. package/lib/src/utils/reunion_odj_building.js +0 -4
  25. package/lib/src/videos/match.js +7 -5
  26. package/lib/src/videos/pipeline.js +26 -19
  27. package/lib/tests/collaborateurs.test.js +115 -0
  28. package/lib/tests/incrementalImportSql.test.js +4 -1
  29. package/package.json +121 -119
  30. package/lib/add-js-extensions-v2.js +0 -23
  31. package/lib/add-js-extensions.js +0 -17
  32. package/lib/aggregates.d.ts +0 -52
  33. package/lib/aggregates.js +0 -930
  34. package/lib/aggregates.mjs +0 -713
  35. package/lib/aggregates.ts +0 -833
  36. package/lib/config.d.ts +0 -10
  37. package/lib/config.js +0 -16
  38. package/lib/config.mjs +0 -16
  39. package/lib/config.ts +0 -26
  40. package/lib/databases.d.ts +0 -2
  41. package/lib/databases.js +0 -26
  42. package/lib/databases.mjs +0 -57
  43. package/lib/databases.ts +0 -71
  44. package/lib/datasets.d.ts +0 -34
  45. package/lib/datasets.js +0 -233
  46. package/lib/datasets.mjs +0 -78
  47. package/lib/datasets.ts +0 -118
  48. package/lib/fields.d.ts +0 -10
  49. package/lib/fields.js +0 -68
  50. package/lib/fields.mjs +0 -22
  51. package/lib/fields.ts +0 -29
  52. package/lib/git.d.ts +0 -26
  53. package/lib/git.js +0 -167
  54. package/lib/index.d.ts +0 -13
  55. package/lib/index.js +0 -1
  56. package/lib/index.mjs +0 -7
  57. package/lib/index.ts +0 -64
  58. package/lib/inserters.d.ts +0 -98
  59. package/lib/inserters.js +0 -500
  60. package/lib/inserters.mjs +0 -360
  61. package/lib/inserters.ts +0 -521
  62. package/lib/legislatures.json +0 -38
  63. package/lib/loaders.d.ts +0 -58
  64. package/lib/loaders.js +0 -286
  65. package/lib/loaders.mjs +0 -158
  66. package/lib/loaders.ts +0 -271
  67. package/lib/model/agenda.d.ts +0 -6
  68. package/lib/model/agenda.js +0 -148
  69. package/lib/model/ameli.d.ts +0 -51
  70. package/lib/model/ameli.js +0 -149
  71. package/lib/model/ameli.mjs +0 -84
  72. package/lib/model/ameli.ts +0 -100
  73. package/lib/model/commission.d.ts +0 -18
  74. package/lib/model/commission.js +0 -269
  75. package/lib/model/debats.d.ts +0 -67
  76. package/lib/model/debats.js +0 -95
  77. package/lib/model/debats.mjs +0 -43
  78. package/lib/model/debats.ts +0 -68
  79. package/lib/model/documents.d.ts +0 -12
  80. package/lib/model/documents.js +0 -151
  81. package/lib/model/dosleg.d.ts +0 -7
  82. package/lib/model/dosleg.js +0 -326
  83. package/lib/model/dosleg.mjs +0 -196
  84. package/lib/model/dosleg.ts +0 -240
  85. package/lib/model/index.d.ts +0 -7
  86. package/lib/model/index.js +0 -7
  87. package/lib/model/index.mjs +0 -5
  88. package/lib/model/index.ts +0 -15
  89. package/lib/model/questions.d.ts +0 -45
  90. package/lib/model/questions.js +0 -89
  91. package/lib/model/questions.mjs +0 -71
  92. package/lib/model/questions.ts +0 -93
  93. package/lib/model/scrutins.d.ts +0 -13
  94. package/lib/model/scrutins.js +0 -114
  95. package/lib/model/seance.d.ts +0 -3
  96. package/lib/model/seance.js +0 -267
  97. package/lib/model/sens.d.ts +0 -146
  98. package/lib/model/sens.js +0 -454
  99. package/lib/model/sens.mjs +0 -415
  100. package/lib/model/sens.ts +0 -516
  101. package/lib/model/texte.d.ts +0 -7
  102. package/lib/model/texte.js +0 -256
  103. package/lib/model/texte.mjs +0 -208
  104. package/lib/model/texte.ts +0 -229
  105. package/lib/model/util.d.ts +0 -9
  106. package/lib/model/util.js +0 -38
  107. package/lib/model/util.mjs +0 -19
  108. package/lib/model/util.ts +0 -32
  109. package/lib/parsers/texte.d.ts +0 -7
  110. package/lib/parsers/texte.js +0 -228
  111. package/lib/raw_types/ameli.d.ts +0 -914
  112. package/lib/raw_types/ameli.js +0 -5
  113. package/lib/raw_types/ameli.mjs +0 -163
  114. package/lib/raw_types/debats.d.ts +0 -207
  115. package/lib/raw_types/debats.js +0 -5
  116. package/lib/raw_types/debats.mjs +0 -58
  117. package/lib/raw_types/dosleg.d.ts +0 -1619
  118. package/lib/raw_types/dosleg.js +0 -5
  119. package/lib/raw_types/dosleg.mjs +0 -438
  120. package/lib/raw_types/questions.d.ts +0 -419
  121. package/lib/raw_types/questions.js +0 -5
  122. package/lib/raw_types/questions.mjs +0 -11
  123. package/lib/raw_types/senat.d.ts +0 -11368
  124. package/lib/raw_types/senat.js +0 -5
  125. package/lib/raw_types/sens.d.ts +0 -8248
  126. package/lib/raw_types/sens.js +0 -5
  127. package/lib/raw_types/sens.mjs +0 -508
  128. package/lib/raw_types_kysely/ameli.d.ts +0 -915
  129. package/lib/raw_types_kysely/ameli.js +0 -7
  130. package/lib/raw_types_kysely/ameli.mjs +0 -5
  131. package/lib/raw_types_kysely/ameli.ts +0 -951
  132. package/lib/raw_types_kysely/debats.d.ts +0 -207
  133. package/lib/raw_types_kysely/debats.js +0 -7
  134. package/lib/raw_types_kysely/debats.mjs +0 -5
  135. package/lib/raw_types_kysely/debats.ts +0 -222
  136. package/lib/raw_types_kysely/dosleg.d.ts +0 -3532
  137. package/lib/raw_types_kysely/dosleg.js +0 -7
  138. package/lib/raw_types_kysely/dosleg.mjs +0 -5
  139. package/lib/raw_types_kysely/dosleg.ts +0 -3621
  140. package/lib/raw_types_kysely/questions.d.ts +0 -414
  141. package/lib/raw_types_kysely/questions.js +0 -7
  142. package/lib/raw_types_kysely/questions.mjs +0 -5
  143. package/lib/raw_types_kysely/questions.ts +0 -426
  144. package/lib/raw_types_kysely/sens.d.ts +0 -4394
  145. package/lib/raw_types_kysely/sens.js +0 -7
  146. package/lib/raw_types_kysely/sens.mjs +0 -5
  147. package/lib/raw_types_kysely/sens.ts +0 -4499
  148. package/lib/raw_types_schemats/ameli.d.ts +0 -539
  149. package/lib/raw_types_schemats/ameli.js +0 -2
  150. package/lib/raw_types_schemats/ameli.mjs +0 -2
  151. package/lib/raw_types_schemats/ameli.ts +0 -601
  152. package/lib/raw_types_schemats/debats.d.ts +0 -127
  153. package/lib/raw_types_schemats/debats.js +0 -2
  154. package/lib/raw_types_schemats/debats.mjs +0 -2
  155. package/lib/raw_types_schemats/debats.ts +0 -145
  156. package/lib/raw_types_schemats/dosleg.d.ts +0 -977
  157. package/lib/raw_types_schemats/dosleg.js +0 -2
  158. package/lib/raw_types_schemats/dosleg.mjs +0 -2
  159. package/lib/raw_types_schemats/dosleg.ts +0 -2193
  160. package/lib/raw_types_schemats/questions.d.ts +0 -235
  161. package/lib/raw_types_schemats/questions.js +0 -2
  162. package/lib/raw_types_schemats/questions.mjs +0 -2
  163. package/lib/raw_types_schemats/questions.ts +0 -249
  164. package/lib/raw_types_schemats/sens.d.ts +0 -6915
  165. package/lib/raw_types_schemats/sens.js +0 -2
  166. package/lib/raw_types_schemats/sens.mjs +0 -2
  167. package/lib/raw_types_schemats/sens.ts +0 -2907
  168. package/lib/scripts/convert_data.js +0 -354
  169. package/lib/scripts/convert_data.mjs +0 -181
  170. package/lib/scripts/convert_data.ts +0 -243
  171. package/lib/scripts/data-download.d.ts +0 -1
  172. package/lib/scripts/data-download.js +0 -12
  173. package/lib/scripts/datautil.d.ts +0 -8
  174. package/lib/scripts/datautil.js +0 -34
  175. package/lib/scripts/datautil.mjs +0 -16
  176. package/lib/scripts/datautil.ts +0 -19
  177. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  178. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  179. package/lib/scripts/parse_textes.d.ts +0 -1
  180. package/lib/scripts/parse_textes.js +0 -44
  181. package/lib/scripts/parse_textes.mjs +0 -46
  182. package/lib/scripts/parse_textes.ts +0 -65
  183. package/lib/scripts/retrieve_agenda.d.ts +0 -1
  184. package/lib/scripts/retrieve_agenda.js +0 -132
  185. package/lib/scripts/retrieve_cr_commission.d.ts +0 -1
  186. package/lib/scripts/retrieve_cr_commission.js +0 -364
  187. package/lib/scripts/retrieve_cr_seance.d.ts +0 -6
  188. package/lib/scripts/retrieve_cr_seance.js +0 -347
  189. package/lib/scripts/retrieve_documents.d.ts +0 -3
  190. package/lib/scripts/retrieve_documents.js +0 -219
  191. package/lib/scripts/retrieve_documents.mjs +0 -249
  192. package/lib/scripts/retrieve_documents.ts +0 -298
  193. package/lib/scripts/retrieve_open_data.d.ts +0 -1
  194. package/lib/scripts/retrieve_open_data.js +0 -315
  195. package/lib/scripts/retrieve_open_data.mjs +0 -217
  196. package/lib/scripts/retrieve_open_data.ts +0 -268
  197. package/lib/scripts/retrieve_senateurs_photos.d.ts +0 -1
  198. package/lib/scripts/retrieve_senateurs_photos.js +0 -147
  199. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -147
  200. package/lib/scripts/retrieve_senateurs_photos.ts +0 -177
  201. package/lib/scripts/retrieve_videos.d.ts +0 -1
  202. package/lib/scripts/retrieve_videos.js +0 -461
  203. package/lib/scripts/shared/cli_helpers.d.ts +0 -95
  204. package/lib/scripts/shared/cli_helpers.js +0 -91
  205. package/lib/scripts/shared/cli_helpers.ts +0 -36
  206. package/lib/scripts/shared/util.d.ts +0 -4
  207. package/lib/scripts/shared/util.js +0 -35
  208. package/lib/scripts/shared/util.ts +0 -33
  209. package/lib/scripts/test_iter_load.d.ts +0 -1
  210. package/lib/scripts/test_iter_load.js +0 -12
  211. package/lib/src/ameli.d.ts +0 -66
  212. package/lib/src/ameli.js +0 -1
  213. package/lib/src/config.d.ts +0 -43
  214. package/lib/src/config.js +0 -37
  215. package/lib/src/conversion_textes.d.ts +0 -11
  216. package/lib/src/conversion_textes.js +0 -320
  217. package/lib/src/databases.d.ts +0 -3
  218. package/lib/src/databases.js +0 -26
  219. package/lib/src/databases_postgres.d.ts +0 -4
  220. package/lib/src/databases_postgres.js +0 -23
  221. package/lib/src/datasets.d.ts +0 -38
  222. package/lib/src/datasets.js +0 -247
  223. package/lib/src/db_types/ameli.d.ts +0 -1762
  224. package/lib/src/db_types/ameli.js +0 -1074
  225. package/lib/src/db_types/debats.d.ts +0 -380
  226. package/lib/src/db_types/debats.js +0 -266
  227. package/lib/src/db_types/dosleg.d.ts +0 -2954
  228. package/lib/src/db_types/dosleg.js +0 -2005
  229. package/lib/src/db_types/questions.d.ts +0 -699
  230. package/lib/src/db_types/questions.js +0 -493
  231. package/lib/src/db_types/sens.d.ts +0 -7843
  232. package/lib/src/db_types/sens.js +0 -4691
  233. package/lib/src/debats.d.ts +0 -38
  234. package/lib/src/debats.js +0 -1
  235. package/lib/src/dosleg.d.ts +0 -142
  236. package/lib/src/dosleg.js +0 -193
  237. package/lib/src/git.d.ts +0 -27
  238. package/lib/src/git.js +0 -251
  239. package/lib/src/loaders.d.ts +0 -52
  240. package/lib/src/loaders.js +0 -260
  241. package/lib/src/model/agenda.d.ts +0 -6
  242. package/lib/src/model/agenda.js +0 -148
  243. package/lib/src/model/ameli.d.ts +0 -67
  244. package/lib/src/model/ameli.js +0 -150
  245. package/lib/src/model/ameli_postgres.d.ts +0 -67
  246. package/lib/src/model/ameli_postgres.js +0 -150
  247. package/lib/src/model/commission.d.ts +0 -19
  248. package/lib/src/model/commission.js +0 -269
  249. package/lib/src/model/debats.d.ts +0 -39
  250. package/lib/src/model/debats.js +0 -112
  251. package/lib/src/model/documents.d.ts +0 -32
  252. package/lib/src/model/documents.js +0 -182
  253. package/lib/src/model/dosleg.d.ts +0 -144
  254. package/lib/src/model/dosleg.js +0 -468
  255. package/lib/src/model/index.d.ts +0 -7
  256. package/lib/src/model/index.js +0 -7
  257. package/lib/src/model/questions.d.ts +0 -54
  258. package/lib/src/model/questions.js +0 -91
  259. package/lib/src/model/scrutins.d.ts +0 -48
  260. package/lib/src/model/scrutins.js +0 -121
  261. package/lib/src/model/seance.d.ts +0 -3
  262. package/lib/src/model/seance.js +0 -267
  263. package/lib/src/model/sens.d.ts +0 -112
  264. package/lib/src/model/sens.js +0 -385
  265. package/lib/src/model/util.d.ts +0 -1
  266. package/lib/src/model/util.js +0 -15
  267. package/lib/src/other_types/questions.d.ts +0 -2
  268. package/lib/src/other_types/questions.js +0 -1
  269. package/lib/src/questions.d.ts +0 -53
  270. package/lib/src/questions.js +0 -1
  271. package/lib/src/raw_types/ameli.d.ts +0 -1762
  272. package/lib/src/raw_types/ameli.js +0 -1074
  273. package/lib/src/raw_types/debats.d.ts +0 -380
  274. package/lib/src/raw_types/debats.js +0 -266
  275. package/lib/src/raw_types/dosleg.d.ts +0 -2954
  276. package/lib/src/raw_types/dosleg.js +0 -2005
  277. package/lib/src/raw_types/questions.d.ts +0 -699
  278. package/lib/src/raw_types/questions.js +0 -493
  279. package/lib/src/raw_types/senat.d.ts +0 -11372
  280. package/lib/src/raw_types/senat.js +0 -5
  281. package/lib/src/raw_types/sens.d.ts +0 -7843
  282. package/lib/src/raw_types/sens.js +0 -4691
  283. package/lib/src/raw_types_schemats/ameli.d.ts +0 -541
  284. package/lib/src/raw_types_schemats/ameli.js +0 -2
  285. package/lib/src/raw_types_schemats/debats.d.ts +0 -127
  286. package/lib/src/raw_types_schemats/debats.js +0 -2
  287. package/lib/src/raw_types_schemats/dosleg.d.ts +0 -977
  288. package/lib/src/raw_types_schemats/dosleg.js +0 -2
  289. package/lib/src/raw_types_schemats/questions.d.ts +0 -237
  290. package/lib/src/raw_types_schemats/questions.js +0 -2
  291. package/lib/src/raw_types_schemats/sens.d.ts +0 -2709
  292. package/lib/src/raw_types_schemats/sens.js +0 -2
  293. package/lib/src/rich_types/agenda.d.ts +0 -45
  294. package/lib/src/rich_types/agenda.js +0 -1
  295. package/lib/src/rich_types/compte_rendu.d.ts +0 -83
  296. package/lib/src/rich_types/compte_rendu.js +0 -1
  297. package/lib/src/rich_types/sessions.d.ts +0 -6
  298. package/lib/src/rich_types/sessions.js +0 -19
  299. package/lib/src/rich_types/texte.d.ts +0 -72
  300. package/lib/src/rich_types/texte.js +0 -15
  301. package/lib/src/scripts/test_iter_load.d.ts +0 -1
  302. package/lib/src/scripts/test_iter_load.js +0 -12
  303. package/lib/src/sens.d.ts +0 -104
  304. package/lib/src/sens.js +0 -1
  305. package/lib/src/types/agenda.d.ts +0 -45
  306. package/lib/src/types/agenda.js +0 -1
  307. package/lib/src/types/ameli.d.ts +0 -1762
  308. package/lib/src/types/ameli.js +0 -1074
  309. package/lib/src/types/compte_rendu.d.ts +0 -83
  310. package/lib/src/types/compte_rendu.js +0 -1
  311. package/lib/src/types/debats.d.ts +0 -380
  312. package/lib/src/types/debats.js +0 -266
  313. package/lib/src/types/dosleg.d.ts +0 -2954
  314. package/lib/src/types/dosleg.js +0 -2005
  315. package/lib/src/types/questions.d.ts +0 -699
  316. package/lib/src/types/questions.js +0 -493
  317. package/lib/src/types/sens.d.ts +0 -7843
  318. package/lib/src/types/sens.js +0 -4691
  319. package/lib/src/types/sessions.d.ts +0 -6
  320. package/lib/src/types/sessions.js +0 -19
  321. package/lib/src/types/texte.d.ts +0 -72
  322. package/lib/src/types/texte.js +0 -15
  323. package/lib/src/validators/config.d.ts +0 -9
  324. package/lib/src/validators/config.js +0 -10
  325. package/lib/strings.d.ts +0 -1
  326. package/lib/strings.js +0 -18
  327. package/lib/strings.mjs +0 -18
  328. package/lib/strings.ts +0 -26
  329. package/lib/tsconfig.tsbuildinfo +0 -1
  330. package/lib/types/agenda.d.ts +0 -44
  331. package/lib/types/agenda.js +0 -1
  332. package/lib/types/ameli.d.ts +0 -5
  333. package/lib/types/ameli.js +0 -1
  334. package/lib/types/ameli.mjs +0 -13
  335. package/lib/types/ameli.ts +0 -21
  336. package/lib/types/compte_rendu.d.ts +0 -83
  337. package/lib/types/compte_rendu.js +0 -1
  338. package/lib/types/debats.d.ts +0 -2
  339. package/lib/types/debats.js +0 -1
  340. package/lib/types/debats.mjs +0 -2
  341. package/lib/types/debats.ts +0 -6
  342. package/lib/types/dosleg.d.ts +0 -70
  343. package/lib/types/dosleg.js +0 -1
  344. package/lib/types/dosleg.mjs +0 -151
  345. package/lib/types/dosleg.ts +0 -284
  346. package/lib/types/questions.d.ts +0 -2
  347. package/lib/types/questions.js +0 -1
  348. package/lib/types/questions.mjs +0 -1
  349. package/lib/types/questions.ts +0 -3
  350. package/lib/types/sens.d.ts +0 -10
  351. package/lib/types/sens.js +0 -1
  352. package/lib/types/sens.mjs +0 -1
  353. package/lib/types/sens.ts +0 -12
  354. package/lib/types/sessions.d.ts +0 -5
  355. package/lib/types/sessions.js +0 -84
  356. package/lib/types/sessions.mjs +0 -43
  357. package/lib/types/sessions.ts +0 -42
  358. package/lib/types/texte.d.ts +0 -74
  359. package/lib/types/texte.js +0 -16
  360. package/lib/types/texte.mjs +0 -16
  361. package/lib/types/texte.ts +0 -76
  362. package/lib/typings/windows-1252.d.js +0 -2
  363. package/lib/typings/windows-1252.d.mjs +0 -2
  364. package/lib/typings/windows-1252.d.ts +0 -11
  365. package/lib/utils/cr_spliting.d.ts +0 -28
  366. package/lib/utils/cr_spliting.js +0 -265
  367. package/lib/utils/date.d.ts +0 -10
  368. package/lib/utils/date.js +0 -100
  369. package/lib/utils/nvs-timecode.d.ts +0 -7
  370. package/lib/utils/nvs-timecode.js +0 -79
  371. package/lib/utils/reunion_grouping.d.ts +0 -9
  372. package/lib/utils/reunion_grouping.js +0 -361
  373. package/lib/utils/reunion_odj_building.d.ts +0 -5
  374. package/lib/utils/reunion_odj_building.js +0 -154
  375. package/lib/utils/reunion_parsing.d.ts +0 -23
  376. package/lib/utils/reunion_parsing.js +0 -209
  377. package/lib/utils/scoring.d.ts +0 -14
  378. package/lib/utils/scoring.js +0 -147
  379. package/lib/utils/string_cleaning.d.ts +0 -7
  380. package/lib/utils/string_cleaning.js +0 -57
  381. package/lib/validators/config.d.ts +0 -9
  382. package/lib/validators/config.js +0 -10
  383. package/lib/validators/config.mjs +0 -54
  384. package/lib/validators/config.ts +0 -79
  385. package/lib/validators/senat.d.ts +0 -0
  386. package/lib/validators/senat.js +0 -28
  387. package/lib/validators/senat.mjs +0 -24
  388. package/lib/validators/senat.ts +0 -26
  389. /package/lib/{add-js-extensions-v2.d.ts → src/other_types/collaborateurs.js} +0 -0
  390. /package/lib/{add-js-extensions.d.ts → src/scripts/retrieve_collaborateurs.d.ts} +0 -0
  391. /package/lib/{scripts/convert_data.d.ts → tests/collaborateurs.test.d.ts} +0 -0
@@ -5,6 +5,14 @@ import { fetchText } from "./search.js";
5
5
  import fs from "fs-extra";
6
6
  import fsp from "fs/promises";
7
7
  import path from "path";
8
+ function log(options, ...args) {
9
+ if (!options["silent"])
10
+ console.log(...args);
11
+ }
12
+ function warn(options, ...args) {
13
+ if (!options["silent"])
14
+ console.warn(...args);
15
+ }
8
16
  function isReunion(value) {
9
17
  return typeof value === "object" && value !== null && "uid" in value;
10
18
  }
@@ -18,18 +26,18 @@ export async function processOneReunionMatch(args) {
18
26
  finalTxt = await fsp.readFile(path.join(baseDir, "finalplayer.nvs"), "utf-8");
19
27
  }
20
28
  catch {
21
- console.warn(`[skip] Missing NVS files for reunion ${reunionUid}`);
29
+ warn(options, `[skip] Missing NVS files for reunion ${reunionUid}`);
22
30
  return;
23
31
  }
24
32
  const master = buildSenatVodMasterM3u8FromNvs(dataTxt);
25
33
  if (!master) {
26
- console.warn(`[warn] Cannot build m3u8 for reunion ${reunionUid}`);
34
+ warn(options, `[warn] Cannot build m3u8 for reunion ${reunionUid}`);
27
35
  return;
28
36
  }
29
37
  const agendaJsonPath = path.join(dataDir, AGENDA_FOLDER, DATA_TRANSFORMED_FOLDER, String(session), `${agenda.uid}.json`);
30
38
  // Ensure it exists first.
31
39
  if (!(await fs.pathExists(agendaJsonPath))) {
32
- console.warn(`[warn] agenda file not found: ${agendaJsonPath}`);
40
+ warn(options, `[warn] agenda file not found: ${agendaJsonPath}`);
33
41
  return;
34
42
  }
35
43
  let timecodeDebutVideo = null;
@@ -46,7 +54,7 @@ export async function processOneReunionMatch(args) {
46
54
  if (prev && prev.agendaJsonPath !== agendaJsonPath) {
47
55
  // micro-safety: do not close with an earlier timecode
48
56
  if (timecodeDebutVideo <= prev.start) {
49
- console.warn("[warn] timecode order inversion on same video: " +
57
+ warn(options, "[warn] timecode order inversion on same video: " +
50
58
  `prev=${prev.agendaUid}(${prev.start}s) -> ` +
51
59
  `cur=${agenda.uid}(${timecodeDebutVideo}s). ` +
52
60
  "Skip closing prev to avoid negative segment.");
@@ -55,6 +63,7 @@ export async function processOneReunionMatch(args) {
55
63
  await patchAgendaTimecodeFin({
56
64
  agendaJsonPath: prev.agendaJsonPath,
57
65
  timecodeFinVideo: timecodeDebutVideo,
66
+ options,
58
67
  writeIfChanged,
59
68
  });
60
69
  }
@@ -68,11 +77,11 @@ export async function processOneReunionMatch(args) {
68
77
  obj = JSON.parse(raw);
69
78
  }
70
79
  catch {
71
- console.warn(`[warn] invalid JSON in ${agendaJsonPath}`);
80
+ warn(options, `[warn] invalid JSON in ${agendaJsonPath}`);
72
81
  return;
73
82
  }
74
83
  if (!isReunion(obj)) {
75
- console.warn(`[warn] invalid reunion payload in ${agendaJsonPath}`);
84
+ warn(options, `[warn] invalid reunion payload in ${agendaJsonPath}`);
76
85
  return;
77
86
  }
78
87
  const next = { ...obj, urlVideo: master, startTime: agenda.startTime, urlPageVideo: best?.pageUrl };
@@ -84,10 +93,8 @@ export async function processOneReunionMatch(args) {
84
93
  delete next.timecodeFinVideo;
85
94
  }
86
95
  await writeIfChanged(agendaJsonPath, JSON.stringify(next, null, 2));
87
- if (!options["silent"]) {
88
- console.log(`[write] ${agenda.uid} urlVideo ← ${master}` +
89
- (timecodeDebutVideo != null ? ` (timecodeDebutVideo ← ${timecodeDebutVideo}s)` : ""));
90
- }
96
+ log(options, `[write] ${agenda.uid} urlVideo ← ${master}` +
97
+ (timecodeDebutVideo != null ? ` (timecodeDebutVideo ← ${timecodeDebutVideo}s)` : ""));
91
98
  }
92
99
  export async function processBisIfNeeded(args) {
93
100
  const { agenda, secondBest, ctx, skipDownload, options, lastByVideo, writeIfChanged, processOneReunionMatch, getAgendaSegmentTimecodes, buildSenatVodMasterM3u8FromNvs, } = args;
@@ -106,7 +113,7 @@ export async function processBisIfNeeded(args) {
106
113
  };
107
114
  const baseDirBis = path.join(path.dirname(ctx.baseDir), bisUid);
108
115
  await fs.ensureDir(baseDirBis);
109
- await ensureBisAgendaJson({ agenda, agendaBis, dataDir: ctx.dataDir, session: ctx.session });
116
+ await ensureBisAgendaJson({ agenda, agendaBis, dataDir: ctx.dataDir, session: ctx.session, options });
110
117
  await downloadNvsForMatch(secondBest, baseDirBis);
111
118
  await processOneReunionMatch({
112
119
  agenda: agendaBis,
@@ -122,26 +129,26 @@ export async function processBisIfNeeded(args) {
122
129
  });
123
130
  }
124
131
  async function ensureBisAgendaJson(args) {
125
- const { agenda, agendaBis, dataDir, session } = args;
132
+ const { agenda, agendaBis, dataDir, session, options } = args;
126
133
  const agendaJsonPath = path.join(dataDir, AGENDA_FOLDER, DATA_TRANSFORMED_FOLDER, String(session), `${agenda.uid}.json`);
127
134
  const agendaBisJsonPath = path.join(dataDir, AGENDA_FOLDER, DATA_TRANSFORMED_FOLDER, String(session), `${agendaBis.uid}.json`);
128
135
  if (!(await fs.pathExists(agendaJsonPath))) {
129
- console.warn(`[bis] original agenda json not found to clone: ${agendaJsonPath}`);
136
+ warn(options, `[bis] original agenda json not found to clone: ${agendaJsonPath}`);
130
137
  return;
131
138
  }
132
139
  try {
133
140
  const raw = await fsp.readFile(agendaJsonPath, "utf-8");
134
141
  const obj = JSON.parse(raw);
135
142
  if (!obj || typeof obj !== "object" || Array.isArray(obj)) {
136
- console.warn(`[bis] cannot clone agenda json: expected object in ${agendaJsonPath}, ` +
143
+ warn(options, `[bis] cannot clone agenda json: expected object in ${agendaJsonPath}, ` +
137
144
  `got ${Array.isArray(obj) ? "array" : typeof obj}`);
138
145
  return;
139
146
  }
140
147
  await writeIfChanged(agendaBisJsonPath, JSON.stringify(agendaBis, null, 2));
141
- console.log(`[bis] created agenda json ${agendaBis.uid}.json from ${agenda.uid}.json`);
148
+ log(options, `[bis] created agenda json ${agendaBis.uid}.json from ${agenda.uid}.json`);
142
149
  }
143
150
  catch (e) {
144
- console.warn(`[bis] cannot clone agenda json ${agenda.uid}.json -> ${agendaBis.uid}.json:`, e?.message);
151
+ warn(options, `[bis] cannot clone agenda json ${agenda.uid}.json -> ${agendaBis.uid}.json:`, e?.message);
145
152
  }
146
153
  }
147
154
  async function downloadNvsForMatch(best, baseDir) {
@@ -164,7 +171,7 @@ export async function writeIfChanged(p, content) {
164
171
  await fsp.writeFile(p, content, "utf-8");
165
172
  }
166
173
  async function patchAgendaTimecodeFin(args) {
167
- const { agendaJsonPath, timecodeFinVideo, writeIfChanged } = args;
174
+ const { agendaJsonPath, timecodeFinVideo, options, writeIfChanged } = args;
168
175
  if (!(await fs.pathExists(agendaJsonPath)))
169
176
  return;
170
177
  const raw = await fsp.readFile(agendaJsonPath, "utf-8");
@@ -173,11 +180,11 @@ async function patchAgendaTimecodeFin(args) {
173
180
  obj = JSON.parse(raw);
174
181
  }
175
182
  catch {
176
- console.warn(`[warn] invalid JSON in ${agendaJsonPath}`);
183
+ warn(options, `[warn] invalid JSON in ${agendaJsonPath}`);
177
184
  return;
178
185
  }
179
186
  if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
180
- console.warn(`[warn] invalid reunion payload in ${agendaJsonPath}`);
187
+ warn(options, `[warn] invalid reunion payload in ${agendaJsonPath}`);
181
188
  return;
182
189
  }
183
190
  const next = { ...obj, timecodeFinVideo };
@@ -0,0 +1,115 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildCollaboratorRows, extractEditionDate, normalizeForComparison, parsePersonCell, } from "../src/parsers/collaborateurs.js";
3
+ // X bands measured on the real PDF: employer ≈ 147, collaborator ≈ 285.
4
+ const X_EMPLOYER = 147;
5
+ const X_COLLABORATOR = 285;
6
+ /** Builds a synthetic page: for each row, [employer?, collaborator]. */
7
+ function pageItems(rows, page = 1) {
8
+ const items = [];
9
+ let y = 700;
10
+ for (const [employer, collaborator] of rows) {
11
+ if (employer)
12
+ items.push({ str: employer, x: X_EMPLOYER, y, page });
13
+ items.push({ str: collaborator, x: X_COLLABORATOR, y, page });
14
+ y -= 15;
15
+ }
16
+ return items;
17
+ }
18
+ describe("parsePersonCell", () => {
19
+ it("splits civility, last name and first name", () => {
20
+ expect(parsePersonCell("M. CHAREF Dahmane")).toEqual({ civilite: "M.", nom: "CHAREF", prenom: "Dahmane" });
21
+ expect(parsePersonCell("Mme OLIVIER Béatrice")).toEqual({
22
+ civilite: "Mme",
23
+ nom: "OLIVIER",
24
+ prenom: "Béatrice",
25
+ });
26
+ });
27
+ it("handles compound names (multiple uppercase tokens)", () => {
28
+ expect(parsePersonCell("Mme MAZENOT CHAPPUY Sophie")).toEqual({
29
+ civilite: "Mme",
30
+ nom: "MAZENOT CHAPPUY",
31
+ prenom: "Sophie",
32
+ });
33
+ expect(parsePersonCell("M. DI FOLCO Camille")).toEqual({ civilite: "M.", nom: "DI FOLCO", prenom: "Camille" });
34
+ });
35
+ it("handles nobiliary particles at the start of the name (de, de la)", () => {
36
+ expect(parsePersonCell("Mme de CIDRAC Marta")).toEqual({ civilite: "Mme", nom: "de CIDRAC", prenom: "Marta" });
37
+ expect(parsePersonCell("Mme de LA GONTRIE Marie-Pierre")).toEqual({
38
+ civilite: "Mme",
39
+ nom: "de LA GONTRIE",
40
+ prenom: "Marie-Pierre",
41
+ });
42
+ expect(parsePersonCell("M. de LEGGE Dominique")).toEqual({
43
+ civilite: "M.",
44
+ nom: "de LEGGE",
45
+ prenom: "Dominique",
46
+ });
47
+ expect(parsePersonCell("Mme APOURCEAU-POLY Cathy")).toEqual({
48
+ civilite: "Mme",
49
+ nom: "APOURCEAU-POLY",
50
+ prenom: "Cathy",
51
+ });
52
+ });
53
+ it("keeps a truncated first name as-is", () => {
54
+ expect(parsePersonCell("Mme AESCHLIMANN Marie-Do")).toEqual({
55
+ civilite: "Mme",
56
+ nom: "AESCHLIMANN",
57
+ prenom: "Marie-Do",
58
+ });
59
+ });
60
+ it("ignores the (*) unpaid leave marker", () => {
61
+ expect(parsePersonCell("M. DURAND (*) Paul")).toEqual({ civilite: "M.", nom: "DURAND", prenom: "Paul" });
62
+ });
63
+ it("returns null for an empty cell or civility-only", () => {
64
+ expect(parsePersonCell("")).toBeNull();
65
+ expect(parsePersonCell("M.")).toBeNull();
66
+ });
67
+ });
68
+ describe("buildCollaboratorRows", () => {
69
+ it("attaches multiple collaborators to the current senator (carry-forward when employer is empty)", () => {
70
+ const items = pageItems([
71
+ ["Mme AESCHLIMANN Marie-Do", "M. CHAREF Dahmane"],
72
+ [null, "M. POURQUERY Alexandre"],
73
+ [null, "M. SEBRIER Valentin"],
74
+ ["M. ALLIZARD Pascal", "Mme OLIVIER Béatrice"],
75
+ ]);
76
+ const rows = buildCollaboratorRows(items);
77
+ expect(rows).toHaveLength(4);
78
+ expect(rows.slice(0, 3).every((r) => r.senateur.nom === "AESCHLIMANN")).toBe(true);
79
+ expect(rows[3].senateur.nom === "ALLIZARD" && rows[3].collaborateur.nom === "OLIVIER").toBe(true);
80
+ });
81
+ it("ignores headers, footers and page numbers, and handles multiple pages", () => {
82
+ const items = [
83
+ { str: "Liste des collaborateurs par Sénateur", x: 208, y: 760, page: 1 },
84
+ { str: "Employeur", x: 193, y: 740, page: 1 },
85
+ { str: "Nom Collaborateur", x: 342, y: 740, page: 1 },
86
+ ...pageItems([["M. BACCI Jean", "Mme BOILLOT Julie"]], 1),
87
+ { str: "Edition du 24/06/2026", x: 40, y: 30, page: 1 },
88
+ { str: "- 1 -", x: 296, y: 30, page: 1 },
89
+ ...pageItems([["Mme BÉLIM Audrey", "M. BOUCHER Thibault"]], 2),
90
+ ];
91
+ const rows = buildCollaboratorRows(items);
92
+ expect(rows).toHaveLength(2);
93
+ expect(rows[0].senateur.nom).toBe("BACCI");
94
+ expect(rows[1].senateur.nom).toBe("BÉLIM");
95
+ });
96
+ it("emits nothing until an employer has been encountered", () => {
97
+ const orphan = [{ str: "M. ORPHELIN Jean", x: X_COLLABORATOR, y: 700, page: 1 }];
98
+ expect(buildCollaboratorRows(orphan)).toHaveLength(0);
99
+ });
100
+ });
101
+ describe("extractEditionDate", () => {
102
+ it("extracts the edition date from the footer", () => {
103
+ const date = extractEditionDate(["…", "Edition du 24/06/2026", "(*) Congé non rémunéré"]);
104
+ expect(date?.toISOString().slice(0, 10)).toBe("2026-06-24");
105
+ });
106
+ it("returns null if absent", () => {
107
+ expect(extractEditionDate(["nothing here"])).toBeNull();
108
+ });
109
+ });
110
+ describe("normalizeForComparison", () => {
111
+ it("uppercases, removes accents and compacts spaces", () => {
112
+ expect(normalizeForComparison(" Béatrice ")).toBe("BEATRICE");
113
+ expect(normalizeForComparison("Bélim")).toBe("BELIM");
114
+ });
115
+ });
@@ -33,6 +33,7 @@ describe("incremental import SQL", () => {
33
33
  expect(sql).toContain("t.%1$I IS NOT DISTINCT FROM s.%1$I");
34
34
  expect(sql).toContain("jsonb_build_array(");
35
35
  expect(sql).toContain("Sync strategy for %.%: %");
36
+ expect(sql).toContain("ALTER TABLE senat.%I REPLICA IDENTITY FULL");
36
37
  expect(sql).toContain("Rejected sync key for %.% from % because only %/% columns are present in both staging and target: %");
37
38
  expect(sql).toContain("WHERE table_namespace.nspname IN ('dosleg_staging', 'senat')");
38
39
  expect(sql).toContain("CASE WHEN table_namespace.nspname = 'dosleg_staging' THEN 0 ELSE 1 END AS schema_priority");
@@ -42,7 +43,9 @@ describe("incremental import SQL", () => {
42
43
  expect(sql).toContain("LEFT JOIN target_counts reference_row USING (row_signature)");
43
44
  expect(sql).toContain("DELETE FROM senat.%1$I t WHERE NOT EXISTS (SELECT 1 FROM %2$I.%1$I s WHERE %3$s)");
44
45
  expect(sql).toContain("UPDATE senat.%1$I t SET %2$s FROM %3$I.%1$I s WHERE %4$s AND (%5$s)");
45
- expect(sql).toContain("INSERT INTO senat.%1$I (%2$s) SELECT %3$s FROM %4$I.%1$I s WHERE NOT EXISTS (SELECT 1 FROM senat.%1$I t WHERE %5$s)");
46
+ expect(sql).toContain("INSERT INTO senat.%1$I (%2$s) '");
47
+ expect(sql).toContain("SELECT %3$s FROM %4$I.%1$I s '");
48
+ expect(sql).toContain("(SELECT 1 FROM senat.%1$I t WHERE %5$s)");
46
49
  expect(sql).toContain("ALTER TABLE senat.%I ADD CONSTRAINT %I %s");
47
50
  expect(sql).toContain("DROP SEQUENCE IF EXISTS senat.%I CASCADE");
48
51
  expect(sql).not.toContain("DROP SCHEMA IF EXISTS dosleg_staging CASCADE;");
package/package.json CHANGED
@@ -1,119 +1,121 @@
1
- {
2
- "name": "@tricoteuses/senat",
3
- "version": "3.1.22",
4
- "description": "Handle French Sénat's open data",
5
- "keywords": [
6
- "France",
7
- "open data",
8
- "Parliament",
9
- "Sénat"
10
- ],
11
- "author": "Emmanuel Raviart <emmanuel@raviart.com>",
12
- "contributors": [
13
- "Henry Boisgibault <henry.boisgibault@proton.me>",
14
- "Pierre Drege <dregop@proton.me>",
15
- "Hélène Jonin <helene.jonin@gmail.com>",
16
- "Paul-Henry Ngounou <ngpaulhenry@gmail.com>"
17
- ],
18
- "bugs": {
19
- "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat/issues"
20
- },
21
- "homepage": "https://tricoteuses.fr/",
22
- "license": "AGPL-3.0-or-later",
23
- "repository": {
24
- "type": "git",
25
- "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat.git"
26
- },
27
- "type": "module",
28
- "engines": {
29
- "node": ">=22"
30
- },
31
- "files": [
32
- "lib"
33
- ],
34
- "exports": {
35
- ".": {
36
- "import": "./lib/src/index.js",
37
- "types": "./lib/src/index.d.ts"
38
- },
39
- "./kysely": {
40
- "import": "./lib/src/kysely/index.js",
41
- "types": "./lib/src/kysely/index.d.ts"
42
- },
43
- "./server": {
44
- "import": "./lib/src/server/index.js",
45
- "types": "./lib/src/server/index.d.ts"
46
- },
47
- "./package.json": "./package.json"
48
- },
49
- "publishConfig": {
50
- "access": "public"
51
- },
52
- "scripts": {
53
- "build": "tsc",
54
- "build:types": "tsc --emitDeclarationOnly",
55
- "data:convert_data": "tsx src/scripts/convert_data.ts",
56
- "data:download": "tsx src/scripts/data-download.ts",
57
- "data:generate_schemas": "tsx src/scripts/retrieve_open_data.ts --schema",
58
- "data:retrieve_agenda": "cross-env TZ='Etc/UTC' tsx src/scripts/retrieve_agenda.ts",
59
- "data:retrieve_cr_seance": "tsx src/scripts/retrieve_cr_seance.ts",
60
- "data:retrieve_cr_commission": "tsx src/scripts/retrieve_cr_commission.ts",
61
- "data:retrieve_documents": "tsx src/scripts/retrieve_documents.ts",
62
- "data:retrieve_open_data": "tsx src/scripts/retrieve_open_data.ts --all",
63
- "data:retrieve_senateurs_photos": "tsx src/scripts/retrieve_senateurs_photos.ts --fetch",
64
- "data:retrieve_videos": "tsx src/scripts/retrieve_videos.ts",
65
- "data:validate_prefixed_tables": "tsx src/scripts/validate_prefixed_tables.ts",
66
- "lint": "eslint src",
67
- "lint:fix": "eslint src --fix",
68
- "prepare": "npm run build",
69
- "prepublishOnly": "npm run build",
70
- "prettier": "prettier --write 'src/**/*.ts'",
71
- "test:iter_load": "vitest tests/test_iter_load.test.ts",
72
- "type-check": "tsc --noEmit",
73
- "type-check:watch": "npm run type-check -- --watch",
74
- "test:video-matching": "vitest tests/videoMatching.test.ts",
75
- "test:prefixed-tables": "vitest tests/prefixedTables.test.ts tests/validatePrefixedTables.test.ts"
76
- },
77
- "dependencies": {
78
- "cheerio": "^1.2.0",
79
- "command-line-args": "^6.0.2",
80
- "domhandler": "^6.0.1",
81
- "dotenv": "^17.4.2",
82
- "fast-xml-parser": "^5.9.3",
83
- "fs-extra": "^11.3.6",
84
- "jsdom": "^29.1.1",
85
- "luxon": "^3.7.2",
86
- "node-stream-zip": "^1.15.0",
87
- "p-limit": "^7.3.0",
88
- "pg": "^8.22.0",
89
- "pg-cursor": "^2.21.0",
90
- "slug": "^11.0.1",
91
- "windows-1252": "^3.0.4",
92
- "zod": "^4.4.3"
93
- },
94
- "devDependencies": {
95
- "@eslint/js": "^10.0.1",
96
- "@types/command-line-args": "^5.2.3",
97
- "@types/fs-extra": "^11.0.4",
98
- "@types/jsdom": "^28.0.3",
99
- "@types/luxon": "^3.7.2",
100
- "@types/node": "^26.1.1",
101
- "@types/pg": "^8.20.0",
102
- "@types/pg-cursor": "^2.7.2",
103
- "@types/slug": "^5.0.9",
104
- "@typescript-eslint/eslint-plugin": "^8.63.0",
105
- "@typescript-eslint/parser": "^8.63.0",
106
- "cross-env": "^10.1.0",
107
- "eslint": "^10.6.0",
108
- "extract-pg-schema": "^5.8.2",
109
- "globals": "^17.7.0",
110
- "kanel": "^4.0.2",
111
- "kanel-kysely": "^4.0.0",
112
- "kanel-zod": "^4.0.0",
113
- "kysely": "^0.29.3",
114
- "prettier": "^3.9.4",
115
- "tsx": "^4.23.0",
116
- "typescript": "^6.0.3",
117
- "vitest": "^4.1.10"
118
- }
119
- }
1
+ {
2
+ "name": "@tricoteuses/senat",
3
+ "version": "3.1.24",
4
+ "description": "Handle French Sénat's open data",
5
+ "keywords": [
6
+ "France",
7
+ "open data",
8
+ "Parliament",
9
+ "Sénat"
10
+ ],
11
+ "author": "Emmanuel Raviart <emmanuel@raviart.com>",
12
+ "contributors": [
13
+ "Henry Boisgibault <henry.boisgibault@proton.me>",
14
+ "Pierre Drege <dregop@proton.me>",
15
+ "Hélène Jonin <helene.jonin@gmail.com>",
16
+ "Paul-Henry Ngounou <ngpaulhenry@gmail.com>"
17
+ ],
18
+ "bugs": {
19
+ "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat/issues"
20
+ },
21
+ "homepage": "https://tricoteuses.fr/",
22
+ "license": "AGPL-3.0-or-later",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://git.tricoteuses.fr/logiciels/tricoteuses-senat.git"
26
+ },
27
+ "type": "module",
28
+ "engines": {
29
+ "node": ">=22"
30
+ },
31
+ "files": [
32
+ "lib"
33
+ ],
34
+ "exports": {
35
+ ".": {
36
+ "import": "./lib/src/index.js",
37
+ "types": "./lib/src/index.d.ts"
38
+ },
39
+ "./kysely": {
40
+ "import": "./lib/src/kysely/index.js",
41
+ "types": "./lib/src/kysely/index.d.ts"
42
+ },
43
+ "./server": {
44
+ "import": "./lib/src/server/index.js",
45
+ "types": "./lib/src/server/index.d.ts"
46
+ },
47
+ "./package.json": "./package.json"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc",
54
+ "build:types": "tsc --emitDeclarationOnly",
55
+ "data:convert_data": "tsx src/scripts/convert_data.ts",
56
+ "data:download": "tsx src/scripts/data-download.ts",
57
+ "data:generate_schemas": "tsx src/scripts/retrieve_open_data.ts --schema",
58
+ "data:retrieve_agenda": "cross-env TZ='Etc/UTC' tsx src/scripts/retrieve_agenda.ts",
59
+ "data:retrieve_cr_seance": "tsx src/scripts/retrieve_cr_seance.ts",
60
+ "data:retrieve_cr_commission": "tsx src/scripts/retrieve_cr_commission.ts",
61
+ "data:retrieve_documents": "tsx src/scripts/retrieve_documents.ts",
62
+ "data:retrieve_open_data": "tsx src/scripts/retrieve_open_data.ts --all",
63
+ "data:retrieve_collaborateurs": "tsx src/scripts/retrieve_collaborateurs.ts",
64
+ "data:retrieve_senateurs_photos": "tsx src/scripts/retrieve_senateurs_photos.ts --fetch",
65
+ "data:retrieve_videos": "tsx src/scripts/retrieve_videos.ts",
66
+ "data:validate_prefixed_tables": "tsx src/scripts/validate_prefixed_tables.ts",
67
+ "lint": "eslint src",
68
+ "lint:fix": "eslint src --fix",
69
+ "prepare": "npm run build",
70
+ "prepublishOnly": "npm run build",
71
+ "prettier": "prettier --write 'src/**/*.ts'",
72
+ "test:iter_load": "vitest tests/test_iter_load.test.ts",
73
+ "type-check": "tsc --noEmit",
74
+ "type-check:watch": "npm run type-check -- --watch",
75
+ "test:video-matching": "vitest tests/videoMatching.test.ts",
76
+ "test:prefixed-tables": "vitest tests/prefixedTables.test.ts tests/validatePrefixedTables.test.ts"
77
+ },
78
+ "dependencies": {
79
+ "cheerio": "^1.2.0",
80
+ "command-line-args": "^6.0.2",
81
+ "domhandler": "^6.0.1",
82
+ "dotenv": "^17.4.2",
83
+ "fast-xml-parser": "^5.9.3",
84
+ "fs-extra": "^11.3.6",
85
+ "jsdom": "^29.1.1",
86
+ "luxon": "^3.7.2",
87
+ "node-stream-zip": "^1.15.0",
88
+ "p-limit": "^7.3.0",
89
+ "pg": "^8.22.0",
90
+ "pg-cursor": "^2.21.0",
91
+ "slug": "^11.0.1",
92
+ "unpdf": "^1.8.0",
93
+ "windows-1252": "^3.0.4",
94
+ "zod": "^4.4.3"
95
+ },
96
+ "devDependencies": {
97
+ "@eslint/js": "^10.0.1",
98
+ "@types/command-line-args": "^5.2.3",
99
+ "@types/fs-extra": "^11.0.4",
100
+ "@types/jsdom": "^28.0.3",
101
+ "@types/luxon": "^3.7.2",
102
+ "@types/node": "^26.1.1",
103
+ "@types/pg": "^8.20.0",
104
+ "@types/pg-cursor": "^2.7.2",
105
+ "@types/slug": "^5.0.9",
106
+ "@typescript-eslint/eslint-plugin": "^8.63.0",
107
+ "@typescript-eslint/parser": "^8.63.0",
108
+ "cross-env": "^10.1.0",
109
+ "eslint": "^10.6.0",
110
+ "extract-pg-schema": "^5.8.2",
111
+ "globals": "^17.7.0",
112
+ "kanel": "^4.0.2",
113
+ "kanel-kysely": "^4.0.0",
114
+ "kanel-zod": "^4.0.0",
115
+ "kysely": "^0.29.3",
116
+ "prettier": "^3.9.4",
117
+ "tsx": "^4.23.0",
118
+ "typescript": "^6.0.3",
119
+ "vitest": "^4.1.10"
120
+ }
121
+ }
@@ -1,23 +0,0 @@
1
- import { glob } from "glob";
2
- import fs from "fs";
3
- import path from "path";
4
- async function main() {
5
- const files = await glob(["src/**/*.ts", "tests/**/*.ts"]);
6
- for (const file of files) {
7
- let content = fs.readFileSync(file, "utf8");
8
- content = content.replace(/(from|import)\s+(["'])(\.\.?\/[^"']+)\2/g, (match, p1, p2, p3) => {
9
- if (p3.endsWith(".js"))
10
- return match;
11
- const dir = path.dirname(file);
12
- const targetPath = path.resolve(dir, p3);
13
- if (fs.existsSync(targetPath) && fs.lstatSync(targetPath).isDirectory()) {
14
- return `${p1} ${p2}${p3}/index.js${p2}`;
15
- }
16
- else {
17
- return `${p1} ${p2}${p3}.js${p2}`;
18
- }
19
- });
20
- fs.writeFileSync(file, content);
21
- }
22
- }
23
- main();
@@ -1,17 +0,0 @@
1
- import { glob } from "glob";
2
- import fs from "fs";
3
- async function main() {
4
- const files = await glob("src/**/*.ts");
5
- for (const file of files) {
6
- let content = fs.readFileSync(file, "utf8");
7
- // Matches: from "./foo" or import "./foo"
8
- // Regex: (from|import) + (quote) + (relative_path) + (same_quote)
9
- content = content.replace(/(from|import)\s+(["'])(\.\.?\/[^"']+)\2/g, (match, p1, p2, p3) => {
10
- if (p3.endsWith(".js"))
11
- return match;
12
- return `${p1} ${p2}${p3}.js${p2}`;
13
- });
14
- fs.writeFileSync(file, content);
15
- }
16
- }
17
- main();
@@ -1,52 +0,0 @@
1
- import { Ses, Sub, TxtAmeli } from "./types/ameli";
2
- import { Debat } from "./types/debats";
3
- import { Ass, Aud, Auteur, DateSeance, DecCoc, DenRap, DocAtt, Ecr, EtaLoi, LecAss, LecAssRap, Lecture, Loi, Org, OriTxt, Qua, Rap, Scr, Texte, TypAtt, TypLec, TypLoi, TypTxt, TypUrl } from "./types/dosleg";
4
- import { Question } from "./types/questions";
5
- export declare const allFollows: string[];
6
- export declare class Aggregator {
7
- follow: Set<string>;
8
- objectByIdByTableName: {
9
- [name: string]: {
10
- [id: string]: object;
11
- };
12
- };
13
- requestedIdsByTableName: {
14
- [name: string]: Set<string>;
15
- };
16
- visitedIdsByTableName: {
17
- [name: string]: Set<string>;
18
- };
19
- constructor(follow: Set<string>);
20
- addAss(ass: Ass): void;
21
- addAud(aud: Aud): void;
22
- addAuteur(auteur: Auteur): void;
23
- addDateSeance(dateSeance: DateSeance): void;
24
- addDebat(debat: Debat): void;
25
- addDeccoc(deccoc: DecCoc): void;
26
- addDenrap(denrap: DenRap): void;
27
- addDocatt(docatt: DocAtt): void;
28
- addEcr(ecr: Ecr): void;
29
- addEtaloi(etaloi: EtaLoi): void;
30
- addLecass(lecass: LecAss): void;
31
- addLecassrap(lecassrap: LecAssRap): void;
32
- addLecture(lecture: Lecture): void;
33
- addLoi(loi: Loi): void;
34
- addOrg(org: Org): void;
35
- addOritxt(oritxt: OriTxt): void;
36
- addQua(qua: Qua): void;
37
- addQuestion(question: Question): void;
38
- addRap(rap: Rap): void;
39
- addScr(scr: Scr): void;
40
- addSes(ses: Ses): void;
41
- addSub(sub: Sub): void;
42
- addTexte(texte: Texte): void;
43
- addTxtAmeli(txtAmeli: TxtAmeli): void;
44
- addTypatt(typatt: TypAtt): void;
45
- addTyplec(typlec: TypLec): void;
46
- addTyploi(typloi: TypLoi): void;
47
- addTyptxt(typtxt: TypTxt): void;
48
- addTypurl(typurl: TypUrl): void;
49
- getAll(): Promise<void>;
50
- request(tableName: string, id: string): void;
51
- toJson(): any;
52
- }