@tricoteuses/senat 3.1.22 → 3.1.23

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 (388) hide show
  1. package/LICENSE.md +32 -32
  2. package/README.md +326 -326
  3. package/lib/src/other_types/collaborateurs.d.ts +5 -0
  4. package/lib/src/parsers/collaborateurs.d.ts +44 -0
  5. package/lib/src/parsers/collaborateurs.js +157 -0
  6. package/lib/src/scripts/retrieve_collaborateurs.js +166 -0
  7. package/lib/src/scripts/retrieve_cr_seance.js +34 -25
  8. package/lib/src/scripts/retrieve_videos.js +13 -8
  9. package/lib/src/scripts/shared/incremental_import_sql.js +866 -859
  10. package/lib/src/scripts/shared/schema_version.js +84 -84
  11. package/lib/src/scripts/shared/staging_metadata_sql.js +214 -214
  12. package/lib/src/scripts/validate_prefixed_tables.js +12 -12
  13. package/lib/src/server/ameli.js +14 -13
  14. package/lib/src/server/conversion_textes.js +106 -106
  15. package/lib/src/server/debats.js +10 -10
  16. package/lib/src/server/documents.js +22 -22
  17. package/lib/src/server/dosleg.js +33 -33
  18. package/lib/src/server/questions.js +10 -10
  19. package/lib/src/server/scrutins.js +3 -3
  20. package/lib/src/server/sens.js +19 -19
  21. package/lib/src/utils/reunion_odj_building.js +0 -4
  22. package/lib/src/videos/match.js +7 -5
  23. package/lib/src/videos/pipeline.js +26 -19
  24. package/lib/tests/collaborateurs.test.js +115 -0
  25. package/lib/tests/incrementalImportSql.test.js +4 -1
  26. package/package.json +119 -119
  27. package/lib/add-js-extensions-v2.js +0 -23
  28. package/lib/add-js-extensions.js +0 -17
  29. package/lib/aggregates.d.ts +0 -52
  30. package/lib/aggregates.js +0 -930
  31. package/lib/aggregates.mjs +0 -713
  32. package/lib/aggregates.ts +0 -833
  33. package/lib/config.d.ts +0 -10
  34. package/lib/config.js +0 -16
  35. package/lib/config.mjs +0 -16
  36. package/lib/config.ts +0 -26
  37. package/lib/databases.d.ts +0 -2
  38. package/lib/databases.js +0 -26
  39. package/lib/databases.mjs +0 -57
  40. package/lib/databases.ts +0 -71
  41. package/lib/datasets.d.ts +0 -34
  42. package/lib/datasets.js +0 -233
  43. package/lib/datasets.mjs +0 -78
  44. package/lib/datasets.ts +0 -118
  45. package/lib/fields.d.ts +0 -10
  46. package/lib/fields.js +0 -68
  47. package/lib/fields.mjs +0 -22
  48. package/lib/fields.ts +0 -29
  49. package/lib/git.d.ts +0 -26
  50. package/lib/git.js +0 -167
  51. package/lib/index.d.ts +0 -13
  52. package/lib/index.js +0 -1
  53. package/lib/index.mjs +0 -7
  54. package/lib/index.ts +0 -64
  55. package/lib/inserters.d.ts +0 -98
  56. package/lib/inserters.js +0 -500
  57. package/lib/inserters.mjs +0 -360
  58. package/lib/inserters.ts +0 -521
  59. package/lib/legislatures.json +0 -38
  60. package/lib/loaders.d.ts +0 -58
  61. package/lib/loaders.js +0 -286
  62. package/lib/loaders.mjs +0 -158
  63. package/lib/loaders.ts +0 -271
  64. package/lib/model/agenda.d.ts +0 -6
  65. package/lib/model/agenda.js +0 -148
  66. package/lib/model/ameli.d.ts +0 -51
  67. package/lib/model/ameli.js +0 -149
  68. package/lib/model/ameli.mjs +0 -84
  69. package/lib/model/ameli.ts +0 -100
  70. package/lib/model/commission.d.ts +0 -18
  71. package/lib/model/commission.js +0 -269
  72. package/lib/model/debats.d.ts +0 -67
  73. package/lib/model/debats.js +0 -95
  74. package/lib/model/debats.mjs +0 -43
  75. package/lib/model/debats.ts +0 -68
  76. package/lib/model/documents.d.ts +0 -12
  77. package/lib/model/documents.js +0 -151
  78. package/lib/model/dosleg.d.ts +0 -7
  79. package/lib/model/dosleg.js +0 -326
  80. package/lib/model/dosleg.mjs +0 -196
  81. package/lib/model/dosleg.ts +0 -240
  82. package/lib/model/index.d.ts +0 -7
  83. package/lib/model/index.js +0 -7
  84. package/lib/model/index.mjs +0 -5
  85. package/lib/model/index.ts +0 -15
  86. package/lib/model/questions.d.ts +0 -45
  87. package/lib/model/questions.js +0 -89
  88. package/lib/model/questions.mjs +0 -71
  89. package/lib/model/questions.ts +0 -93
  90. package/lib/model/scrutins.d.ts +0 -13
  91. package/lib/model/scrutins.js +0 -114
  92. package/lib/model/seance.d.ts +0 -3
  93. package/lib/model/seance.js +0 -267
  94. package/lib/model/sens.d.ts +0 -146
  95. package/lib/model/sens.js +0 -454
  96. package/lib/model/sens.mjs +0 -415
  97. package/lib/model/sens.ts +0 -516
  98. package/lib/model/texte.d.ts +0 -7
  99. package/lib/model/texte.js +0 -256
  100. package/lib/model/texte.mjs +0 -208
  101. package/lib/model/texte.ts +0 -229
  102. package/lib/model/util.d.ts +0 -9
  103. package/lib/model/util.js +0 -38
  104. package/lib/model/util.mjs +0 -19
  105. package/lib/model/util.ts +0 -32
  106. package/lib/parsers/texte.d.ts +0 -7
  107. package/lib/parsers/texte.js +0 -228
  108. package/lib/raw_types/ameli.d.ts +0 -914
  109. package/lib/raw_types/ameli.js +0 -5
  110. package/lib/raw_types/ameli.mjs +0 -163
  111. package/lib/raw_types/debats.d.ts +0 -207
  112. package/lib/raw_types/debats.js +0 -5
  113. package/lib/raw_types/debats.mjs +0 -58
  114. package/lib/raw_types/dosleg.d.ts +0 -1619
  115. package/lib/raw_types/dosleg.js +0 -5
  116. package/lib/raw_types/dosleg.mjs +0 -438
  117. package/lib/raw_types/questions.d.ts +0 -419
  118. package/lib/raw_types/questions.js +0 -5
  119. package/lib/raw_types/questions.mjs +0 -11
  120. package/lib/raw_types/senat.d.ts +0 -11368
  121. package/lib/raw_types/senat.js +0 -5
  122. package/lib/raw_types/sens.d.ts +0 -8248
  123. package/lib/raw_types/sens.js +0 -5
  124. package/lib/raw_types/sens.mjs +0 -508
  125. package/lib/raw_types_kysely/ameli.d.ts +0 -915
  126. package/lib/raw_types_kysely/ameli.js +0 -7
  127. package/lib/raw_types_kysely/ameli.mjs +0 -5
  128. package/lib/raw_types_kysely/ameli.ts +0 -951
  129. package/lib/raw_types_kysely/debats.d.ts +0 -207
  130. package/lib/raw_types_kysely/debats.js +0 -7
  131. package/lib/raw_types_kysely/debats.mjs +0 -5
  132. package/lib/raw_types_kysely/debats.ts +0 -222
  133. package/lib/raw_types_kysely/dosleg.d.ts +0 -3532
  134. package/lib/raw_types_kysely/dosleg.js +0 -7
  135. package/lib/raw_types_kysely/dosleg.mjs +0 -5
  136. package/lib/raw_types_kysely/dosleg.ts +0 -3621
  137. package/lib/raw_types_kysely/questions.d.ts +0 -414
  138. package/lib/raw_types_kysely/questions.js +0 -7
  139. package/lib/raw_types_kysely/questions.mjs +0 -5
  140. package/lib/raw_types_kysely/questions.ts +0 -426
  141. package/lib/raw_types_kysely/sens.d.ts +0 -4394
  142. package/lib/raw_types_kysely/sens.js +0 -7
  143. package/lib/raw_types_kysely/sens.mjs +0 -5
  144. package/lib/raw_types_kysely/sens.ts +0 -4499
  145. package/lib/raw_types_schemats/ameli.d.ts +0 -539
  146. package/lib/raw_types_schemats/ameli.js +0 -2
  147. package/lib/raw_types_schemats/ameli.mjs +0 -2
  148. package/lib/raw_types_schemats/ameli.ts +0 -601
  149. package/lib/raw_types_schemats/debats.d.ts +0 -127
  150. package/lib/raw_types_schemats/debats.js +0 -2
  151. package/lib/raw_types_schemats/debats.mjs +0 -2
  152. package/lib/raw_types_schemats/debats.ts +0 -145
  153. package/lib/raw_types_schemats/dosleg.d.ts +0 -977
  154. package/lib/raw_types_schemats/dosleg.js +0 -2
  155. package/lib/raw_types_schemats/dosleg.mjs +0 -2
  156. package/lib/raw_types_schemats/dosleg.ts +0 -2193
  157. package/lib/raw_types_schemats/questions.d.ts +0 -235
  158. package/lib/raw_types_schemats/questions.js +0 -2
  159. package/lib/raw_types_schemats/questions.mjs +0 -2
  160. package/lib/raw_types_schemats/questions.ts +0 -249
  161. package/lib/raw_types_schemats/sens.d.ts +0 -6915
  162. package/lib/raw_types_schemats/sens.js +0 -2
  163. package/lib/raw_types_schemats/sens.mjs +0 -2
  164. package/lib/raw_types_schemats/sens.ts +0 -2907
  165. package/lib/scripts/convert_data.js +0 -354
  166. package/lib/scripts/convert_data.mjs +0 -181
  167. package/lib/scripts/convert_data.ts +0 -243
  168. package/lib/scripts/data-download.d.ts +0 -1
  169. package/lib/scripts/data-download.js +0 -12
  170. package/lib/scripts/datautil.d.ts +0 -8
  171. package/lib/scripts/datautil.js +0 -34
  172. package/lib/scripts/datautil.mjs +0 -16
  173. package/lib/scripts/datautil.ts +0 -19
  174. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  175. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  176. package/lib/scripts/parse_textes.d.ts +0 -1
  177. package/lib/scripts/parse_textes.js +0 -44
  178. package/lib/scripts/parse_textes.mjs +0 -46
  179. package/lib/scripts/parse_textes.ts +0 -65
  180. package/lib/scripts/retrieve_agenda.d.ts +0 -1
  181. package/lib/scripts/retrieve_agenda.js +0 -132
  182. package/lib/scripts/retrieve_cr_commission.d.ts +0 -1
  183. package/lib/scripts/retrieve_cr_commission.js +0 -364
  184. package/lib/scripts/retrieve_cr_seance.d.ts +0 -6
  185. package/lib/scripts/retrieve_cr_seance.js +0 -347
  186. package/lib/scripts/retrieve_documents.d.ts +0 -3
  187. package/lib/scripts/retrieve_documents.js +0 -219
  188. package/lib/scripts/retrieve_documents.mjs +0 -249
  189. package/lib/scripts/retrieve_documents.ts +0 -298
  190. package/lib/scripts/retrieve_open_data.d.ts +0 -1
  191. package/lib/scripts/retrieve_open_data.js +0 -315
  192. package/lib/scripts/retrieve_open_data.mjs +0 -217
  193. package/lib/scripts/retrieve_open_data.ts +0 -268
  194. package/lib/scripts/retrieve_senateurs_photos.d.ts +0 -1
  195. package/lib/scripts/retrieve_senateurs_photos.js +0 -147
  196. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -147
  197. package/lib/scripts/retrieve_senateurs_photos.ts +0 -177
  198. package/lib/scripts/retrieve_videos.d.ts +0 -1
  199. package/lib/scripts/retrieve_videos.js +0 -461
  200. package/lib/scripts/shared/cli_helpers.d.ts +0 -95
  201. package/lib/scripts/shared/cli_helpers.js +0 -91
  202. package/lib/scripts/shared/cli_helpers.ts +0 -36
  203. package/lib/scripts/shared/util.d.ts +0 -4
  204. package/lib/scripts/shared/util.js +0 -35
  205. package/lib/scripts/shared/util.ts +0 -33
  206. package/lib/scripts/test_iter_load.d.ts +0 -1
  207. package/lib/scripts/test_iter_load.js +0 -12
  208. package/lib/src/ameli.d.ts +0 -66
  209. package/lib/src/ameli.js +0 -1
  210. package/lib/src/config.d.ts +0 -43
  211. package/lib/src/config.js +0 -37
  212. package/lib/src/conversion_textes.d.ts +0 -11
  213. package/lib/src/conversion_textes.js +0 -320
  214. package/lib/src/databases.d.ts +0 -3
  215. package/lib/src/databases.js +0 -26
  216. package/lib/src/databases_postgres.d.ts +0 -4
  217. package/lib/src/databases_postgres.js +0 -23
  218. package/lib/src/datasets.d.ts +0 -38
  219. package/lib/src/datasets.js +0 -247
  220. package/lib/src/db_types/ameli.d.ts +0 -1762
  221. package/lib/src/db_types/ameli.js +0 -1074
  222. package/lib/src/db_types/debats.d.ts +0 -380
  223. package/lib/src/db_types/debats.js +0 -266
  224. package/lib/src/db_types/dosleg.d.ts +0 -2954
  225. package/lib/src/db_types/dosleg.js +0 -2005
  226. package/lib/src/db_types/questions.d.ts +0 -699
  227. package/lib/src/db_types/questions.js +0 -493
  228. package/lib/src/db_types/sens.d.ts +0 -7843
  229. package/lib/src/db_types/sens.js +0 -4691
  230. package/lib/src/debats.d.ts +0 -38
  231. package/lib/src/debats.js +0 -1
  232. package/lib/src/dosleg.d.ts +0 -142
  233. package/lib/src/dosleg.js +0 -193
  234. package/lib/src/git.d.ts +0 -27
  235. package/lib/src/git.js +0 -251
  236. package/lib/src/loaders.d.ts +0 -52
  237. package/lib/src/loaders.js +0 -260
  238. package/lib/src/model/agenda.d.ts +0 -6
  239. package/lib/src/model/agenda.js +0 -148
  240. package/lib/src/model/ameli.d.ts +0 -67
  241. package/lib/src/model/ameli.js +0 -150
  242. package/lib/src/model/ameli_postgres.d.ts +0 -67
  243. package/lib/src/model/ameli_postgres.js +0 -150
  244. package/lib/src/model/commission.d.ts +0 -19
  245. package/lib/src/model/commission.js +0 -269
  246. package/lib/src/model/debats.d.ts +0 -39
  247. package/lib/src/model/debats.js +0 -112
  248. package/lib/src/model/documents.d.ts +0 -32
  249. package/lib/src/model/documents.js +0 -182
  250. package/lib/src/model/dosleg.d.ts +0 -144
  251. package/lib/src/model/dosleg.js +0 -468
  252. package/lib/src/model/index.d.ts +0 -7
  253. package/lib/src/model/index.js +0 -7
  254. package/lib/src/model/questions.d.ts +0 -54
  255. package/lib/src/model/questions.js +0 -91
  256. package/lib/src/model/scrutins.d.ts +0 -48
  257. package/lib/src/model/scrutins.js +0 -121
  258. package/lib/src/model/seance.d.ts +0 -3
  259. package/lib/src/model/seance.js +0 -267
  260. package/lib/src/model/sens.d.ts +0 -112
  261. package/lib/src/model/sens.js +0 -385
  262. package/lib/src/model/util.d.ts +0 -1
  263. package/lib/src/model/util.js +0 -15
  264. package/lib/src/other_types/questions.d.ts +0 -2
  265. package/lib/src/other_types/questions.js +0 -1
  266. package/lib/src/questions.d.ts +0 -53
  267. package/lib/src/questions.js +0 -1
  268. package/lib/src/raw_types/ameli.d.ts +0 -1762
  269. package/lib/src/raw_types/ameli.js +0 -1074
  270. package/lib/src/raw_types/debats.d.ts +0 -380
  271. package/lib/src/raw_types/debats.js +0 -266
  272. package/lib/src/raw_types/dosleg.d.ts +0 -2954
  273. package/lib/src/raw_types/dosleg.js +0 -2005
  274. package/lib/src/raw_types/questions.d.ts +0 -699
  275. package/lib/src/raw_types/questions.js +0 -493
  276. package/lib/src/raw_types/senat.d.ts +0 -11372
  277. package/lib/src/raw_types/senat.js +0 -5
  278. package/lib/src/raw_types/sens.d.ts +0 -7843
  279. package/lib/src/raw_types/sens.js +0 -4691
  280. package/lib/src/raw_types_schemats/ameli.d.ts +0 -541
  281. package/lib/src/raw_types_schemats/ameli.js +0 -2
  282. package/lib/src/raw_types_schemats/debats.d.ts +0 -127
  283. package/lib/src/raw_types_schemats/debats.js +0 -2
  284. package/lib/src/raw_types_schemats/dosleg.d.ts +0 -977
  285. package/lib/src/raw_types_schemats/dosleg.js +0 -2
  286. package/lib/src/raw_types_schemats/questions.d.ts +0 -237
  287. package/lib/src/raw_types_schemats/questions.js +0 -2
  288. package/lib/src/raw_types_schemats/sens.d.ts +0 -2709
  289. package/lib/src/raw_types_schemats/sens.js +0 -2
  290. package/lib/src/rich_types/agenda.d.ts +0 -45
  291. package/lib/src/rich_types/agenda.js +0 -1
  292. package/lib/src/rich_types/compte_rendu.d.ts +0 -83
  293. package/lib/src/rich_types/compte_rendu.js +0 -1
  294. package/lib/src/rich_types/sessions.d.ts +0 -6
  295. package/lib/src/rich_types/sessions.js +0 -19
  296. package/lib/src/rich_types/texte.d.ts +0 -72
  297. package/lib/src/rich_types/texte.js +0 -15
  298. package/lib/src/scripts/test_iter_load.d.ts +0 -1
  299. package/lib/src/scripts/test_iter_load.js +0 -12
  300. package/lib/src/sens.d.ts +0 -104
  301. package/lib/src/sens.js +0 -1
  302. package/lib/src/types/agenda.d.ts +0 -45
  303. package/lib/src/types/agenda.js +0 -1
  304. package/lib/src/types/ameli.d.ts +0 -1762
  305. package/lib/src/types/ameli.js +0 -1074
  306. package/lib/src/types/compte_rendu.d.ts +0 -83
  307. package/lib/src/types/compte_rendu.js +0 -1
  308. package/lib/src/types/debats.d.ts +0 -380
  309. package/lib/src/types/debats.js +0 -266
  310. package/lib/src/types/dosleg.d.ts +0 -2954
  311. package/lib/src/types/dosleg.js +0 -2005
  312. package/lib/src/types/questions.d.ts +0 -699
  313. package/lib/src/types/questions.js +0 -493
  314. package/lib/src/types/sens.d.ts +0 -7843
  315. package/lib/src/types/sens.js +0 -4691
  316. package/lib/src/types/sessions.d.ts +0 -6
  317. package/lib/src/types/sessions.js +0 -19
  318. package/lib/src/types/texte.d.ts +0 -72
  319. package/lib/src/types/texte.js +0 -15
  320. package/lib/src/validators/config.d.ts +0 -9
  321. package/lib/src/validators/config.js +0 -10
  322. package/lib/strings.d.ts +0 -1
  323. package/lib/strings.js +0 -18
  324. package/lib/strings.mjs +0 -18
  325. package/lib/strings.ts +0 -26
  326. package/lib/tsconfig.tsbuildinfo +0 -1
  327. package/lib/types/agenda.d.ts +0 -44
  328. package/lib/types/agenda.js +0 -1
  329. package/lib/types/ameli.d.ts +0 -5
  330. package/lib/types/ameli.js +0 -1
  331. package/lib/types/ameli.mjs +0 -13
  332. package/lib/types/ameli.ts +0 -21
  333. package/lib/types/compte_rendu.d.ts +0 -83
  334. package/lib/types/compte_rendu.js +0 -1
  335. package/lib/types/debats.d.ts +0 -2
  336. package/lib/types/debats.js +0 -1
  337. package/lib/types/debats.mjs +0 -2
  338. package/lib/types/debats.ts +0 -6
  339. package/lib/types/dosleg.d.ts +0 -70
  340. package/lib/types/dosleg.js +0 -1
  341. package/lib/types/dosleg.mjs +0 -151
  342. package/lib/types/dosleg.ts +0 -284
  343. package/lib/types/questions.d.ts +0 -2
  344. package/lib/types/questions.js +0 -1
  345. package/lib/types/questions.mjs +0 -1
  346. package/lib/types/questions.ts +0 -3
  347. package/lib/types/sens.d.ts +0 -10
  348. package/lib/types/sens.js +0 -1
  349. package/lib/types/sens.mjs +0 -1
  350. package/lib/types/sens.ts +0 -12
  351. package/lib/types/sessions.d.ts +0 -5
  352. package/lib/types/sessions.js +0 -84
  353. package/lib/types/sessions.mjs +0 -43
  354. package/lib/types/sessions.ts +0 -42
  355. package/lib/types/texte.d.ts +0 -74
  356. package/lib/types/texte.js +0 -16
  357. package/lib/types/texte.mjs +0 -16
  358. package/lib/types/texte.ts +0 -76
  359. package/lib/typings/windows-1252.d.js +0 -2
  360. package/lib/typings/windows-1252.d.mjs +0 -2
  361. package/lib/typings/windows-1252.d.ts +0 -11
  362. package/lib/utils/cr_spliting.d.ts +0 -28
  363. package/lib/utils/cr_spliting.js +0 -265
  364. package/lib/utils/date.d.ts +0 -10
  365. package/lib/utils/date.js +0 -100
  366. package/lib/utils/nvs-timecode.d.ts +0 -7
  367. package/lib/utils/nvs-timecode.js +0 -79
  368. package/lib/utils/reunion_grouping.d.ts +0 -9
  369. package/lib/utils/reunion_grouping.js +0 -361
  370. package/lib/utils/reunion_odj_building.d.ts +0 -5
  371. package/lib/utils/reunion_odj_building.js +0 -154
  372. package/lib/utils/reunion_parsing.d.ts +0 -23
  373. package/lib/utils/reunion_parsing.js +0 -209
  374. package/lib/utils/scoring.d.ts +0 -14
  375. package/lib/utils/scoring.js +0 -147
  376. package/lib/utils/string_cleaning.d.ts +0 -7
  377. package/lib/utils/string_cleaning.js +0 -57
  378. package/lib/validators/config.d.ts +0 -9
  379. package/lib/validators/config.js +0 -10
  380. package/lib/validators/config.mjs +0 -54
  381. package/lib/validators/config.ts +0 -79
  382. package/lib/validators/senat.d.ts +0 -0
  383. package/lib/validators/senat.js +0 -28
  384. package/lib/validators/senat.mjs +0 -24
  385. package/lib/validators/senat.ts +0 -26
  386. /package/lib/{add-js-extensions-v2.d.ts → src/other_types/collaborateurs.js} +0 -0
  387. /package/lib/{add-js-extensions.d.ts → src/scripts/retrieve_collaborateurs.d.ts} +0 -0
  388. /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 { construireLignesCollaborateurs, extraireDateEdition, normaliserPourComparaison, parseCellulePersonne, } from "../src/parsers/collaborateurs.js";
