@tricoteuses/senat 2.8.1 → 2.8.5

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 (116) hide show
  1. package/lib/aggregates.d.ts +52 -0
  2. package/lib/aggregates.js +949 -0
  3. package/lib/aggregates.mjs +726 -0
  4. package/lib/aggregates.ts +852 -0
  5. package/lib/config.mjs +16 -0
  6. package/lib/config.ts +26 -0
  7. package/lib/databases.mjs +55 -0
  8. package/lib/databases.ts +68 -0
  9. package/lib/datasets.mjs +78 -0
  10. package/lib/datasets.ts +118 -0
  11. package/lib/fields.d.ts +10 -0
  12. package/lib/fields.js +68 -0
  13. package/lib/fields.mjs +22 -0
  14. package/lib/fields.ts +29 -0
  15. package/lib/index.mjs +7 -0
  16. package/lib/index.ts +64 -0
  17. package/lib/inserters.d.ts +98 -0
  18. package/lib/inserters.js +500 -0
  19. package/lib/inserters.mjs +360 -0
  20. package/lib/inserters.ts +521 -0
  21. package/lib/loaders.mjs +97 -0
  22. package/lib/loaders.ts +173 -0
  23. package/lib/model/ameli.mjs +57 -0
  24. package/lib/model/ameli.ts +86 -0
  25. package/lib/model/debats.mjs +43 -0
  26. package/lib/model/debats.ts +68 -0
  27. package/lib/model/dosleg.mjs +163 -0
  28. package/lib/model/dosleg.ts +204 -0
  29. package/lib/model/index.mjs +4 -0
  30. package/lib/model/index.ts +13 -0
  31. package/lib/model/questions.d.ts +0 -20
  32. package/lib/model/questions.js +1 -32
  33. package/lib/model/questions.mjs +76 -0
  34. package/lib/model/questions.ts +102 -0
  35. package/lib/model/sens.mjs +339 -0
  36. package/lib/model/sens.ts +432 -0
  37. package/lib/model/texte.mjs +156 -0
  38. package/lib/model/texte.ts +174 -0
  39. package/lib/raw_types/ameli.d.ts +20 -0
  40. package/lib/raw_types/questions.d.ts +4 -70
  41. package/lib/raw_types_kysely/ameli.d.ts +915 -0
  42. package/lib/raw_types_kysely/ameli.js +7 -0
  43. package/lib/raw_types_kysely/ameli.mjs +5 -0
  44. package/lib/raw_types_kysely/ameli.ts +951 -0
  45. package/lib/raw_types_kysely/debats.d.ts +207 -0
  46. package/lib/raw_types_kysely/debats.js +7 -0
  47. package/lib/raw_types_kysely/debats.mjs +5 -0
  48. package/lib/raw_types_kysely/debats.ts +222 -0
  49. package/lib/raw_types_kysely/dosleg.d.ts +3532 -0
  50. package/lib/raw_types_kysely/dosleg.js +7 -0
  51. package/lib/raw_types_kysely/dosleg.mjs +5 -0
  52. package/lib/raw_types_kysely/dosleg.ts +3621 -0
  53. package/lib/raw_types_kysely/questions.d.ts +414 -0
  54. package/lib/raw_types_kysely/questions.js +7 -0
  55. package/lib/raw_types_kysely/questions.mjs +5 -0
  56. package/lib/raw_types_kysely/questions.ts +426 -0
  57. package/lib/raw_types_kysely/sens.d.ts +4394 -0
  58. package/lib/raw_types_kysely/sens.js +7 -0
  59. package/lib/raw_types_kysely/sens.mjs +5 -0
  60. package/lib/raw_types_kysely/sens.ts +4499 -0
  61. package/lib/raw_types_schemats/ameli.mjs +2 -0
  62. package/lib/raw_types_schemats/ameli.ts +601 -0
  63. package/lib/raw_types_schemats/debats.mjs +2 -0
  64. package/lib/raw_types_schemats/debats.ts +145 -0
  65. package/lib/raw_types_schemats/dosleg.mjs +2 -0
  66. package/lib/raw_types_schemats/dosleg.ts +2193 -0
  67. package/lib/raw_types_schemats/questions.mjs +2 -0
  68. package/lib/raw_types_schemats/questions.ts +249 -0
  69. package/lib/raw_types_schemats/sens.mjs +2 -0
  70. package/lib/raw_types_schemats/sens.ts +2907 -0
  71. package/lib/scripts/convert_data.mjs +95 -0
  72. package/lib/scripts/convert_data.ts +119 -0
  73. package/lib/scripts/data-download.d.ts +1 -0
  74. package/lib/scripts/data-download.js +9 -0
  75. package/lib/scripts/datautil.mjs +16 -0
  76. package/lib/scripts/datautil.ts +19 -0
  77. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  78. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  79. package/lib/scripts/parse_textes.mjs +38 -0
  80. package/lib/scripts/parse_textes.ts +52 -0
  81. package/lib/scripts/retrieve_documents.mjs +243 -0
  82. package/lib/scripts/retrieve_documents.ts +279 -0
  83. package/lib/scripts/retrieve_open_data.js +11 -9
  84. package/lib/scripts/retrieve_open_data.mjs +214 -0
  85. package/lib/scripts/retrieve_open_data.ts +261 -0
  86. package/lib/scripts/retrieve_senateurs_photos.mjs +147 -0
  87. package/lib/scripts/retrieve_senateurs_photos.ts +177 -0
  88. package/lib/scripts/retrieve_textes.d.ts +1 -0
  89. package/lib/scripts/retrieve_textes.mjs +165 -0
  90. package/lib/scripts/retrieve_textes.ts +79 -0
  91. package/lib/scripts/shared/cli_helpers.ts +36 -0
  92. package/lib/scripts/shared/util.ts +33 -0
  93. package/lib/strings.mjs +18 -0
  94. package/lib/strings.ts +26 -0
  95. package/lib/types/ameli.mjs +13 -0
  96. package/lib/types/ameli.ts +21 -0
  97. package/lib/types/debats.mjs +2 -0
  98. package/lib/types/debats.ts +6 -0
  99. package/lib/types/dosleg.mjs +151 -0
  100. package/lib/types/dosleg.ts +284 -0
  101. package/lib/types/questions.mjs +1 -0
  102. package/lib/types/questions.ts +3 -0
  103. package/lib/types/sens.mjs +1 -0
  104. package/lib/types/sens.ts +12 -0
  105. package/lib/types/sessions.mjs +43 -0
  106. package/lib/types/sessions.ts +42 -0
  107. package/lib/types/texte.mjs +16 -0
  108. package/lib/types/texte.ts +66 -0
  109. package/lib/typings/windows-1252.d.js +2 -0
  110. package/lib/typings/windows-1252.d.mjs +2 -0
  111. package/lib/typings/windows-1252.d.ts +11 -0
  112. package/lib/validators/config.mjs +54 -0
  113. package/lib/validators/config.ts +79 -0
  114. package/lib/validators/senat.mjs +24 -0
  115. package/lib/validators/senat.ts +26 -0
  116. package/package.json +6 -4
