@tricoteuses/senat 1.1.2 → 1.3.1

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 (259) hide show
  1. package/README.md +53 -15
  2. package/lib/aggregates.d.ts +4 -6
  3. package/lib/aggregates.mjs +908 -780
  4. package/lib/aggregates.ts +8 -122
  5. package/lib/data/legislatures.json +38 -0
  6. package/lib/databases.d.ts +9 -0
  7. package/lib/databases.js +41 -11
  8. package/lib/databases.mjs +32 -1
  9. package/lib/databases.ts +40 -1
  10. package/lib/fields.mjs +64 -18
  11. package/lib/index.d.ts +5 -7
  12. package/lib/index.js +8 -112
  13. package/lib/index.mjs +4 -7
  14. package/lib/index.ts +9 -30
  15. package/lib/inserters.d.ts +0 -4
  16. package/lib/inserters.mjs +461 -337
  17. package/lib/inserters.ts +0 -24
  18. package/lib/legislatures.json +38 -0
  19. package/lib/loaders.d.ts +64 -0
  20. package/lib/loaders.js +682 -0
  21. package/lib/loaders.mjs +158 -0
  22. package/lib/loaders.ts +271 -0
  23. package/lib/model/ameli.d.ts +105 -4
  24. package/lib/model/ameli.js +20 -160
  25. package/lib/model/ameli.mjs +84 -57
  26. package/lib/model/ameli.ts +94 -80
  27. package/lib/model/debats.d.ts +0 -4
  28. package/lib/model/debats.js +1 -122
  29. package/lib/model/debats.mjs +1 -43
  30. package/lib/model/debats.ts +0 -68
  31. package/lib/model/dosleg.d.ts +227 -29
  32. package/lib/model/dosleg.js +92 -832
  33. package/lib/model/dosleg.mjs +196 -337
  34. package/lib/model/dosleg.ts +213 -531
  35. package/lib/model/index.d.ts +4 -5
  36. package/lib/model/index.js +14 -15
  37. package/lib/model/index.mjs +4 -5
  38. package/lib/model/index.ts +8 -5
  39. package/lib/model/questions.d.ts +88 -2
  40. package/lib/model/questions.js +40 -45
  41. package/lib/model/questions.mjs +71 -8
  42. package/lib/model/questions.ts +90 -11
  43. package/lib/model/sens.d.ts +524 -2
  44. package/lib/model/sens.js +172 -49
  45. package/lib/model/sens.mjs +415 -9
  46. package/lib/model/sens.ts +514 -16
  47. package/lib/model/texte.d.ts +7 -0
  48. package/lib/model/texte.js +321 -0
  49. package/lib/model/texte.mjs +208 -0
  50. package/lib/model/texte.ts +229 -0
  51. package/lib/model/util.d.ts +7 -1
  52. package/lib/model/util.js +37 -53
  53. package/lib/model/util.mjs +19 -10
  54. package/lib/model/util.ts +30 -14
  55. package/lib/raw_types/ameli.d.ts +912 -538
  56. package/lib/raw_types/ameli.js +1 -39
  57. package/lib/raw_types/ameli.mjs +4 -1
  58. package/lib/raw_types/ameli.ts +947 -597
  59. package/lib/raw_types/debats.d.ts +204 -124
  60. package/lib/raw_types/debats.js +1 -18
  61. package/lib/raw_types/debats.mjs +4 -1
  62. package/lib/raw_types/debats.ts +218 -141
  63. package/lib/raw_types/dosleg.d.ts +3533 -2024
  64. package/lib/raw_types/dosleg.js +1 -92
  65. package/lib/raw_types/dosleg.mjs +4 -1
  66. package/lib/raw_types/dosleg.ts +3621 -2189
  67. package/lib/raw_types/questions.d.ts +404 -220
  68. package/lib/raw_types/questions.js +1 -18
  69. package/lib/raw_types/questions.mjs +4 -1
  70. package/lib/raw_types/questions.ts +404 -226
  71. package/lib/raw_types/sens.d.ts +4391 -2706
  72. package/lib/raw_types/sens.js +1 -108
  73. package/lib/raw_types/sens.mjs +4 -1
  74. package/lib/raw_types/sens.ts +4495 -2903
  75. package/lib/raw_types_kysely/ameli.d.ts +6 -0
  76. package/lib/raw_types_kysely/ameli.mjs +7 -0
  77. package/lib/raw_types_kysely/ameli.ts +6 -0
  78. package/lib/raw_types_kysely/debats.d.ts +6 -0
  79. package/lib/raw_types_kysely/debats.mjs +7 -0
  80. package/lib/raw_types_kysely/debats.ts +6 -0
  81. package/lib/raw_types_kysely/dosleg.d.ts +6 -0
  82. package/lib/raw_types_kysely/dosleg.mjs +7 -0
  83. package/lib/raw_types_kysely/dosleg.ts +6 -0
  84. package/lib/raw_types_kysely/questions.d.ts +6 -0
  85. package/lib/raw_types_kysely/questions.mjs +7 -0
  86. package/lib/raw_types_kysely/questions.ts +6 -0
  87. package/lib/raw_types_kysely/sens.d.ts +6 -0
  88. package/lib/raw_types_kysely/sens.mjs +7 -0
  89. package/lib/raw_types_kysely/sens.ts +6 -0
  90. package/lib/raw_types_kysely/texte.d.ts +45 -0
  91. package/lib/raw_types_kysely/texte.mjs +7 -0
  92. package/lib/raw_types_kysely/texte.ts +53 -0
  93. package/lib/raw_types_schemats/ameli.d.ts +541 -0
  94. package/lib/raw_types_schemats/ameli.js +45 -0
  95. package/lib/raw_types_schemats/ameli.mjs +2 -0
  96. package/lib/raw_types_schemats/ameli.ts +601 -0
  97. package/lib/raw_types_schemats/debats.d.ts +127 -0
  98. package/lib/raw_types_schemats/debats.js +24 -0
  99. package/lib/raw_types_schemats/debats.mjs +2 -0
  100. package/lib/raw_types_schemats/debats.ts +145 -0
  101. package/lib/raw_types_schemats/dosleg.d.ts +2029 -0
  102. package/lib/raw_types_schemats/dosleg.js +98 -0
  103. package/lib/raw_types_schemats/dosleg.mjs +2 -0
  104. package/lib/raw_types_schemats/dosleg.ts +2195 -0
  105. package/lib/raw_types_schemats/questions.d.ts +233 -0
  106. package/lib/raw_types_schemats/questions.js +24 -0
  107. package/lib/raw_types_schemats/questions.mjs +2 -0
  108. package/lib/raw_types_schemats/questions.ts +251 -0
  109. package/lib/raw_types_schemats/sens.d.ts +2709 -0
  110. package/lib/raw_types_schemats/sens.js +114 -0
  111. package/lib/raw_types_schemats/sens.mjs +2 -0
  112. package/lib/raw_types_schemats/sens.ts +2907 -0
  113. package/lib/scripts/convert_data.js +574 -215
  114. package/lib/scripts/convert_data.mjs +134 -99
  115. package/lib/scripts/convert_data.ts +173 -112
  116. package/lib/scripts/datautil.d.ts +5 -0
  117. package/lib/scripts/datautil.js +64 -0
  118. package/lib/scripts/datautil.mjs +16 -0
  119. package/lib/scripts/datautil.ts +19 -0
  120. package/lib/scripts/parse_textes.js +132 -0
  121. package/lib/scripts/parse_textes.mjs +46 -0
  122. package/lib/scripts/parse_textes.ts +65 -0
  123. package/lib/scripts/retrieve_documents.d.ts +1 -0
  124. package/lib/scripts/retrieve_documents.js +521 -0
  125. package/lib/scripts/retrieve_documents.mjs +249 -0
  126. package/lib/scripts/retrieve_documents.ts +298 -0
  127. package/lib/scripts/retrieve_open_data.js +77 -69
  128. package/lib/scripts/retrieve_open_data.mjs +48 -49
  129. package/lib/scripts/retrieve_open_data.ts +74 -58
  130. package/lib/scripts/retrieve_senateurs_photos.js +45 -63
  131. package/lib/scripts/retrieve_senateurs_photos.mjs +4 -21
  132. package/lib/scripts/retrieve_senateurs_photos.ts +6 -29
  133. package/lib/scripts/retrieve_textes.mjs +325 -74
  134. package/lib/scripts/retrieve_textes.ts +111 -63
  135. package/lib/scripts/shared/cli_helpers.d.ts +44 -0
  136. package/lib/scripts/shared/cli_helpers.js +35 -0
  137. package/lib/scripts/shared/cli_helpers.ts +36 -0
  138. package/lib/scripts/shared/util.d.ts +3 -0
  139. package/lib/scripts/shared/util.js +102 -0
  140. package/lib/scripts/shared/util.ts +33 -0
  141. package/lib/src/aggregates.d.ts +52 -0
  142. package/lib/src/aggregates.mjs +726 -0
  143. package/lib/src/config.d.ts +2 -0
  144. package/lib/src/config.mjs +16 -0
  145. package/lib/src/databases.d.ts +18 -0
  146. package/lib/src/databases.mjs +55 -0
  147. package/lib/src/datasets.d.ts +28 -0
  148. package/lib/src/datasets.mjs +78 -0
  149. package/lib/src/fields.d.ts +10 -0
  150. package/lib/src/fields.mjs +22 -0
  151. package/lib/src/index.d.ts +8 -0
  152. package/lib/src/index.mjs +7 -0
  153. package/lib/src/inserters.d.ts +98 -0
  154. package/lib/src/inserters.mjs +360 -0
  155. package/lib/src/loaders.d.ts +36 -0
  156. package/lib/src/loaders.mjs +107 -0
  157. package/lib/src/model/ameli.d.ts +4 -0
  158. package/lib/src/model/ameli.js +57 -0
  159. package/lib/src/model/debats.d.ts +4 -0
  160. package/lib/src/model/debats.js +43 -0
  161. package/lib/src/model/dosleg.d.ts +197 -0
  162. package/lib/src/model/dosleg.js +169 -0
  163. package/lib/src/model/index.d.ts +4 -0
  164. package/lib/src/model/index.js +4 -0
  165. package/lib/src/model/questions.d.ts +89 -0
  166. package/lib/src/model/questions.js +76 -0
  167. package/lib/src/model/sens.d.ts +390 -0
  168. package/lib/src/model/sens.js +339 -0
  169. package/lib/src/model/texte.d.ts +7 -0
  170. package/lib/src/model/texte.js +183 -0
  171. package/lib/src/raw_types_kysely/ameli.d.ts +915 -0
  172. package/lib/src/raw_types_kysely/ameli.js +5 -0
  173. package/lib/src/raw_types_kysely/debats.d.ts +207 -0
  174. package/lib/src/raw_types_kysely/debats.js +5 -0
  175. package/lib/src/raw_types_kysely/dosleg.d.ts +3532 -0
  176. package/lib/src/raw_types_kysely/dosleg.js +5 -0
  177. package/lib/src/raw_types_kysely/questions.d.ts +414 -0
  178. package/lib/src/raw_types_kysely/questions.js +5 -0
  179. package/lib/src/raw_types_kysely/sens.d.ts +4394 -0
  180. package/lib/src/raw_types_kysely/sens.js +5 -0
  181. package/lib/src/raw_types_schemats/ameli.d.ts +541 -0
  182. package/lib/src/raw_types_schemats/ameli.js +2 -0
  183. package/lib/src/raw_types_schemats/debats.d.ts +127 -0
  184. package/lib/src/raw_types_schemats/debats.js +2 -0
  185. package/lib/src/raw_types_schemats/dosleg.d.ts +2027 -0
  186. package/lib/src/raw_types_schemats/dosleg.js +2 -0
  187. package/lib/src/raw_types_schemats/questions.d.ts +231 -0
  188. package/lib/src/raw_types_schemats/questions.js +2 -0
  189. package/lib/src/raw_types_schemats/sens.d.ts +2709 -0
  190. package/lib/src/raw_types_schemats/sens.js +2 -0
  191. package/lib/src/scripts/convert_data.d.ts +1 -0
  192. package/lib/src/scripts/convert_data.js +95 -0
  193. package/lib/src/scripts/datautil.d.ts +5 -0
  194. package/lib/src/scripts/datautil.js +16 -0
  195. package/lib/src/scripts/parse_textes.d.ts +1 -0
  196. package/lib/src/scripts/parse_textes.js +47 -0
  197. package/lib/src/scripts/retrieve_documents.d.ts +1 -0
  198. package/lib/src/scripts/retrieve_documents.js +258 -0
  199. package/lib/src/scripts/retrieve_open_data.d.ts +1 -0
  200. package/lib/src/scripts/retrieve_open_data.js +214 -0
  201. package/lib/src/scripts/retrieve_senateurs_photos.d.ts +1 -0
  202. package/lib/src/scripts/retrieve_senateurs_photos.js +147 -0
  203. package/lib/src/scripts/shared/cli_helpers.d.ts +44 -0
  204. package/lib/src/scripts/shared/cli_helpers.js +32 -0
  205. package/lib/src/scripts/shared/util.d.ts +3 -0
  206. package/lib/src/scripts/shared/util.js +28 -0
  207. package/lib/src/strings.d.ts +1 -0
  208. package/lib/src/strings.mjs +18 -0
  209. package/lib/src/types/ameli.d.ts +10 -0
  210. package/lib/src/types/ameli.js +13 -0
  211. package/lib/src/types/debats.d.ts +4 -0
  212. package/lib/src/types/debats.js +2 -0
  213. package/lib/src/types/dosleg.d.ts +98 -0
  214. package/lib/src/types/dosleg.js +151 -0
  215. package/lib/src/types/questions.d.ts +2 -0
  216. package/lib/src/types/questions.js +1 -0
  217. package/lib/src/types/sens.d.ts +10 -0
  218. package/lib/src/types/sens.js +1 -0
  219. package/lib/src/types/sessions.d.ts +42 -0
  220. package/lib/src/types/sessions.js +43 -0
  221. package/lib/src/types/texte.d.ts +61 -0
  222. package/lib/src/types/texte.js +16 -0
  223. package/lib/src/validators/config.d.ts +1 -0
  224. package/lib/src/validators/config.js +54 -0
  225. package/lib/src/validators/senat.d.ts +0 -0
  226. package/lib/src/validators/senat.js +24 -0
  227. package/lib/types/ameli.d.ts +1 -1
  228. package/lib/types/ameli.js +2 -2
  229. package/lib/types/ameli.ts +1 -1
  230. package/lib/types/debats.d.ts +1 -1
  231. package/lib/types/debats.js +2 -2
  232. package/lib/types/debats.ts +1 -1
  233. package/lib/types/dosleg.d.ts +2 -2
  234. package/lib/types/dosleg.js +2 -2
  235. package/lib/types/dosleg.ts +2 -2
  236. package/lib/types/questions.d.ts +1 -1
  237. package/lib/types/questions.js +2 -2
  238. package/lib/types/questions.ts +1 -1
  239. package/lib/types/sens.d.ts +1 -3
  240. package/lib/types/sens.js +2 -5
  241. package/lib/types/sens.mjs +1 -23
  242. package/lib/types/sens.ts +1 -25
  243. package/lib/types/sessions.d.ts +42 -0
  244. package/lib/types/sessions.js +51 -0
  245. package/lib/types/sessions.mjs +43 -0
  246. package/lib/types/sessions.ts +42 -0
  247. package/lib/types/texte.d.ts +65 -0
  248. package/lib/types/texte.js +24 -0
  249. package/lib/types/texte.mjs +16 -0
  250. package/lib/types/texte.ts +76 -0
  251. package/package.json +35 -10
  252. package/lib/aggregates.js +0 -1122
  253. package/lib/fields.js +0 -68
  254. package/lib/inserters.js +0 -518
  255. package/lib/scripts/fix_db.js +0 -144
  256. package/lib/scripts/fix_db.mjs +0 -64
  257. package/lib/scripts/fix_db.ts +0 -75
  258. package/lib/scripts/retrieve_textes.js +0 -179
  259. /package/lib/scripts/{fix_db.d.ts → parse_textes.d.ts} +0 -0