3
+ // Bandes x mesurées sur le vrai PDF : employeur ≈ 147, collaborateur ≈ 285.
4
+ const X_EMPLOYEUR = 147;
5
+ const X_COLLABORATEUR = 285;
6
+ /** Construit une page synthétique : pour chaque ligne, [employeur?, collaborateur]. */
7
+ function pageItems(lignes, page = 1) {
8
+ const items = [];
9
+ let y = 700;
10
+ for (const [employeur, collaborateur] of lignes) {
11
+ if (employeur)
12
+ items.push({ str: employeur, x: X_EMPLOYEUR, y, page });
13
+ items.push({ str: collaborateur, x: X_COLLABORATEUR, y, page });
14
+ y -= 15;
15
+ }
16
+ return items;
17
+ }
18
+ describe("parseCellulePersonne", () => {
19
+ it("sépare civilité, nom et prénom", () => {
20
+ expect(parseCellulePersonne("M. CHAREF Dahmane")).toEqual({ civilite: "M.", nom: "CHAREF", prenom: "Dahmane" });
21
+ expect(parseCellulePersonne("Mme OLIVIER Béatrice")).toEqual({
22
+ civilite: "Mme",
23
+ nom: "OLIVIER",
24
+ prenom: "Béatrice",
25
+ });
26
+ });
27
+ it("gère les noms composés (plusieurs jetons en majuscules)", () => {
28
+ expect(parseCellulePersonne("Mme MAZENOT CHAPPUY Sophie")).toEqual({
29
+ civilite: "Mme",
30
+ nom: "MAZENOT CHAPPUY",
31
+ prenom: "Sophie",
32
+ });
33
+ expect(parseCellulePersonne("M. DI FOLCO Camille")).toEqual({ civilite: "M.", nom: "DI FOLCO", prenom: "Camille" });
34
+ });
35
+ it("gère les particules nobiliaires en tête de nom (de, de la)", () => {
36
+ expect(parseCellulePersonne("Mme de CIDRAC Marta")).toEqual({ civilite: "Mme", nom: "de CIDRAC", prenom: "Marta" });
37
+ expect(parseCellulePersonne("Mme de LA GONTRIE Marie-Pierre")).toEqual({
38
+ civilite: "Mme",
39
+ nom: "de LA GONTRIE",
40
+ prenom: "Marie-Pierre",
41
+ });
42
+ expect(parseCellulePersonne("M. de LEGGE Dominique")).toEqual({
43
+ civilite: "M.",
44
+ nom: "de LEGGE",
45
+ prenom: "Dominique",
46
+ });
47
+ expect(parseCellulePersonne("Mme APOURCEAU-POLY Cathy")).toEqual({
48
+ civilite: "Mme",
49
+ nom: "APOURCEAU-POLY",
50
+ prenom: "Cathy",
51
+ });
52
+ });
53
+ it("conserve un prénom tronqué tel quel", () => {
54
+ expect(parseCellulePersonne("Mme AESCHLIMANN Marie-Do")).toEqual({
55
+ civilite: "Mme",
56
+ nom: "AESCHLIMANN",
57
+ prenom: "Marie-Do",
58
+ });
59
+ });
60
+ it("ignore le marqueur (*) de congé non rémunéré", () => {
61
+ expect(parseCellulePersonne("M. DURAND (*) Paul")).toEqual({ civilite: "M.", nom: "DURAND", prenom: "Paul" });
62
+ });
63
+ it("renvoie null pour une cellule vide ou une civilité seule", () => {
64
+ expect(parseCellulePersonne("")).toBeNull();
65
+ expect(parseCellulePersonne("M.")).toBeNull();
66
+ });
67
+ });
68
+ describe("construireLignesCollaborateurs", () => {
69
+ it("rattache plusieurs collaborateurs au sénateur courant (report quand l'employeur est vide)", () => {
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 lignes = construireLignesCollaborateurs(items);
77
+ expect(lignes).toHaveLength(4);
78
+ expect(lignes.slice(0, 3).every((l) => l.senateur.nom === "AESCHLIMANN")).toBe(true);
79
+ expect(lignes[3].senateur.nom === "ALLIZARD" && lignes[3].collaborateur.nom === "OLIVIER").toBe(true);
80
+ });
81
+ it("ignore en-têtes, pieds de page et numéros, et gère plusieurs 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 lignes = construireLignesCollaborateurs(items);
92
+ expect(lignes).toHaveLength(2);
93
+ expect(lignes[0].senateur.nom).toBe("BACCI");
94
+ expect(lignes[1].senateur.nom).toBe("BÉLIM");
95
+ });
96
+ it("n'émet rien tant qu'aucun employeur n'a été rencontré", () => {
97
+ const orphelin = [{ str: "M. ORPHELIN Jean", x: X_COLLABORATEUR, y: 700, page: 1 }];
98
+ expect(construireLignesCollaborateurs(orphelin)).toHaveLength(0);
99
+ });
100
+ });
101
+ describe("extraireDateEdition", () => {
102
+ it("extrait la date d'édition du pied de page", () => {
103
+ const date = extraireDateEdition(["…", "Edition du 24/06/2026", "(*) Congé non rémunéré"]);
104
+ expect(date?.toISOString().slice(0, 10)).toBe("2026-06-24");
105
+ });
106
+ it("renvoie null si absente", () => {
107
+ expect(extraireDateEdition(["rien ici"])).toBeNull();
108
+ });
109
+ });
110
+ describe("normaliserPourComparaison", () => {
111
+ it("met en majuscules, retire les accents et compacte les espaces", () => {
112
+ expect(normaliserPourComparaison(" Béatrice ")).toBe("BEATRICE");
113
+ expect(normaliserPourComparaison("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,119 @@
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.23",
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,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
- }