@@ -0,0 +1,174 @@
1
+ import { JSDOM } from "jsdom"
2
+
3
+ import { AKN_WORKFLOW_IDENTIFICATION_STRUCTURE_REGEXP, AKN_IDENTIFICATION_STRUCTURE_REGEXP } from "../scripts/datautil"
4
+ import {
5
+ Alinea,
6
+ Article,
7
+ Division,
8
+ DivisionContent,
9
+ DivisionTag,
10
+ DivisionType,
11
+ FlatTexte, Step,
12
+ Version,
13
+ } from "../types/texte"
14
+
15
+ function buildWorklow (metaElement: HTMLMetaElement): Step[] {
16
+ const stepElements = metaElement.querySelectorAll("workflow step")
17
+ const steps: Step[] = []
18
+ for (const stepElement of stepElements) {
19
+ const identification = stepElement.getAttribute("href") ?? ""
20
+ const identificationParts = AKN_WORKFLOW_IDENTIFICATION_STRUCTURE_REGEXP.exec(identification)?.groups
21
+ steps.push({
22
+ eId: stepElement.getAttribute("eId")!,
23
+ date: stepElement.getAttribute("date") ? new Date(stepElement.getAttribute("date") ?? "") : null,
24
+ type: identificationParts?.type || null,
25
+ session: identificationParts?.session || null,
26
+ numero: identificationParts?.numTexte || null,
27
+ version: identificationParts?.version ? identificationParts.version as Version : null,
28
+ outcome: stepElement.getAttribute("outcome"),
29
+ })
30
+ }
31
+ return steps
32
+ }
33
+
34
+ function buildDivision (node: Node, index: number): Division {
35
+ const eId = (node as Element).getAttribute("eId")!
36
+ const tag = node.nodeName as DivisionTag
37
+ const level = DivisionType[tag]
38
+ const titleNode = (node as Element).querySelector("num")
39
+ const subtitleNode = (node as Element).querySelector("heading")
40
+ const headings: DivisionContent[] = [
41
+ ...(titleNode ? [{
42
+ text: titleNode.textContent?.trim() ?? null,
43
+ html: titleNode.innerHTML?.trim() ?? null,
44
+ }] : []),
45
+ ...(subtitleNode ? [{
46
+ text: subtitleNode.textContent?.trim() ?? null,
47
+ html: subtitleNode.innerHTML?.trim() ?? null,
48
+ }] : []),
49
+ ]
50
+ const division = {
51
+ index,
52
+ eId,
53
+ tag,
54
+ level,
55
+ headings,
56
+ }
57
+ if (tag === "article") {
58
+ (division as Article).alineas = []
59
+ }
60
+ return division
61
+ }
62
+
63
+ function buildAlinea (contentNode: Node, alineaNode: Node): Alinea {
64
+ const eId = (alineaNode as Element).getAttribute("eId")!
65
+ const heading = {
66
+ text: (alineaNode as Element).querySelector("num")?.textContent ?? null,
67
+ }
68
+ const pastille = (alineaNode as Element).getAttribute("data:pastille") ?? null
69
+ return {
70
+ eId,
71
+ heading,
72
+ text: (contentNode as Element).textContent?.trim() ?? null,
73
+ html: (contentNode as Element).innerHTML?.trim() ?? null,
74
+ pastille,
75
+ }
76
+ }
77
+
78
+ function buildEmptyArticle (index: number): Article {
79
+ return {
80
+ index: index,
81
+ eId: "",
82
+ tag: "article",
83
+ level: DivisionType["article"],
84
+ headings: [],
85
+ alineas: [],
86
+ }
87
+ }
88
+
89
+ function flattenTexte (texteContentRoot: Node): Division[] {
90
+ const divisions: Division[] = []
91
+ let divisionIndex = 0
92
+ const iter = (node: Node) => {
93
+ if (node.nodeName === "content") {
94
+ return
95
+ }
96
+ switch (node.nodeName) {
97
+ case "tome":
98
+ case "part":
99
+ case "book":
100
+ case "title":
101
+ case "subtitle":
102
+ case "chapter":
103
+ case "section":
104
+ case "subsection":
105
+ case "paragraph":
106
+ case "article":
107
+ divisions.push(buildDivision(node, divisionIndex++))
108
+ break
109
+ }
110
+ if (node.nodeName === "alinea") {
111
+ Array.from(node.childNodes)
112
+ // Find direct content children programmatically
113
+ // because `:scope` selector does not work
114
+ // https://github.com/jsdom/jsdom/issues/2998
115
+ .filter((alineaChildNode: Node) => alineaChildNode.nodeName === "content")
116
+ .forEach((alineaContentNode: Node) => {
117
+ // Hypothesis: alineas should always be enclosed in articles
118
+ let lastArticle = divisions.findLast(division => division.tag === "article") as Article
119
+ if (!lastArticle) {
120
+ lastArticle = buildEmptyArticle(divisionIndex++)
121
+ divisions.push(lastArticle)
122
+ }
123
+ lastArticle.alineas.push(buildAlinea(alineaContentNode, node))
124
+ })
125
+ }
126
+ if (node.hasChildNodes()) {
127
+ node.childNodes.forEach((childNode: Node) => iter(childNode))
128
+ }
129
+ }
130
+ iter(texteContentRoot)
131
+ return divisions
132
+ }
133
+
134
+ export function transformTexte (document: Document): FlatTexte | null {
135
+ let transformedTexte = null
136
+ const metaElement = document.querySelector("meta")
137
+ const identification = metaElement?.querySelector("FRBRExpression FRBRuri")?.getAttribute("value") ?? ""
138
+ const identificationParts = AKN_IDENTIFICATION_STRUCTURE_REGEXP.exec(identification)?.groups
139
+ const bodyElement = document.querySelector("body")
140
+ try {
141
+ transformedTexte = {
142
+ title: metaElement?.querySelector("FRBRalias[name='intitule-court']")
143
+ ?.getAttribute("value") || null,
144
+ signetDossierLegislatifSenat:
145
+ metaElement?.querySelector("FRBRalias[name='signet-dossier-legislatif-senat']")
146
+ ?.getAttribute("value") || null,
147
+ urlSenat: metaElement?.querySelector("FRBRalias[name='url-senat']")?.getAttribute("value") || null,
148
+ urlAssemblee: metaElement?.querySelector("FRBRalias[name='url-AN']")?.getAttribute("value") || null,
149
+ type: identificationParts?.type || null,
150
+ session: identificationParts?.session || null,
151
+ numero: identificationParts?.numTexte ? parseInt(identificationParts.numTexte) : null,
152
+ version: identificationParts?.version ? identificationParts.version as Version : null,
153
+ workflow: metaElement ? buildWorklow(metaElement) : [],
154
+ divisions: bodyElement ? flattenTexte(bodyElement) : [],
155
+ }
156
+ } catch (error: any) {
157
+ console.error(`Could not parse texte with error ${error}`)
158
+ }
159
+ return transformedTexte
160
+ }
161
+
162
+ export function parseTexte (texteXml: string): FlatTexte | null {
163
+ const { document } = (new JSDOM(texteXml, {
164
+ contentType: "text/xml",
165
+ })).window
166
+ return transformTexte(document)
167
+ }
168
+
169
+ // Prevent from memory leak
170
+ // https://github.com/jsdom/jsdom/issues/2583#issuecomment-559520814
171
+ export async function parseTexteFromFile (xmlFilePath: string): Promise<FlatTexte | null> {
172
+ const { document } = (await JSDOM.fromFile(xmlFilePath, { contentType: "text/xml" })).window
173
+ return transformTexte(document)
174
+ }
@@ -19,6 +19,10 @@ export interface Amd {
19
19
  * Identifiant de l'amendement pere pour les sous-amendements
20
20
  */
21
21
  amdperid: number | null;
22
+ /**
23
+ * Identifiant de l'amendement auquel celui-ci a été rendu similaire
24
+ */
25
+ amdrendusim: number | null;
22
26
  /**
23
27
  * Indication de la mention -Et plusieurs de ses collegues-
24
28
  */
@@ -35,6 +39,10 @@ export interface Amd {
35
39
  * Indication de la mendion -Et plusieurs de ses collegues- (uniquement pour les amendements de commission)
36
40
  */
37
41
  colleg: Generated<string>;
42
+ /**
43
+ * Commentaire sur les problèmes rencontrés lors du traitement de l'amendement
44
+ */
45
+ commentprobleme: string | null;
38
46
  /**
39
47
  * Date de depot de l'amendement
40
48
  */
@@ -51,6 +59,10 @@ export interface Amd {
51
59
  * Identifiant de l'etat de l'amendement
52
60
  */
53
61
  etaid: number;
62
+ /**
63
+ * Identifiant de l'état de traitement d'un amendement (lien fait à partir d'un enum dans le back)
64
+ */
65
+ etatraitid: Generated<number>;
54
66
  /**
55
67
  * Identifiant
56
68
  */
@@ -140,6 +152,14 @@ export interface Amd {
140
152
  * Identification des amendements portant sur article additionnel (si different de 0)
141
153
  */
142
154
  subpos: Generated<Int8 | null>;
155
+ /**
156
+ * Date de la dernière modification de l'amendement
157
+ */
158
+ traitementdate: Timestamp | null;
159
+ /**
160
+ * Identifiant de la dernière entité à avoir modifié l'amendement
161
+ */
162
+ traitemententid: number | null;
143
163
  /**
144
164
  * Identifiant du texte amende
145
165
  */
@@ -254,6 +254,10 @@ export interface TamQuestions {
254
254
  * Prénom du sénateur
255
255
  */
256
256
  prenom: string | null;
257
+ /**
258
+ * Ordre d¿affichage personnalisé des questions (modifiable par drag et drop)
259
+ */
260
+ rang: Int8 | null;
257
261
  /**
258
262
  * Type Appartenance
259
263
  */
@@ -335,74 +339,6 @@ export interface TamQuestions {
335
339
  */
336
340
  version: Int8 | null;
337
341
  }
338
- export interface TamReponses {
339
- /**
340
- * Date publication JO de la réponse
341
- */
342
- datejorep: Timestamp | null;
343
- /**
344
- * Délai en jours de la réponse
345
- */
346
- delaijoursrep: Int8 | null;
347
- /**
348
- * Date publication JO de l'erratum réponse
349
- */
350
- errdate: Timestamp | null;
351
- /**
352
- * Page de publication JO de l'erratum réponse
353
- */
354
- errpage: Int8 | null;
355
- /**
356
- * Identifiant de base de la question
357
- */
358
- idque: Int8;
359
- /**
360
- * Identifiant de base de la réponse dans le cas de réponses communes
361
- */
362
- idrepunique: string | null;
363
- /**
364
- * Identifiant du ministère ayant repondu à la question
365
- */
366
- minrepid: Int8 | null;
367
- /**
368
- * Libellé du ministère ayant repondu à la question
369
- */
370
- minreplib: string | null;
371
- /**
372
- * Page de publication JO de la réponse
373
- */
374
- pagejorep: Int8 | null;
375
- /**
376
- * Texte de l'erratum réponse
377
- */
378
- txterrrep: string | null;
379
- /**
380
- * Texte de la réponse
381
- */
382
- txtrep: string | null;
383
- /**
384
- * URL du compte rendu où figure la réponse sur senat.fr
385
- */
386
- urlrep: string | null;
387
- }
388
- export interface The {
389
- /**
390
- * Libellé d'édition thème
391
- */
392
- theali: string | null;
393
- /**
394
- * Code thème
395
- */
396
- thecle: number;
397
- /**
398
- * Libellé du thème
399
- */
400
- thelib: string;
401
- /**
402
- * Critère de tri
403
- */
404
- thenouidt: Int8 | null;
405
- }
406
342
  export interface DB {
407
343
  etatquestion: Etatquestion;
408
344
  legquestion: Legquestion;
@@ -410,6 +346,4 @@ export interface DB {
410
346
  sortquestion: Sortquestion;
411
347
  tam_ministeres: TamMinisteres;
412
348
  tam_questions: TamQuestions;
413
- tam_reponses: TamReponses;
414
- the: The;
415
349
  }