@tricoteuses/senat 1.1.2 → 1.3.2

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 (155) hide show
  1. package/README.md +53 -15
  2. package/lib/config.d.ts +1 -0
  3. package/lib/config.js +14 -45
  4. package/lib/databases.d.ts +9 -0
  5. package/lib/databases.js +90 -117
  6. package/lib/datasets.js +78 -83
  7. package/lib/index.d.ts +8 -7
  8. package/lib/index.js +42 -523
  9. package/lib/legislatures.json +38 -0
  10. package/lib/loaders.d.ts +64 -0
  11. package/lib/loaders.js +177 -0
  12. package/lib/model/ameli.d.ts +105 -4
  13. package/lib/model/ameli.js +88 -166
  14. package/lib/model/debats.d.ts +0 -4
  15. package/lib/model/debats.js +0 -122
  16. package/lib/model/dosleg.d.ts +227 -29
  17. package/lib/model/dosleg.js +205 -839
  18. package/lib/model/index.d.ts +4 -5
  19. package/lib/model/index.js +12 -47
  20. package/lib/model/questions.d.ts +88 -2
  21. package/lib/model/questions.js +75 -51
  22. package/lib/model/sens.d.ts +524 -2
  23. package/lib/model/sens.js +449 -56
  24. package/lib/model/texte.d.ts +7 -0
  25. package/lib/model/texte.js +251 -0
  26. package/lib/model/util.d.ts +7 -1
  27. package/lib/model/util.js +26 -59
  28. package/lib/raw_types/ameli.d.ts +912 -538
  29. package/lib/raw_types/ameli.js +3 -42
  30. package/lib/raw_types/debats.d.ts +204 -124
  31. package/lib/raw_types/debats.js +3 -21
  32. package/lib/raw_types/dosleg.d.ts +3533 -2024
  33. package/lib/raw_types/dosleg.js +3 -95
  34. package/lib/raw_types/questions.d.ts +404 -220
  35. package/lib/raw_types/questions.js +3 -21
  36. package/lib/raw_types/sens.d.ts +4391 -2706
  37. package/lib/raw_types/sens.js +3 -111
  38. package/lib/raw_types_schemats/ameli.d.ts +541 -0
  39. package/lib/raw_types_schemats/ameli.js +3 -0
  40. package/lib/raw_types_schemats/debats.d.ts +127 -0
  41. package/lib/raw_types_schemats/debats.js +3 -0
  42. package/lib/raw_types_schemats/dosleg.d.ts +2029 -0
  43. package/lib/raw_types_schemats/dosleg.js +3 -0
  44. package/lib/raw_types_schemats/questions.d.ts +233 -0
  45. package/lib/raw_types_schemats/questions.js +3 -0
  46. package/lib/raw_types_schemats/sens.d.ts +2709 -0
  47. package/lib/raw_types_schemats/sens.js +3 -0
  48. package/lib/scripts/convert_data.js +184 -275
  49. package/lib/scripts/datautil.d.ts +5 -0
  50. package/lib/scripts/datautil.js +21 -0
  51. package/lib/scripts/parse_textes.js +49 -0
  52. package/lib/scripts/retrieve_documents.js +255 -0
  53. package/lib/scripts/retrieve_open_data.js +211 -360
  54. package/lib/scripts/retrieve_senateurs_photos.js +144 -257
  55. package/lib/scripts/shared/cli_helpers.d.ts +44 -0
  56. package/lib/scripts/shared/cli_helpers.js +35 -0
  57. package/lib/scripts/shared/util.d.ts +3 -0
  58. package/lib/scripts/shared/util.js +36 -0
  59. package/lib/strings.js +20 -45
  60. package/lib/types/ameli.d.ts +2 -2
  61. package/lib/types/ameli.js +14 -25
  62. package/lib/types/debats.d.ts +2 -2
  63. package/lib/types/debats.js +3 -21
  64. package/lib/types/dosleg.d.ts +3 -3
  65. package/lib/types/dosleg.js +152 -119
  66. package/lib/types/questions.d.ts +2 -2
  67. package/lib/types/questions.js +1 -13
  68. package/lib/types/sens.d.ts +2 -4
  69. package/lib/types/sens.js +1 -16
  70. package/lib/types/sessions.d.ts +42 -0
  71. package/lib/types/sessions.js +46 -0
  72. package/lib/types/texte.d.ts +65 -0
  73. package/lib/types/texte.js +19 -0
  74. package/lib/validators/config.js +47 -111
  75. package/lib/validators/senat.js +1 -5
  76. package/package.json +35 -32
  77. package/lib/aggregates.d.ts +0 -54
  78. package/lib/aggregates.js +0 -1122
  79. package/lib/aggregates.mjs +0 -802
  80. package/lib/aggregates.ts +0 -947
  81. package/lib/config.mjs +0 -16
  82. package/lib/config.ts +0 -26
  83. package/lib/databases.mjs +0 -26
  84. package/lib/databases.ts +0 -32
  85. package/lib/datasets.mjs +0 -78
  86. package/lib/datasets.ts +0 -118
  87. package/lib/fields.d.ts +0 -10
  88. package/lib/fields.js +0 -68
  89. package/lib/fields.mjs +0 -22
  90. package/lib/fields.ts +0 -29
  91. package/lib/index.mjs +0 -7
  92. package/lib/index.ts +0 -63
  93. package/lib/inserters.d.ts +0 -102
  94. package/lib/inserters.js +0 -518
  95. package/lib/inserters.mjs +0 -376
  96. package/lib/inserters.ts +0 -545
  97. package/lib/model/ameli.mjs +0 -57
  98. package/lib/model/ameli.ts +0 -86
  99. package/lib/model/debats.mjs +0 -43
  100. package/lib/model/debats.ts +0 -68
  101. package/lib/model/dosleg.mjs +0 -337
  102. package/lib/model/dosleg.ts +0 -558
  103. package/lib/model/index.mjs +0 -5
  104. package/lib/model/index.ts +0 -11
  105. package/lib/model/questions.mjs +0 -8
  106. package/lib/model/questions.ts +0 -14
  107. package/lib/model/sens.mjs +0 -9
  108. package/lib/model/sens.ts +0 -18
  109. package/lib/model/util.mjs +0 -10
  110. package/lib/model/util.ts +0 -16
  111. package/lib/raw_types/ameli.mjs +0 -2
  112. package/lib/raw_types/ameli.ts +0 -601
  113. package/lib/raw_types/debats.mjs +0 -2
  114. package/lib/raw_types/debats.ts +0 -145
  115. package/lib/raw_types/dosleg.mjs +0 -2
  116. package/lib/raw_types/dosleg.ts +0 -2193
  117. package/lib/raw_types/questions.mjs +0 -2
  118. package/lib/raw_types/questions.ts +0 -249
  119. package/lib/raw_types/sens.mjs +0 -2
  120. package/lib/raw_types/sens.ts +0 -2907
  121. package/lib/scripts/convert_data.mjs +0 -146
  122. package/lib/scripts/convert_data.ts +0 -182
  123. package/lib/scripts/fix_db.js +0 -144
  124. package/lib/scripts/fix_db.mjs +0 -64
  125. package/lib/scripts/fix_db.ts +0 -75
  126. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  127. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  128. package/lib/scripts/retrieve_open_data.mjs +0 -218
  129. package/lib/scripts/retrieve_open_data.ts +0 -258
  130. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -164
  131. package/lib/scripts/retrieve_senateurs_photos.ts +0 -200
  132. package/lib/scripts/retrieve_textes.js +0 -179
  133. package/lib/scripts/retrieve_textes.mjs +0 -77
  134. package/lib/scripts/retrieve_textes.ts +0 -95
  135. package/lib/strings.mjs +0 -18
  136. package/lib/strings.ts +0 -26
  137. package/lib/types/ameli.mjs +0 -13
  138. package/lib/types/ameli.ts +0 -21
  139. package/lib/types/debats.mjs +0 -2
  140. package/lib/types/debats.ts +0 -6
  141. package/lib/types/dosleg.mjs +0 -151
  142. package/lib/types/dosleg.ts +0 -284
  143. package/lib/types/questions.mjs +0 -1
  144. package/lib/types/questions.ts +0 -3
  145. package/lib/types/sens.mjs +0 -23
  146. package/lib/types/sens.ts +0 -36
  147. package/lib/typings/windows-1252.d.js +0 -2
  148. package/lib/typings/windows-1252.d.mjs +0 -2
  149. package/lib/typings/windows-1252.d.ts +0 -11
  150. package/lib/validators/config.mjs +0 -54
  151. package/lib/validators/config.ts +0 -79
  152. package/lib/validators/senat.mjs +0 -24
  153. package/lib/validators/senat.ts +0 -26
  154. /package/lib/scripts/{fix_db.d.ts → parse_textes.d.ts} +0 -0
  155. /package/lib/scripts/{retrieve_textes.d.ts → retrieve_documents.d.ts} +0 -0
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UNDEFINED_SESSION = exports.AKN_WORKFLOW_IDENTIFICATION_STRUCTURE_REGEXP = exports.AKN_IDENTIFICATION_STRUCTURE_REGEXP = exports.SIGNET_STRUCTURE_REGEXP = void 0;
4
+ exports.formatToFourDigitSession = formatToFourDigitSession;
5
+ const luxon_1 = require("luxon");
6
+ luxon_1.Settings.twoDigitCutoffYear = 50;
7
+ exports.SIGNET_STRUCTURE_REGEXP = /^(?<type>[a-z]+)(?<session>\d{2,4})-?(?<numTexte>\d+)?/;
8
+ exports.AKN_IDENTIFICATION_STRUCTURE_REGEXP = /^\/akn\/fr\/(?<type>[a-z]+)\/(?<session>\d{4}-\d{4})\/?(?<numTexte>\d+)\/fr@(?<version>\b(?:RECT|RECT_BIS|RECT_TER|RECT_QUATER|RECT_QUINQUIES)\b)?/;
9
+ exports.AKN_WORKFLOW_IDENTIFICATION_STRUCTURE_REGEXP = /^\/akn\/fr\/(?<type>[a-z]+)\/(?<session>\d{2,4})\/?(?<numTexte>[a-zA-Z0-9]+)\/fr@(?<version>\b(?:RECT|RECT_BIS|RECT_TER|RECT_QUATER|RECT_QUINQUIES)\b)?/;
10
+ exports.UNDEFINED_SESSION = "0";
11
+ function formatToFourDigitSession(session) {
12
+ if (session.length >= 2) {
13
+ const sessionFirstTwoDigits = session.substring(0, 2);
14
+ const sessionLastTwoDigits = session.substring(session.length - 2);
15
+ const twoDigitSession = parseInt(sessionFirstTwoDigits) === parseInt(sessionLastTwoDigits) - 1
16
+ ? sessionFirstTwoDigits
17
+ : sessionLastTwoDigits;
18
+ return luxon_1.DateTime.fromFormat(String(twoDigitSession), "yy").toFormat("yyyy");
19
+ }
20
+ return exports.UNDEFINED_SESSION;
21
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const command_line_args_1 = __importDefault(require("command-line-args"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const loaders_1 = require("../loaders");
11
+ const texte_1 = require("../model/texte");
12
+ const cli_helpers_1 = require("./shared/cli_helpers");
13
+ const util_1 = require("./shared/util");
14
+ const optionsDefinitions = [...cli_helpers_1.commonOptions];
15
+ const options = (0, command_line_args_1.default)(optionsDefinitions);
16
+ async function main() {
17
+ const dataDir = options["dataDir"];
18
+ (0, assert_1.default)(dataDir, "Missing argument: data directory");
19
+ const transformedTextesDir = path_1.default.join(options["dataDir"], loaders_1.TEXTE_FOLDER, loaders_1.TEXTE_TRANSFORMED_FOLDER);
20
+ (0, util_1.ensureAndClearDir)(transformedTextesDir);
21
+ for (const filePath of (0, loaders_1.iterFilePaths)(path_1.default.join(dataDir, loaders_1.TEXTE_FOLDER, loaders_1.TEXTE_ORIGINAL_FOLDER))) {
22
+ const parsedFilePath = path_1.default.parse(filePath);
23
+ if (parsedFilePath.ext !== ".xml") {
24
+ continue;
25
+ }
26
+ const texteDirFromOriginal = parsedFilePath.dir.substring(filePath.indexOf(loaders_1.TEXTE_ORIGINAL_FOLDER) + loaders_1.TEXTE_ORIGINAL_FOLDER.length);
27
+ const transformedTexteDir = path_1.default.join(transformedTextesDir, texteDirFromOriginal);
28
+ fs_extra_1.default.ensureDirSync(transformedTexteDir);
29
+ if (!options["silent"]) {
30
+ console.log(`Parsing texte ${parsedFilePath.name}.xml…`);
31
+ }
32
+ const parsedTexte = await (0, texte_1.parseTexteFromFile)(filePath);
33
+ const exposeDesMotifsFileName = `${parsedFilePath.name}-expose`;
34
+ const exposeDesMotifsFilePath = path_1.default.join(parsedFilePath.dir, `${exposeDesMotifsFileName}.html`);
35
+ if (parsedTexte && fs_extra_1.default.existsSync(exposeDesMotifsFilePath)) {
36
+ if (!options["silent"]) {
37
+ console.log(`Parsing exposé des motifs ${exposeDesMotifsFileName}.html…`);
38
+ }
39
+ parsedTexte.exposeDesMotifs = await (0, texte_1.parseExposeDesMotifsFromFile)(exposeDesMotifsFilePath);
40
+ }
41
+ fs_extra_1.default.writeJSONSync(path_1.default.join(transformedTexteDir, `${parsedFilePath.name}.json`), parsedTexte, { spaces: 2 });
42
+ }
43
+ }
44
+ main()
45
+ .then(() => process.exit(0))
46
+ .catch((error) => {
47
+ console.log(error);
48
+ process.exit(1);
49
+ });
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const command_line_args_1 = __importDefault(require("command-line-args"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const loaders_1 = require("../loaders");
11
+ const texte_1 = require("../model/texte");
12
+ const datautil_1 = require("./datautil");
13
+ const cli_helpers_1 = require("./shared/cli_helpers");
14
+ const util_1 = require("./shared/util");
15
+ const optionsDefinitions = [
16
+ ...cli_helpers_1.commonOptions,
17
+ {
18
+ help: "sessions of textes to retrieve; leave empty for all",
19
+ multiple: true,
20
+ name: "sessions",
21
+ type: String,
22
+ },
23
+ {
24
+ help: "parse and convert documents into JSON (textes only for now, requires format xml)",
25
+ name: "parseDocuments",
26
+ type: Boolean,
27
+ },
28
+ {
29
+ alias: "F",
30
+ help: "formats of documents to retrieve (xml/html/pdf for textes, html/pdf for rapports); leave empty for all",
31
+ multiple: true,
32
+ name: "formats",
33
+ type: String,
34
+ },
35
+ {
36
+ help: "types of documents to retrieve (textes/rapports); leave empty for all",
37
+ multiple: true,
38
+ name: "types",
39
+ type: String,
40
+ },
41
+ {
42
+ help: "force retrieve all documents, even already retrieved ones",
43
+ name: "force",
44
+ type: Boolean,
45
+ },
46
+ ];
47
+ const options = (0, command_line_args_1.default)(optionsDefinitions);
48
+ const textDecoder = new TextDecoder("utf8");
49
+ async function retrieveDocument(documentUrl) {
50
+ if (!options["silent"]) {
51
+ console.log(`Retrieving document ${documentUrl}…`);
52
+ }
53
+ try {
54
+ const response = await (0, util_1.fetchWithRetry)(documentUrl);
55
+ if (!response.ok) {
56
+ if (response.status === 404) {
57
+ console.warn(`Texte ${documentUrl} not found`);
58
+ }
59
+ else {
60
+ console.error(`An error occurred while retrieving texte ${documentUrl}: ${response.status}`);
61
+ }
62
+ return null;
63
+ }
64
+ return response.arrayBuffer();
65
+ }
66
+ catch (error) {
67
+ console.error(error.message);
68
+ return null;
69
+ }
70
+ }
71
+ async function retrieveTextes(dataDir) {
72
+ const textesDir = path_1.default.join(dataDir, loaders_1.TEXTE_FOLDER);
73
+ fs_extra_1.default.ensureDirSync(textesDir);
74
+ const originalTextesDir = path_1.default.join(textesDir, loaders_1.TEXTE_ORIGINAL_FOLDER);
75
+ const transformedTextesDir = path_1.default.join(textesDir, loaders_1.TEXTE_TRANSFORMED_FOLDER);
76
+ if (options["parseDocuments"]) {
77
+ (0, util_1.ensureAndClearDir)(transformedTextesDir);
78
+ }
79
+ let retrievedTextesCount = 0;
80
+ const texteUrlsNotFoundOrError = [];
81
+ const texteUrlsParseError = [];
82
+ for (const session of options["sessions"]) {
83
+ for (const { item: texteMetadata, } of (0, loaders_1.iterLoadSenatDossiersLegislatifsTexteUrls)(dataDir, session)) {
84
+ const texteDir = path_1.default.join(originalTextesDir, `${texteMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, texteMetadata.name);
85
+ fs_extra_1.default.ensureDirSync(texteDir);
86
+ let exposeDesMotifsContent = null;
87
+ if (texteMetadata.url_expose_des_motifs) {
88
+ if (!options["silent"]) {
89
+ console.log("Retrieving exposé des motifs…");
90
+ }
91
+ const exposeDesMotifsPath = path_1.default.join(texteDir, `${texteMetadata.name}-expose.html`);
92
+ exposeDesMotifsContent = await retrieveDocument(texteMetadata.url_expose_des_motifs.toString());
93
+ if (!exposeDesMotifsContent) {
94
+ continue;
95
+ }
96
+ fs_extra_1.default.writeFileSync(exposeDesMotifsPath, Buffer.from(exposeDesMotifsContent));
97
+ }
98
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "xml")) {
99
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.xml`);
100
+ let texteBuffer = null;
101
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
102
+ if (!options["silent"]) {
103
+ console.info(`Already retrieved texte ${textePath}…`);
104
+ }
105
+ }
106
+ else {
107
+ texteBuffer = await retrieveDocument(texteMetadata.url_xml.toString());
108
+ if (!texteBuffer) {
109
+ texteUrlsNotFoundOrError.push(texteMetadata.url_xml);
110
+ continue;
111
+ }
112
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
113
+ retrievedTextesCount++;
114
+ }
115
+ if (options["parseDocuments"]) {
116
+ if (!options["silent"]) {
117
+ console.log(`Parsing texte ${texteMetadata.name}.xml…`);
118
+ }
119
+ let parsedTexte = null;
120
+ if (texteBuffer) {
121
+ const texteXml = textDecoder.decode(texteBuffer);
122
+ parsedTexte = (0, texte_1.parseTexte)(texteXml);
123
+ }
124
+ else {
125
+ parsedTexte = await (0, texte_1.parseTexteFromFile)(textePath);
126
+ }
127
+ if (!parsedTexte) {
128
+ texteUrlsParseError.push(texteMetadata.url_xml);
129
+ continue;
130
+ }
131
+ if (exposeDesMotifsContent) {
132
+ if (!options["silent"]) {
133
+ console.log("Parsing exposé des motifs…");
134
+ }
135
+ const exposeDesMotifsHtml = textDecoder.decode(exposeDesMotifsContent);
136
+ parsedTexte.exposeDesMotifs =
137
+ (0, texte_1.parseExposeDesMotifs)(exposeDesMotifsHtml);
138
+ }
139
+ const transformedTexteDir = path_1.default.join(transformedTextesDir, `${texteMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, texteMetadata.name);
140
+ fs_extra_1.default.ensureDirSync(transformedTexteDir);
141
+ fs_extra_1.default.writeJSONSync(path_1.default.join(transformedTexteDir, `${texteMetadata.name}.json`), parsedTexte, { spaces: 2 });
142
+ }
143
+ }
144
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "html")) {
145
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.html`);
146
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
147
+ if (!options["silent"]) {
148
+ console.info(`Already retrieved texte ${textePath}…`);
149
+ }
150
+ }
151
+ else {
152
+ const texteBuffer = await retrieveDocument(texteMetadata.url_html.toString());
153
+ if (!texteBuffer) {
154
+ texteUrlsNotFoundOrError.push(texteMetadata.url_html);
155
+ continue;
156
+ }
157
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
158
+ retrievedTextesCount++;
159
+ }
160
+ }
161
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "pdf")) {
162
+ const textePath = path_1.default.join(texteDir, `${texteMetadata.name}.pdf`);
163
+ if (!options["force"] && fs_extra_1.default.existsSync(textePath)) {
164
+ if (!options["silent"]) {
165
+ console.info(`Already retrieved texte ${textePath}…`);
166
+ }
167
+ }
168
+ else {
169
+ const texteBuffer = await retrieveDocument(texteMetadata.url_pdf.toString());
170
+ if (!texteBuffer) {
171
+ texteUrlsNotFoundOrError.push(texteMetadata.url_pdf);
172
+ continue;
173
+ }
174
+ fs_extra_1.default.writeFileSync(textePath, Buffer.from(texteBuffer));
175
+ retrievedTextesCount++;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ if (options["verbose"]) {
181
+ console.log(`${retrievedTextesCount} textes retrieved`);
182
+ console.log(`${texteUrlsNotFoundOrError.length} textes failed to be retrieved with URLs ${texteUrlsNotFoundOrError.join(", ")}`);
183
+ if (options["parseDocuments"]) {
184
+ console.log(`${texteUrlsParseError.length} textes failed to be parsed with URLs ${texteUrlsParseError.join(", ")}`);
185
+ }
186
+ }
187
+ }
188
+ async function retrieveRapports(dataDir) {
189
+ const rapportsDir = path_1.default.join(dataDir, loaders_1.RAPPORT_FOLDER);
190
+ fs_extra_1.default.ensureDirSync(rapportsDir);
191
+ let retrievedRapportsCount = 0;
192
+ const rapportUrlsNotFoundOrError = [];
193
+ for (const session of options["sessions"]) {
194
+ for (const { item: rapportMetadata, } of (0, loaders_1.iterLoadSenatDossiersLegislatifsRapportUrls)(dataDir, session)) {
195
+ const rapportDir = path_1.default.join(rapportsDir, `${rapportMetadata.session ?? datautil_1.UNDEFINED_SESSION}`, rapportMetadata.name);
196
+ fs_extra_1.default.ensureDirSync(rapportDir);
197
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "html")) {
198
+ const rapportPath = path_1.default.join(rapportDir, `${rapportMetadata.name}.html`);
199
+ if (!options["force"] && fs_extra_1.default.existsSync(rapportPath)) {
200
+ if (!options["silent"]) {
201
+ console.info(`Already retrieved rapport ${rapportPath}…`);
202
+ }
203
+ continue;
204
+ }
205
+ const rapportBuffer = await retrieveDocument(rapportMetadata.url_html.toString());
206
+ if (!rapportBuffer) {
207
+ rapportUrlsNotFoundOrError.push(rapportMetadata.url_html);
208
+ continue;
209
+ }
210
+ fs_extra_1.default.writeFileSync(rapportPath, Buffer.from(rapportBuffer));
211
+ retrievedRapportsCount++;
212
+ }
213
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["formats"], "pdf")) {
214
+ const rapportPath = path_1.default.join(rapportDir, `${rapportMetadata.name}.pdf`);
215
+ if (!options["force"] && fs_extra_1.default.existsSync(rapportPath)) {
216
+ if (!options["silent"]) {
217
+ console.info(`Already retrieved rapport ${rapportPath}…`);
218
+ }
219
+ continue;
220
+ }
221
+ const rapportBuffer = await retrieveDocument(rapportMetadata.url_pdf.toString());
222
+ if (!rapportBuffer) {
223
+ rapportUrlsNotFoundOrError.push(rapportMetadata.url_pdf);
224
+ continue;
225
+ }
226
+ fs_extra_1.default.writeFileSync(rapportPath, Buffer.from(rapportBuffer));
227
+ retrievedRapportsCount++;
228
+ }
229
+ }
230
+ }
231
+ if (options["verbose"]) {
232
+ console.log(`${retrievedRapportsCount} rapports retrieved`);
233
+ console.log(`${rapportUrlsNotFoundOrError.length} rapports failed with URLs ${rapportUrlsNotFoundOrError.join(", ")}`);
234
+ }
235
+ }
236
+ async function main() {
237
+ const dataDir = options["dataDir"];
238
+ (0, assert_1.default)(dataDir, "Missing argument: data directory");
239
+ console.time("documents processing time");
240
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["types"], "textes")) {
241
+ await retrieveTextes(dataDir);
242
+ }
243
+ if ((0, util_1.isOptionEmptyOrHasValue)(options["types"], "rapports")) {
244
+ await retrieveRapports(dataDir);
245
+ }
246
+ if (!options["silent"]) {
247
+ console.timeEnd("documents processing time");
248
+ }
249
+ }
250
+ main()
251
+ .then(() => process.exit(0))
252
+ .catch((error) => {
253
+ console.log(error);
254
+ process.exit(1);
255
+ });