@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.
- package/LICENSE.md +32 -32
- package/README.md +326 -326
- package/lib/src/other_types/collaborateurs.d.ts +5 -0
- package/lib/src/parsers/collaborateurs.d.ts +44 -0
- package/lib/src/parsers/collaborateurs.js +157 -0
- package/lib/src/scripts/retrieve_collaborateurs.js +166 -0
- package/lib/src/scripts/retrieve_cr_seance.js +34 -25
- package/lib/src/scripts/retrieve_videos.js +13 -8
- package/lib/src/scripts/shared/incremental_import_sql.js +866 -859
- package/lib/src/scripts/shared/schema_version.js +84 -84
- package/lib/src/scripts/shared/staging_metadata_sql.js +214 -214
- package/lib/src/scripts/validate_prefixed_tables.js +12 -12
- package/lib/src/server/ameli.js +14 -13
- package/lib/src/server/conversion_textes.js +106 -106
- package/lib/src/server/debats.js +10 -10
- package/lib/src/server/documents.js +22 -22
- package/lib/src/server/dosleg.js +33 -33
- package/lib/src/server/questions.js +10 -10
- package/lib/src/server/scrutins.js +3 -3
- package/lib/src/server/sens.js +19 -19
- package/lib/src/utils/reunion_odj_building.js +0 -4
- package/lib/src/videos/match.js +7 -5
- package/lib/src/videos/pipeline.js +26 -19
- package/lib/tests/collaborateurs.test.js +115 -0
- package/lib/tests/incrementalImportSql.test.js +4 -1
- package/package.json +119 -119
- package/lib/add-js-extensions-v2.js +0 -23
- package/lib/add-js-extensions.js +0 -17
- package/lib/aggregates.d.ts +0 -52
- package/lib/aggregates.js +0 -930
- package/lib/aggregates.mjs +0 -713
- package/lib/aggregates.ts +0 -833
- package/lib/config.d.ts +0 -10
- package/lib/config.js +0 -16
- package/lib/config.mjs +0 -16
- package/lib/config.ts +0 -26
- package/lib/databases.d.ts +0 -2
- package/lib/databases.js +0 -26
- package/lib/databases.mjs +0 -57
- package/lib/databases.ts +0 -71
- package/lib/datasets.d.ts +0 -34
- package/lib/datasets.js +0 -233
- package/lib/datasets.mjs +0 -78
- package/lib/datasets.ts +0 -118
- package/lib/fields.d.ts +0 -10
- package/lib/fields.js +0 -68
- package/lib/fields.mjs +0 -22
- package/lib/fields.ts +0 -29
- package/lib/git.d.ts +0 -26
- package/lib/git.js +0 -167
- package/lib/index.d.ts +0 -13
- package/lib/index.js +0 -1
- package/lib/index.mjs +0 -7
- package/lib/index.ts +0 -64
- package/lib/inserters.d.ts +0 -98
- package/lib/inserters.js +0 -500
- package/lib/inserters.mjs +0 -360
- package/lib/inserters.ts +0 -521
- package/lib/legislatures.json +0 -38
- package/lib/loaders.d.ts +0 -58
- package/lib/loaders.js +0 -286
- package/lib/loaders.mjs +0 -158
- package/lib/loaders.ts +0 -271
- package/lib/model/agenda.d.ts +0 -6
- package/lib/model/agenda.js +0 -148
- package/lib/model/ameli.d.ts +0 -51
- package/lib/model/ameli.js +0 -149
- package/lib/model/ameli.mjs +0 -84
- package/lib/model/ameli.ts +0 -100
- package/lib/model/commission.d.ts +0 -18
- package/lib/model/commission.js +0 -269
- package/lib/model/debats.d.ts +0 -67
- package/lib/model/debats.js +0 -95
- package/lib/model/debats.mjs +0 -43
- package/lib/model/debats.ts +0 -68
- package/lib/model/documents.d.ts +0 -12
- package/lib/model/documents.js +0 -151
- package/lib/model/dosleg.d.ts +0 -7
- package/lib/model/dosleg.js +0 -326
- package/lib/model/dosleg.mjs +0 -196
- package/lib/model/dosleg.ts +0 -240
- package/lib/model/index.d.ts +0 -7
- package/lib/model/index.js +0 -7
- package/lib/model/index.mjs +0 -5
- package/lib/model/index.ts +0 -15
- package/lib/model/questions.d.ts +0 -45
- package/lib/model/questions.js +0 -89
- package/lib/model/questions.mjs +0 -71
- package/lib/model/questions.ts +0 -93
- package/lib/model/scrutins.d.ts +0 -13
- package/lib/model/scrutins.js +0 -114
- package/lib/model/seance.d.ts +0 -3
- package/lib/model/seance.js +0 -267
- package/lib/model/sens.d.ts +0 -146
- package/lib/model/sens.js +0 -454
- package/lib/model/sens.mjs +0 -415
- package/lib/model/sens.ts +0 -516
- package/lib/model/texte.d.ts +0 -7
- package/lib/model/texte.js +0 -256
- package/lib/model/texte.mjs +0 -208
- package/lib/model/texte.ts +0 -229
- package/lib/model/util.d.ts +0 -9
- package/lib/model/util.js +0 -38
- package/lib/model/util.mjs +0 -19
- package/lib/model/util.ts +0 -32
- package/lib/parsers/texte.d.ts +0 -7
- package/lib/parsers/texte.js +0 -228
- package/lib/raw_types/ameli.d.ts +0 -914
- package/lib/raw_types/ameli.js +0 -5
- package/lib/raw_types/ameli.mjs +0 -163
- package/lib/raw_types/debats.d.ts +0 -207
- package/lib/raw_types/debats.js +0 -5
- package/lib/raw_types/debats.mjs +0 -58
- package/lib/raw_types/dosleg.d.ts +0 -1619
- package/lib/raw_types/dosleg.js +0 -5
- package/lib/raw_types/dosleg.mjs +0 -438
- package/lib/raw_types/questions.d.ts +0 -419
- package/lib/raw_types/questions.js +0 -5
- package/lib/raw_types/questions.mjs +0 -11
- package/lib/raw_types/senat.d.ts +0 -11368
- package/lib/raw_types/senat.js +0 -5
- package/lib/raw_types/sens.d.ts +0 -8248
- package/lib/raw_types/sens.js +0 -5
- package/lib/raw_types/sens.mjs +0 -508
- package/lib/raw_types_kysely/ameli.d.ts +0 -915
- package/lib/raw_types_kysely/ameli.js +0 -7
- package/lib/raw_types_kysely/ameli.mjs +0 -5
- package/lib/raw_types_kysely/ameli.ts +0 -951
- package/lib/raw_types_kysely/debats.d.ts +0 -207
- package/lib/raw_types_kysely/debats.js +0 -7
- package/lib/raw_types_kysely/debats.mjs +0 -5
- package/lib/raw_types_kysely/debats.ts +0 -222
- package/lib/raw_types_kysely/dosleg.d.ts +0 -3532
- package/lib/raw_types_kysely/dosleg.js +0 -7
- package/lib/raw_types_kysely/dosleg.mjs +0 -5
- package/lib/raw_types_kysely/dosleg.ts +0 -3621
- package/lib/raw_types_kysely/questions.d.ts +0 -414
- package/lib/raw_types_kysely/questions.js +0 -7
- package/lib/raw_types_kysely/questions.mjs +0 -5
- package/lib/raw_types_kysely/questions.ts +0 -426
- package/lib/raw_types_kysely/sens.d.ts +0 -4394
- package/lib/raw_types_kysely/sens.js +0 -7
- package/lib/raw_types_kysely/sens.mjs +0 -5
- package/lib/raw_types_kysely/sens.ts +0 -4499
- package/lib/raw_types_schemats/ameli.d.ts +0 -539
- package/lib/raw_types_schemats/ameli.js +0 -2
- package/lib/raw_types_schemats/ameli.mjs +0 -2
- package/lib/raw_types_schemats/ameli.ts +0 -601
- package/lib/raw_types_schemats/debats.d.ts +0 -127
- package/lib/raw_types_schemats/debats.js +0 -2
- package/lib/raw_types_schemats/debats.mjs +0 -2
- package/lib/raw_types_schemats/debats.ts +0 -145
- package/lib/raw_types_schemats/dosleg.d.ts +0 -977
- package/lib/raw_types_schemats/dosleg.js +0 -2
- package/lib/raw_types_schemats/dosleg.mjs +0 -2
- package/lib/raw_types_schemats/dosleg.ts +0 -2193
- package/lib/raw_types_schemats/questions.d.ts +0 -235
- package/lib/raw_types_schemats/questions.js +0 -2
- package/lib/raw_types_schemats/questions.mjs +0 -2
- package/lib/raw_types_schemats/questions.ts +0 -249
- package/lib/raw_types_schemats/sens.d.ts +0 -6915
- package/lib/raw_types_schemats/sens.js +0 -2
- package/lib/raw_types_schemats/sens.mjs +0 -2
- package/lib/raw_types_schemats/sens.ts +0 -2907
- package/lib/scripts/convert_data.js +0 -354
- package/lib/scripts/convert_data.mjs +0 -181
- package/lib/scripts/convert_data.ts +0 -243
- package/lib/scripts/data-download.d.ts +0 -1
- package/lib/scripts/data-download.js +0 -12
- package/lib/scripts/datautil.d.ts +0 -8
- package/lib/scripts/datautil.js +0 -34
- package/lib/scripts/datautil.mjs +0 -16
- package/lib/scripts/datautil.ts +0 -19
- package/lib/scripts/images/transparent_150x192.jpg +0 -0
- package/lib/scripts/images/transparent_155x225.jpg +0 -0
- package/lib/scripts/parse_textes.d.ts +0 -1
- package/lib/scripts/parse_textes.js +0 -44
- package/lib/scripts/parse_textes.mjs +0 -46
- package/lib/scripts/parse_textes.ts +0 -65
- package/lib/scripts/retrieve_agenda.d.ts +0 -1
- package/lib/scripts/retrieve_agenda.js +0 -132
- package/lib/scripts/retrieve_cr_commission.d.ts +0 -1
- package/lib/scripts/retrieve_cr_commission.js +0 -364
- package/lib/scripts/retrieve_cr_seance.d.ts +0 -6
- package/lib/scripts/retrieve_cr_seance.js +0 -347
- package/lib/scripts/retrieve_documents.d.ts +0 -3
- package/lib/scripts/retrieve_documents.js +0 -219
- package/lib/scripts/retrieve_documents.mjs +0 -249
- package/lib/scripts/retrieve_documents.ts +0 -298
- package/lib/scripts/retrieve_open_data.d.ts +0 -1
- package/lib/scripts/retrieve_open_data.js +0 -315
- package/lib/scripts/retrieve_open_data.mjs +0 -217
- package/lib/scripts/retrieve_open_data.ts +0 -268
- package/lib/scripts/retrieve_senateurs_photos.d.ts +0 -1
- package/lib/scripts/retrieve_senateurs_photos.js +0 -147
- package/lib/scripts/retrieve_senateurs_photos.mjs +0 -147
- package/lib/scripts/retrieve_senateurs_photos.ts +0 -177
- package/lib/scripts/retrieve_videos.d.ts +0 -1
- package/lib/scripts/retrieve_videos.js +0 -461
- package/lib/scripts/shared/cli_helpers.d.ts +0 -95
- package/lib/scripts/shared/cli_helpers.js +0 -91
- package/lib/scripts/shared/cli_helpers.ts +0 -36
- package/lib/scripts/shared/util.d.ts +0 -4
- package/lib/scripts/shared/util.js +0 -35
- package/lib/scripts/shared/util.ts +0 -33
- package/lib/scripts/test_iter_load.d.ts +0 -1
- package/lib/scripts/test_iter_load.js +0 -12
- package/lib/src/ameli.d.ts +0 -66
- package/lib/src/ameli.js +0 -1
- package/lib/src/config.d.ts +0 -43
- package/lib/src/config.js +0 -37
- package/lib/src/conversion_textes.d.ts +0 -11
- package/lib/src/conversion_textes.js +0 -320
- package/lib/src/databases.d.ts +0 -3
- package/lib/src/databases.js +0 -26
- package/lib/src/databases_postgres.d.ts +0 -4
- package/lib/src/databases_postgres.js +0 -23
- package/lib/src/datasets.d.ts +0 -38
- package/lib/src/datasets.js +0 -247
- package/lib/src/db_types/ameli.d.ts +0 -1762
- package/lib/src/db_types/ameli.js +0 -1074
- package/lib/src/db_types/debats.d.ts +0 -380
- package/lib/src/db_types/debats.js +0 -266
- package/lib/src/db_types/dosleg.d.ts +0 -2954
- package/lib/src/db_types/dosleg.js +0 -2005
- package/lib/src/db_types/questions.d.ts +0 -699
- package/lib/src/db_types/questions.js +0 -493
- package/lib/src/db_types/sens.d.ts +0 -7843
- package/lib/src/db_types/sens.js +0 -4691
- package/lib/src/debats.d.ts +0 -38
- package/lib/src/debats.js +0 -1
- package/lib/src/dosleg.d.ts +0 -142
- package/lib/src/dosleg.js +0 -193
- package/lib/src/git.d.ts +0 -27
- package/lib/src/git.js +0 -251
- package/lib/src/loaders.d.ts +0 -52
- package/lib/src/loaders.js +0 -260
- package/lib/src/model/agenda.d.ts +0 -6
- package/lib/src/model/agenda.js +0 -148
- package/lib/src/model/ameli.d.ts +0 -67
- package/lib/src/model/ameli.js +0 -150
- package/lib/src/model/ameli_postgres.d.ts +0 -67
- package/lib/src/model/ameli_postgres.js +0 -150
- package/lib/src/model/commission.d.ts +0 -19
- package/lib/src/model/commission.js +0 -269
- package/lib/src/model/debats.d.ts +0 -39
- package/lib/src/model/debats.js +0 -112
- package/lib/src/model/documents.d.ts +0 -32
- package/lib/src/model/documents.js +0 -182
- package/lib/src/model/dosleg.d.ts +0 -144
- package/lib/src/model/dosleg.js +0 -468
- package/lib/src/model/index.d.ts +0 -7
- package/lib/src/model/index.js +0 -7
- package/lib/src/model/questions.d.ts +0 -54
- package/lib/src/model/questions.js +0 -91
- package/lib/src/model/scrutins.d.ts +0 -48
- package/lib/src/model/scrutins.js +0 -121
- package/lib/src/model/seance.d.ts +0 -3
- package/lib/src/model/seance.js +0 -267
- package/lib/src/model/sens.d.ts +0 -112
- package/lib/src/model/sens.js +0 -385
- package/lib/src/model/util.d.ts +0 -1
- package/lib/src/model/util.js +0 -15
- package/lib/src/other_types/questions.d.ts +0 -2
- package/lib/src/other_types/questions.js +0 -1
- package/lib/src/questions.d.ts +0 -53
- package/lib/src/questions.js +0 -1
- package/lib/src/raw_types/ameli.d.ts +0 -1762
- package/lib/src/raw_types/ameli.js +0 -1074
- package/lib/src/raw_types/debats.d.ts +0 -380
- package/lib/src/raw_types/debats.js +0 -266
- package/lib/src/raw_types/dosleg.d.ts +0 -2954
- package/lib/src/raw_types/dosleg.js +0 -2005
- package/lib/src/raw_types/questions.d.ts +0 -699
- package/lib/src/raw_types/questions.js +0 -493
- package/lib/src/raw_types/senat.d.ts +0 -11372
- package/lib/src/raw_types/senat.js +0 -5
- package/lib/src/raw_types/sens.d.ts +0 -7843
- package/lib/src/raw_types/sens.js +0 -4691
- package/lib/src/raw_types_schemats/ameli.d.ts +0 -541
- package/lib/src/raw_types_schemats/ameli.js +0 -2
- package/lib/src/raw_types_schemats/debats.d.ts +0 -127
- package/lib/src/raw_types_schemats/debats.js +0 -2
- package/lib/src/raw_types_schemats/dosleg.d.ts +0 -977
- package/lib/src/raw_types_schemats/dosleg.js +0 -2
- package/lib/src/raw_types_schemats/questions.d.ts +0 -237
- package/lib/src/raw_types_schemats/questions.js +0 -2
- package/lib/src/raw_types_schemats/sens.d.ts +0 -2709
- package/lib/src/raw_types_schemats/sens.js +0 -2
- package/lib/src/rich_types/agenda.d.ts +0 -45
- package/lib/src/rich_types/agenda.js +0 -1
- package/lib/src/rich_types/compte_rendu.d.ts +0 -83
- package/lib/src/rich_types/compte_rendu.js +0 -1
- package/lib/src/rich_types/sessions.d.ts +0 -6
- package/lib/src/rich_types/sessions.js +0 -19
- package/lib/src/rich_types/texte.d.ts +0 -72
- package/lib/src/rich_types/texte.js +0 -15
- package/lib/src/scripts/test_iter_load.d.ts +0 -1
- package/lib/src/scripts/test_iter_load.js +0 -12
- package/lib/src/sens.d.ts +0 -104
- package/lib/src/sens.js +0 -1
- package/lib/src/types/agenda.d.ts +0 -45
- package/lib/src/types/agenda.js +0 -1
- package/lib/src/types/ameli.d.ts +0 -1762
- package/lib/src/types/ameli.js +0 -1074
- package/lib/src/types/compte_rendu.d.ts +0 -83
- package/lib/src/types/compte_rendu.js +0 -1
- package/lib/src/types/debats.d.ts +0 -380
- package/lib/src/types/debats.js +0 -266
- package/lib/src/types/dosleg.d.ts +0 -2954
- package/lib/src/types/dosleg.js +0 -2005
- package/lib/src/types/questions.d.ts +0 -699
- package/lib/src/types/questions.js +0 -493
- package/lib/src/types/sens.d.ts +0 -7843
- package/lib/src/types/sens.js +0 -4691
- package/lib/src/types/sessions.d.ts +0 -6
- package/lib/src/types/sessions.js +0 -19
- package/lib/src/types/texte.d.ts +0 -72
- package/lib/src/types/texte.js +0 -15
- package/lib/src/validators/config.d.ts +0 -9
- package/lib/src/validators/config.js +0 -10
- package/lib/strings.d.ts +0 -1
- package/lib/strings.js +0 -18
- package/lib/strings.mjs +0 -18
- package/lib/strings.ts +0 -26
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/types/agenda.d.ts +0 -44
- package/lib/types/agenda.js +0 -1
- package/lib/types/ameli.d.ts +0 -5
- package/lib/types/ameli.js +0 -1
- package/lib/types/ameli.mjs +0 -13
- package/lib/types/ameli.ts +0 -21
- package/lib/types/compte_rendu.d.ts +0 -83
- package/lib/types/compte_rendu.js +0 -1
- package/lib/types/debats.d.ts +0 -2
- package/lib/types/debats.js +0 -1
- package/lib/types/debats.mjs +0 -2
- package/lib/types/debats.ts +0 -6
- package/lib/types/dosleg.d.ts +0 -70
- package/lib/types/dosleg.js +0 -1
- package/lib/types/dosleg.mjs +0 -151
- package/lib/types/dosleg.ts +0 -284
- package/lib/types/questions.d.ts +0 -2
- package/lib/types/questions.js +0 -1
- package/lib/types/questions.mjs +0 -1
- package/lib/types/questions.ts +0 -3
- package/lib/types/sens.d.ts +0 -10
- package/lib/types/sens.js +0 -1
- package/lib/types/sens.mjs +0 -1
- package/lib/types/sens.ts +0 -12
- package/lib/types/sessions.d.ts +0 -5
- package/lib/types/sessions.js +0 -84
- package/lib/types/sessions.mjs +0 -43
- package/lib/types/sessions.ts +0 -42
- package/lib/types/texte.d.ts +0 -74
- package/lib/types/texte.js +0 -16
- package/lib/types/texte.mjs +0 -16
- package/lib/types/texte.ts +0 -76
- package/lib/typings/windows-1252.d.js +0 -2
- package/lib/typings/windows-1252.d.mjs +0 -2
- package/lib/typings/windows-1252.d.ts +0 -11
- package/lib/utils/cr_spliting.d.ts +0 -28
- package/lib/utils/cr_spliting.js +0 -265
- package/lib/utils/date.d.ts +0 -10
- package/lib/utils/date.js +0 -100
- package/lib/utils/nvs-timecode.d.ts +0 -7
- package/lib/utils/nvs-timecode.js +0 -79
- package/lib/utils/reunion_grouping.d.ts +0 -9
- package/lib/utils/reunion_grouping.js +0 -361
- package/lib/utils/reunion_odj_building.d.ts +0 -5
- package/lib/utils/reunion_odj_building.js +0 -154
- package/lib/utils/reunion_parsing.d.ts +0 -23
- package/lib/utils/reunion_parsing.js +0 -209
- package/lib/utils/scoring.d.ts +0 -14
- package/lib/utils/scoring.js +0 -147
- package/lib/utils/string_cleaning.d.ts +0 -7
- package/lib/utils/string_cleaning.js +0 -57
- package/lib/validators/config.d.ts +0 -9
- package/lib/validators/config.js +0 -10
- package/lib/validators/config.mjs +0 -54
- package/lib/validators/config.ts +0 -79
- package/lib/validators/senat.d.ts +0 -0
- package/lib/validators/senat.js +0 -28
- package/lib/validators/senat.mjs +0 -24
- package/lib/validators/senat.ts +0 -26
- /package/lib/{add-js-extensions-v2.d.ts → src/other_types/collaborateurs.js} +0 -0
- /package/lib/{add-js-extensions.d.ts → src/scripts/retrieve_collaborateurs.d.ts} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80
|
+
warn(options, `[warn] invalid JSON in ${agendaJsonPath}`);
|
|
72
81
|
return;
|
|
73
82
|
}
|
|
74
83
|
if (!isReunion(obj)) {
|
|
75
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
148
|
+
log(options, `[bis] created agenda json ${agendaBis.uid}.json from ${agenda.uid}.json`);
|
|
142
149
|
}
|
|
143
150
|
catch (e) {
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
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.
|
|
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();
|
package/lib/add-js-extensions.js
DELETED
|
@@ -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();
|
package/lib/aggregates.d.ts
DELETED
|
@@ -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
|
-
}
|