@@ -1,90 +1,138 @@
1
1
  import assert from "assert"
2
2
  import commandLineArgs from "command-line-args"
3
- import fetch from "cross-fetch"
4
3
  import fs from "fs-extra"
5
4
  import path from "path"
6
5
 
7
- import { Texte, texteFieldsToParseInt, texteFieldsToTrim } from "../types/dosleg"
8
- import { checkDatabase } from "../databases"
9
- import { parseIntFields, trimFieldsRight } from "../fields"
6
+ import { findSenatRapportUrls, findSenatTexteUrls } from "../model/dosleg"
7
+ import { UNDEFINED_SESSION } from "./datautil"
8
+ import { commonOptions } from "./shared/cli_helpers"
9
+ import { ensureAndClearDir, fetchWithRetry } from "./shared/util"
10
10
 
11
11
  const optionsDefinitions = [
12
+ ...commonOptions,
12
13
  {
13
- alias: "s",
14
- help: "don't log anything",
15
- name: "silent",
16
- type: Boolean,
14
+ help: "sessions of texts to retrieve; leave empty for all",
15
+ multiple: true,
16
+ name: "sessions",
17
+ type: String,
17
18
  },
18
19
  {
19
- alias: "v",
20
- help: "verbose logs",
21
- name: "verbose",
20
+ help: "parse and convert documents into JSON (textes only for now)",
21
+ name: "parseDocuments",
22
22
  type: Boolean,
23
23
  },
24
- {
25
- defaultOption: true,
26
- help: "directory containing Sénat open data files",
27
- name: "dataDir",
28
- type: String,
29
- },
30
24
  ]
