@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.
- package/LICENSE.md +32 -32
- package/README.md +326 -326
- package/lib/src/index.d.ts +1 -0
- 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/rich_types/sens.d.ts +5 -0
- package/lib/src/scripts/data-download.js +1 -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 +121 -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 { 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)
|
|
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.
|
|
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:
|
|
64
|
-
"data:
|
|
65
|
-
"data:
|
|
66
|
-
"
|
|
67
|
-
"lint
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"type-check
|
|
74
|
-
"
|
|
75
|
-
"test:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"pg
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
"@
|
|
98
|
-
"@types/
|
|
99
|
-
"@types/
|
|
100
|
-
"@types/
|
|
101
|
-
"@types/
|
|
102
|
-
"@types/
|
|
103
|
-
"@types/
|
|
104
|
-
"@
|
|
105
|
-
"@
|
|
106
|
-
"
|
|
107
|
-
"eslint": "^
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"kanel
|
|
113
|
-
"kysely": "^0.
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
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();
|
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
|
-
}
|