31
25
  const options = commandLineArgs(optionsDefinitions)
32
26
 
33
- async function main() {
34
- const dataDir = options.dataDir
35
- assert(dataDir, "Missing argument: data directory")
27
+ const SENAT_TEXTE_BASE_URL = "https://www.senat.fr/akomantoso/"
28
+ const SENAT_RAPPORT_BASE_URL = "https://www.senat.fr/rap/"
36
29
 
37
- const db = await checkDatabase("dosleg")
30
+ async function retrieveDocument (documentUrl: string) {
31
+ if (!options.silent) {
32
+ console.log(`Retrieving document ${documentUrl}…`)
33
+ }
38
34
 
39
- const legDir = path.join(dataDir, "leg")
40
- fs.ensureDirSync(legDir)
41
- const textes: Texte[] = (
42
- await db.any(
43
- `
44
- SELECT *
45
- FROM texte
46
- `,
47
- )
48
- ).map((texte: Texte) =>
49
- parseIntFields(
50
- texteFieldsToParseInt,
51
- trimFieldsRight(texteFieldsToTrim, texte),
52
- ),
53
- )
54
- for (const texte of textes) {
55
- if (texte.texurl === null) {
56
- continue
57
- }
58
- if (texte.typurl !== "I") {
59
- // This is not an "I"nternal URL.
60
- continue
61
- }
62
- if (texte.texurl.endsWith(".pdf")) {
63
- continue
64
- }
65
- const url = new URL(texte.texurl, "http://www.senat.fr/leg/").toString()
66
- if (!options.silent) {
67
- console.log(`Retrieving page ${url}…`)
68
- }
69
- const response = await fetch(url)
70
- const page = await response.text()
35
+ try {
36
+ const response = await fetchWithRetry(documentUrl)
71
37
  if (!response.ok) {
72
38
  if (response.status === 404) {
73
- console.log(`Page ${url} not found`)
39
+ console.warn(`Texte ${documentUrl} not found`)
74
40
  } else {
75
- console.error(
76
- `An error occurred while retrieving page ${url}: ${response.status} ${response.statusText}\n${page}`,
77
- )
41
+ console.error(`An error occurred while retrieving texte ${documentUrl}: ${response.status}`)
78
42
  }
79
- continue
43
+ return null
80
44
  }
81
- const pathParsed = path.parse(
82
- path.join(legDir, ...texte.texurl.split("/").filter(Boolean)),
45
+ return await response.text()
46
+ } catch (error: any) {
47
+ console.error(error.message)
48
+ return null
49
+ }
50
+ }
51
+
52
+ async function retrieveTextes (dataDir: string) {
53
+ const textesDir = path.join(dataDir, "leg")
54
+ fs.ensureDirSync(textesDir)
55
+
56
+ let retrievedTextesCount = 0
57
+ const texteUrlsNotFoundOrError = []
58
+
59
+ for await (const texte of findSenatTexteUrls(options.sessions)) {
60
+ const texteName = path.parse(texte.url).name
61
+ const texteXmlUrl = `${texteName}.akn.xml`
62
+ const texteXmlAbsoluteUrl = new URL(texteXmlUrl, SENAT_TEXTE_BASE_URL).toString()
63
+
64
+ const texteXml = await retrieveDocument(texteXmlAbsoluteUrl)
65
+
66
+ if (texteXml) {
67
+ if (options.parseDocuments) {
68
+ //const parsedTexte = await parseTexte(texteXml)
69
+ }
70
+
71
+ const texteDir = path.join(textesDir, `${texte.session ?? UNDEFINED_SESSION}`, texteName)
72
+ ensureAndClearDir(texteDir)
73
+ fs.writeFileSync(path.join(texteDir, texteXmlUrl), texteXml)
74
+ retrievedTextesCount++
75
+ } else {
76
+ texteUrlsNotFoundOrError.push(texteXmlAbsoluteUrl)
77
+ }
78
+ }
79
+
80
+ if (options.verbose) {
81
+ console.log(`${retrievedTextesCount} textes retrieved`)
82
+ console.log(
83
+ `${texteUrlsNotFoundOrError.length} textes failed with URLs ${texteUrlsNotFoundOrError.join(", ")}`
83
84
  )
84
- const pageDir = path.join(pathParsed.dir, pathParsed.name)
85
- fs.ensureDirSync(pageDir)
86
- fs.writeFileSync(path.join(pageDir, "index" + pathParsed.ext), page)
87
85
  }
86
+ // TODO retrieve other formats (html/pdf) ?
87
+ }
88
+
89
+ async function retrieveRapports (dataDir: string) {
90
+ const rapportsDir = path.join(dataDir, "rap")
91
+ fs.ensureDirSync(rapportsDir)
92
+
93
+ let retrievedRapportsCount = 0
94
+ const rapportUrlsNotFoundOrError = []
95
+
96
+ for await (const rapport of findSenatRapportUrls(options.sessions)) {
97
+ let rapportUrl = rapport.url
98
+ const parsedRapportUrl = path.parse(rapport.url)
99
+ let rapportUrlBase = parsedRapportUrl.base
100
+ const rapportName = parsedRapportUrl.name
101
+ if (parsedRapportUrl.ext === ".html") {
102
+ rapportUrlBase = `${rapportName}_mono.html`
103
+ rapportUrl = path.format({
104
+ dir: parsedRapportUrl.dir,
105
+ base: rapportUrlBase,
106
+ })
107
+ }
108
+ const rapportAbsoluteUrl = new URL(rapportUrl, SENAT_RAPPORT_BASE_URL).toString()
109
+
110
+ const rapportContent = await retrieveDocument(rapportAbsoluteUrl)
111
+
112
+ if (rapportContent) {
113
+ const rapportDir = path.join(rapportsDir, `${rapport.session ?? UNDEFINED_SESSION}`, rapportName)
114
+ ensureAndClearDir(rapportDir)
115
+ fs.writeFileSync(path.join(rapportDir, rapportUrlBase), rapportContent)
116
+ retrievedRapportsCount++
117
+ } else {
118
+ rapportUrlsNotFoundOrError.push(rapportAbsoluteUrl)
119
+ }
120
+ }
121
+
122
+ if (options.verbose) {
123
+ console.log(`${retrievedRapportsCount} rapports retrieved`)
124
+ console.log(
125
+ `${rapportUrlsNotFoundOrError.length} rapports failed with URLs ${rapportUrlsNotFoundOrError.join(", ")}`
126
+ )
127
+ }
128
+ }
129
+
130
+ async function main() {
131
+ const dataDir = options.dataDir
132
+ assert(dataDir, "Missing argument: data directory")
133
+
134
+ await retrieveTextes(dataDir)
135
+ await retrieveRapports(dataDir)
88
136
  }
89
137
 
90
138
  main()
@@ -0,0 +1,44 @@
1
+ export declare const categoriesOption: {
2
+ alias: string;
3
+ defaultValue: string[];
4
+ help: string;
5
+ multiple: boolean;
6
+ name: string;
7
+ type: StringConstructor;
8
+ };
9
+ export declare const dataDirDefaultOption: {
10
+ defaultOption: boolean;
11
+ help: string;
12
+ name: string;
13
+ type: StringConstructor;
14
+ };
15
+ export declare const silentOption: {
16
+ alias: string;
17
+ help: string;
18
+ name: string;
19
+ type: BooleanConstructor;
20
+ };
21
+ export declare const verboseOption: {
22
+ alias: string;
23
+ help: string;
24
+ name: string;
25
+ type: BooleanConstructor;
26
+ };
27
+ export declare const commonOptions: ({
28
+ alias: string;
29
+ defaultValue: string[];
30
+ help: string;
31
+ multiple: boolean;
32
+ name: string;
33
+ type: StringConstructor;
34
+ } | {
35
+ defaultOption: boolean;
36
+ help: string;
37
+ name: string;
38
+ type: StringConstructor;
39
+ } | {
40
+ alias: string;
41
+ help: string;
42
+ name: string;
43
+ type: BooleanConstructor;
44
+ })[];
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.define-property.js");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.verboseOption = exports.silentOption = exports.dataDirDefaultOption = exports.commonOptions = exports.categoriesOption = void 0;
8
+ var categoriesOption = exports.categoriesOption = {
9
+ alias: "k",
10
+ defaultValue: ["All"],
11
+ help: "categories of datasets to reorganize",
12
+ multiple: true,
13
+ name: "categories",
14
+ type: String
15
+ };
16
+ var dataDirDefaultOption = exports.dataDirDefaultOption = {
17
+ defaultOption: true,
18
+ help: "directory containing Sénat open data files",
19
+ name: "dataDir",
20
+ type: String
21
+ };
22
+ var silentOption = exports.silentOption = {
23
+ alias: "s",
24
+ help: "don't log anything",
25
+ name: "silent",
26
+ type: Boolean
27
+ };
28
+ var verboseOption = exports.verboseOption = {
29
+ alias: "v",
30
+ help: "verbose logs",
31
+ name: "verbose",
32
+ type: Boolean
33
+ };
34
+ var commonOptions = exports.commonOptions = [categoriesOption, dataDirDefaultOption, silentOption, verboseOption];
35
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYXRlZ29yaWVzT3B0aW9uIiwiZXhwb3J0cyIsImFsaWFzIiwiZGVmYXVsdFZhbHVlIiwiaGVscCIsIm11bHRpcGxlIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImRlZmF1bHRPcHRpb24iLCJzaWxlbnRPcHRpb24iLCJCb29sZWFuIiwidmVyYm9zZU9wdGlvbiIsImNvbW1vbk9wdGlvbnMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zaGFyZWQvY2xpX2hlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNhdGVnb3JpZXNPcHRpb24gPSB7XG4gIGFsaWFzOiBcImtcIixcbiAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gIGhlbHA6IFwiY2F0ZWdvcmllcyBvZiBkYXRhc2V0cyB0byByZW9yZ2FuaXplXCIsXG4gIG11bHRpcGxlOiB0cnVlLFxuICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgdHlwZTogU3RyaW5nLFxufVxuXG5leHBvcnQgY29uc3QgZGF0YURpckRlZmF1bHRPcHRpb24gPSB7XG4gIGRlZmF1bHRPcHRpb246IHRydWUsXG4gIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgU8OpbmF0IG9wZW4gZGF0YSBmaWxlc1wiLFxuICBuYW1lOiBcImRhdGFEaXJcIixcbiAgdHlwZTogU3RyaW5nLFxufVxuXG5leHBvcnQgY29uc3Qgc2lsZW50T3B0aW9uID0ge1xuICBhbGlhczogXCJzXCIsXG4gIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gIG5hbWU6IFwic2lsZW50XCIsXG4gIHR5cGU6IEJvb2xlYW4sXG59XG5cbmV4cG9ydCBjb25zdCB2ZXJib3NlT3B0aW9uID0ge1xuICBhbGlhczogXCJ2XCIsXG4gIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gIG5hbWU6IFwidmVyYm9zZVwiLFxuICB0eXBlOiBCb29sZWFuLFxufVxuXG5leHBvcnQgY29uc3QgY29tbW9uT3B0aW9ucyA9IFtcbiAgY2F0ZWdvcmllc09wdGlvbixcbiAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gIHNpbGVudE9wdGlvbixcbiAgdmVyYm9zZU9wdGlvbixcbl1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFPLElBQU1BLGdCQUFnQixHQUFBQyxPQUFBLENBQUFELGdCQUFBLEdBQUc7RUFDOUJFLEtBQUssRUFBRSxHQUFHO0VBQ1ZDLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztFQUNyQkMsSUFBSSxFQUFFLHNDQUFzQztFQUM1Q0MsUUFBUSxFQUFFLElBQUk7RUFDZEMsSUFBSSxFQUFFLFlBQVk7RUFDbEJDLElBQUksRUFBRUM7QUFDUixDQUFDO0FBRU0sSUFBTUMsb0JBQW9CLEdBQUFSLE9BQUEsQ0FBQVEsb0JBQUEsR0FBRztFQUNsQ0MsYUFBYSxFQUFFLElBQUk7RUFDbkJOLElBQUksRUFBRSw0Q0FBNEM7RUFDbERFLElBQUksRUFBRSxTQUFTO0VBQ2ZDLElBQUksRUFBRUM7QUFDUixDQUFDO0FBRU0sSUFBTUcsWUFBWSxHQUFBVixPQUFBLENBQUFVLFlBQUEsR0FBRztFQUMxQlQsS0FBSyxFQUFFLEdBQUc7RUFDVkUsSUFBSSxFQUFFLG9CQUFvQjtFQUMxQkUsSUFBSSxFQUFFLFFBQVE7RUFDZEMsSUFBSSxFQUFFSztBQUNSLENBQUM7QUFFTSxJQUFNQyxhQUFhLEdBQUFaLE9BQUEsQ0FBQVksYUFBQSxHQUFHO0VBQzNCWCxLQUFLLEVBQUUsR0FBRztFQUNWRSxJQUFJLEVBQUUsY0FBYztFQUNwQkUsSUFBSSxFQUFFLFNBQVM7RUFDZkMsSUFBSSxFQUFFSztBQUNSLENBQUM7QUFFTSxJQUFNRSxhQUFhLEdBQUFiLE9BQUEsQ0FBQWEsYUFBQSxHQUFHLENBQzNCZCxnQkFBZ0IsRUFDaEJTLG9CQUFvQixFQUNwQkUsWUFBWSxFQUNaRSxhQUFhLENBQ2QiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,36 @@
1
+ export const categoriesOption = {
2
+ alias: "k",
3
+ defaultValue: ["All"],
4
+ help: "categories of datasets to reorganize",
5
+ multiple: true,
6
+ name: "categories",
7
+ type: String,
8
+ }
9
+
10
+ export const dataDirDefaultOption = {
11
+ defaultOption: true,
12
+ help: "directory containing Sénat open data files",
13
+ name: "dataDir",
14
+ type: String,
15
+ }
16
+
17
+ export const silentOption = {
18
+ alias: "s",
19
+ help: "don't log anything",
20
+ name: "silent",
21
+ type: Boolean,
22
+ }
23
+
24
+ export const verboseOption = {
25
+ alias: "v",
26
+ help: "verbose logs",
27
+ name: "verbose",
28
+ type: Boolean,
29
+ }
30
+
31
+ export const commonOptions = [
32
+ categoriesOption,
33
+ dataDirDefaultOption,
34
+ silentOption,
35
+ verboseOption,
36
+ ]
@@ -0,0 +1,3 @@
1
+ export declare function isOptionEmptyOrHasValue(option: string, value: string): boolean;
2
+ export declare function ensureAndClearDir(path: string): void;
3
+ export declare function fetchWithRetry(url: string, retries?: number, backoff?: number): Promise<Response>;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ require("core-js/modules/es.symbol.js");
5
+ require("core-js/modules/es.symbol.description.js");
6
+ require("core-js/modules/es.symbol.iterator.js");
7
+ require("core-js/modules/es.array.for-each.js");
8
+ require("core-js/modules/es.array.iterator.js");
9
+ require("core-js/modules/es.array.slice.js");
10
+ require("core-js/modules/es.function.name.js");
11
+ require("core-js/modules/es.object.create.js");
12
+ require("core-js/modules/es.object.define-property.js");
13
+ require("core-js/modules/es.object.get-prototype-of.js");
14
+ require("core-js/modules/es.object.set-prototype-of.js");
15
+ require("core-js/modules/es.string.iterator.js");
16
+ require("core-js/modules/web.dom-collections.for-each.js");
17
+ require("core-js/modules/web.dom-collections.iterator.js");
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: true
20
+ });
21
+ exports.ensureAndClearDir = ensureAndClearDir;
22
+ exports.fetchWithRetry = fetchWithRetry;
23
+ exports.isOptionEmptyOrHasValue = isOptionEmptyOrHasValue;
24
+ require("core-js/modules/es.array.concat.js");
25
+ require("core-js/modules/es.array.includes.js");
26
+ require("core-js/modules/es.object.to-string.js");
27
+ require("core-js/modules/es.promise.js");
28
+ require("core-js/modules/es.string.includes.js");
29
+ require("core-js/modules/web.timers.js");
30
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
31
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
32
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { Object.defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); function g(t) { ["next", "throw", "return"].forEach(function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), c(GeneratorFunctionPrototype, u, GeneratorFunction.displayName = "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
33
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
34
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
35
+ function isOptionEmptyOrHasValue(option, value) {
36
+ return !option || option.length === 0 || option.includes(value);
37
+ }
38
+ function ensureAndClearDir(path) {
39
+ if (!_fsExtra["default"].existsSync(path)) {
40
+ _fsExtra["default"].mkdirSync(path, {
41
+ recursive: true
42
+ });
43
+ } else {
44
+ _fsExtra["default"].emptyDirSync(path);
45
+ }
46
+ }
47
+ function fetchWithRetry(_x) {
48
+ return _fetchWithRetry.apply(this, arguments);
49
+ }
50
+ function _fetchWithRetry() {
51
+ _fetchWithRetry = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(url) {
52
+ var retries,
53
+ backoff,
54
+ attempt,
55
+ _args = arguments;
56
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
57
+ while (1) switch (_context.prev = _context.next) {
58
+ case 0:
59
+ retries = _args.length > 1 && _args[1] !== undefined ? _args[1] : 3;
60
+ backoff = _args.length > 2 && _args[2] !== undefined ? _args[2] : 300;
61
+ attempt = 0;
62
+ case 3:
63
+ if (!(attempt < retries)) {
64
+ _context.next = 21;
65
+ break;
66
+ }
67
+ _context.prev = 4;
68
+ _context.next = 7;
69
+ return fetch(url);
70
+ case 7:
71
+ return _context.abrupt("return", _context.sent);
72
+ case 10:
73
+ _context.prev = 10;
74
+ _context.t0 = _context["catch"](4);
75
+ if (!(attempt === retries - 1)) {
76
+ _context.next = 14;
77
+ break;
78
+ }
79
+ throw _context.t0;
80
+ case 14:
81
+ console.warn("Fetch attempt ".concat(attempt + 1, " for ").concat(url, " failed. Retrying in ").concat(backoff, "ms\u2026"));
82
+ _context.next = 17;
83
+ return new Promise(function (resolve) {
84
+ return setTimeout(resolve, backoff);
85
+ });
86
+ case 17:
87
+ backoff *= 2;
88
+ case 18:
89
+ attempt++;
90
+ _context.next = 3;
91
+ break;
92
+ case 21:
93
+ throw new Error("Failed to fetch ".concat(url, " after ").concat(retries, " attempts"));
94
+ case 22:
95
+ case "end":
96
+ return _context.stop();
97
+ }
98
+ }, _callee, null, [[4, 10]]);
99
+ }));
100
+ return _fetchWithRetry.apply(this, arguments);
101
+ }
102
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZnNFeHRyYSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiciIsInQiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiU3ltYm9sIiwiaSIsIml0ZXJhdG9yIiwiYSIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJjIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImgiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJhcmciLCJkZWxlZ2F0ZSIsImQiLCJmIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJzIiwidHlwZSIsIkNvbnRleHQiLCJjYWxsIiwid3JhcCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJsIiwicCIsImdldFByb3RvdHlwZU9mIiwieSIsIngiLCJ2IiwiZyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJUeXBlRXJyb3IiLCJuZXh0IiwidyIsInRyeUVudHJpZXMiLCJwdXNoIiwibSIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJ1bnNoaWZ0IiwicG9wIiwidmFsdWVzIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZSIsIm9wdGlvbiIsImluY2x1ZGVzIiwiZW5zdXJlQW5kQ2xlYXJEaXIiLCJwYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwiZW1wdHlEaXJTeW5jIiwiZmV0Y2hXaXRoUmV0cnkiLCJfeCIsIl9mZXRjaFdpdGhSZXRyeSIsIl9jYWxsZWUiLCJ1cmwiLCJyZXRyaWVzIiwiYmFja29mZiIsImF0dGVtcHQiLCJfYXJncyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJ1bmRlZmluZWQiLCJmZXRjaCIsInQwIiwiY29uc29sZSIsIndhcm4iLCJjb25jYXQiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvc2hhcmVkL3V0aWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGlvbkVtcHR5T3JIYXNWYWx1ZSAob3B0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuICFvcHRpb24gfHwgb3B0aW9uLmxlbmd0aCA9PT0gMCB8fCBvcHRpb24uaW5jbHVkZXModmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVBbmRDbGVhckRpciAocGF0aDogc3RyaW5nKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoKSkge1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9IGVsc2Uge1xuICAgIGZzLmVtcHR5RGlyU3luYyhwYXRoKVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhSZXRyeSAoXG4gIHVybDogc3RyaW5nLFxuICByZXRyaWVzOiBudW1iZXIgPSAzLFxuICBiYWNrb2ZmOiBudW1iZXIgPSAzMDAsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaCh1cmwpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzIC0gMSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKGBGZXRjaCBhdHRlbXB0ICR7YXR0ZW1wdCArIDF9IGZvciAke3VybH0gZmFpbGVkLiBSZXRyeWluZyBpbiAke2JhY2tvZmZ9bXPigKZgKVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYmFja29mZikpXG4gICAgICBiYWNrb2ZmICo9IDJcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9IGFmdGVyICR7cmV0cmllc30gYXR0ZW1wdHNgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUF5QixTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLGdCQUFBQSxDQUFBO0FBQUEsU0FBQUUsb0JBQUEsa0JBQ3pCLG1LQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxDQUFBLFNBQUFDLENBQUEsRUFBQUQsQ0FBQSxPQUFBSCxDQUFBLEdBQUFLLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxDQUFBLEdBQUFQLENBQUEsQ0FBQVEsY0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JB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
@@ -0,0 +1,33 @@
1
+ import fs from "fs-extra"
2
+
3
+ export function isOptionEmptyOrHasValue (option: string, value: string) {
4
+ return !option || option.length === 0 || option.includes(value)
5
+ }
6
+
7
+ export function ensureAndClearDir (path: string) {
8
+ if (!fs.existsSync(path)) {
9
+ fs.mkdirSync(path, { recursive: true })
10
+ } else {
11
+ fs.emptyDirSync(path)
12
+ }
13
+ }
14
+
15
+ export async function fetchWithRetry (
16
+ url: string,
17
+ retries: number = 3,
18
+ backoff: number = 300,
19
+ ): Promise<Response> {
20
+ for (let attempt = 0; attempt < retries; attempt++) {
21
+ try {
22
+ return await fetch(url)
23
+ } catch (error) {
24
+ if (attempt === retries - 1) {
25
+ throw error
26
+ }
27
+ console.warn(`Fetch attempt ${attempt + 1} for ${url} failed. Retrying in ${backoff}ms…`)
28
+ await new Promise((resolve) => setTimeout(resolve, backoff))
29
+ backoff *= 2
30
+ }
31
+ }
32
+ throw new Error(`Failed to fetch ${url} after ${retries} attempts`)
33
+ }
@@ -0,0 +1,52 @@
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
+ }