@tricoteuses/tisseuse 0.13.3 → 0.13.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 (38) hide show
  1. package/README.md +76 -0
  2. package/dist/index.js +73 -64
  3. package/dist/server.js +21514 -21262
  4. package/dist/src/lib/articles.d.ts +18 -4
  5. package/dist/src/lib/cache.d.ts +2 -1
  6. package/dist/src/lib/index.d.ts +2 -2
  7. package/dist/src/lib/loaders/legifrance.d.ts +11 -9
  8. package/dist/src/lib/server/assemblee_amendment_search.d.ts +13 -0
  9. package/dist/src/lib/server/assemblee_amendment_search.test.d.ts +1 -0
  10. package/dist/src/lib/server/assemblee_document_search.d.ts +29 -0
  11. package/dist/src/lib/server/assemblee_document_search.test.d.ts +1 -0
  12. package/dist/src/lib/server/databases/index.d.ts +2 -2
  13. package/dist/src/lib/server/index.d.ts +5 -0
  14. package/dist/src/lib/server/legifrance_article_search.d.ts +23 -0
  15. package/dist/src/lib/server/legifrance_article_search.test.d.ts +1 -0
  16. package/dist/src/lib/server/legifrance_jurisprudence_search.d.ts +16 -0
  17. package/dist/src/lib/server/legifrance_jurisprudence_search.test.d.ts +1 -0
  18. package/dist/src/lib/server/parsed_bills.d.ts +1 -0
  19. package/dist/src/lib/server/senat_amendment_search.d.ts +12 -0
  20. package/dist/src/lib/server/senat_amendment_search.test.d.ts +1 -0
  21. package/dist/src/lib/server/senat_document_search.d.ts +17 -0
  22. package/dist/src/lib/server/senat_document_search.test.d.ts +1 -0
  23. package/dist/src/lib/server/senat_document_sources.d.ts +15 -0
  24. package/dist/src/lib/textes.d.ts +4 -4
  25. package/dist/src/scripts/configure_postgres_assemblee_document_triggers.d.ts +1 -0
  26. package/dist/src/scripts/configure_postgres_senat_document_triggers.d.ts +1 -0
  27. package/dist/src/scripts/index_postgres_assemblee_amendments.d.ts +1 -0
  28. package/dist/src/scripts/index_postgres_assemblee_texts.d.ts +1 -0
  29. package/dist/src/scripts/index_postgres_legifrance_articles.d.ts +1 -0
  30. package/dist/src/scripts/index_postgres_legifrance_jurisprudence.d.ts +1 -0
  31. package/dist/src/scripts/index_postgres_senat_amendments.d.ts +1 -0
  32. package/dist/src/scripts/index_postgres_senat_texts.d.ts +1 -0
  33. package/dist/src/scripts/profile_assemblee_document_parsing.d.ts +1 -0
  34. package/dist/src/scripts/sync_postgres_assemblee_document_content.d.ts +1 -0
  35. package/dist/src/scripts/sync_postgres_senat_document_content.d.ts +1 -0
  36. package/dist/{textes-Enqe3lpa.js → textes-BIJjrNwg.js} +2281 -2271
  37. package/package.json +17 -2
  38. /package/dist/src/{scripts/enrich_senat_documents.d.ts → lib/article_temporal_status.test.d.ts} +0 -0
package/README.md CHANGED
@@ -39,6 +39,82 @@ Create a `.env` file to set configuration variables (you can use `example.env` a
39
39
  npm run configure
40
40
  ```
41
41
 
42
+ ### Pilote de recherche plein texte Légifrance
43
+
44
+ La projection native PostgreSQL `tisseuse.legifrance_article_search` indexe une ligne par version d’article Légifrance. Elle s’appuie sur le contenu déjà enrichi par Tisseuse lorsqu’il est disponible, sinon sur le bloc textuel source.
45
+
46
+ Exécuter la commande **sur le primaire PostgreSQL avec un rôle en écriture**, après les imports ; le contenu enrichi par Tisseuse est utilisé lorsqu’il est disponible :
47
+
48
+ ```sh
49
+ npm run index:postgres:legifrance
50
+ ```
51
+
52
+ La table, son `tsvector` français, ses index GIN/B-tree et une file durable d’articles sont créés par `npm run configure`. Cette configuration installe des triggers sur les articles source et sur les contenus enrichis : toute insertion, modification ou suppression place l’identifiant de l’article dans la file, dans la même transaction que la modification source. Lors de sa première installation, le trigger place aussi le corpus existant dans la file.
53
+
54
+ La CI `tricoteuses-legal-update` exécute la configuration puis vide la file après chaque import `jorf` ou `legi` qui a effectivement changé les données. L’indexeur traite la file par lots verrouillés et ne retire un identifiant qu’après avoir mis à jour ou supprimé sa projection dans la même transaction : une interruption laisse donc les travaux non terminés rejouables. Les articles inchangés ne sont pas réécrits grâce à leur hash source.
55
+
56
+ Pour demander explicitement une réconciliation complète, par exemple après une évolution de la projection :
57
+
58
+ ```sh
59
+ npm run index:postgres:legifrance -- --all
60
+ ```
61
+
62
+ La projection, la file et ses index suivent la réplication physique PostgreSQL ; ne pas exécuter cette commande sur un standby.
63
+
64
+ Pour les articles dont Légifrance fournit une date de début sentinelle (`2222-02-22` ou `2999-01-01`), la projection utilise `getArticleDateDebut`, le repli déjà employé par Tisseuse. Cette fonction peut retrouver un repère de création ou de signature dans le contexte de l’article ; elle ne transforme pas ce repère en période de vigueur certaine. La projection conserve aussi les bornes source et les classe dans `temporal_status` : `dated`, `open_ended`, `never_effective` ou `unknown`. Les recherches du droit applicable doivent limiter les résultats aux deux premiers statuts. Après une évolution de cette projection, lancer la réconciliation explicite `--all` avant d’interpréter les dates de l’ensemble du corpus avec la nouvelle logique.
65
+
66
+ Le pilote est exposé par Exploratrice à `GET /legifrance/recherche-plein-texte?q=...`, avec les filtres facultatifs `date=YYYY-MM-DD`, `nature`, `texte_cid` et `limit`.
67
+
68
+ ### Contenus et recherche plein texte Assemblée nationale
69
+
70
+ Les documents de l’Assemblée nationale sont acquis depuis les URL institutionnelles déduites de `assemblee.documents`, puis stockés dans `tisseuse.assemblee_document_content`. Cette projection est la source de contenu d’Exploratrice : elle contient un HTML simplifié, sa version enrichie de liens lorsque disponible, le sommaire, la provenance et l’état d’acquisition. Le répertoire local `Documents/` peut servir à diagnostiquer ou à amorcer un import historique, mais n’est pas lu par le service web ou l’indexeur.
71
+
72
+ Exécuter ces commandes **sur le primaire PostgreSQL avec un rôle en écriture** :
73
+
74
+ ```sh
75
+ npm run sync:postgres:assemblee-content -- --all
76
+ npm run index:postgres:assemblee -- --all
77
+ ```
78
+
79
+ `npm run configure` doit être exécuté avec le rôle en écriture du schéma `tisseuse`. Les déclencheurs de `assemblee.documents` sont installés séparément avec `npm run configure:postgres:assemblee-triggers`, sous le rôle propriétaire du schéma `assemblee`. Les déclencheurs de `senat.dosleg_texte` et `senat.ameli_amd` le sont avec `npm run configure:postgres:senat-triggers`, sous le rôle propriétaire du schéma `senat`. Les pipelines d’import effectuent ces étapes avec les identifiants appropriés.
80
+
81
+ La première commande consomme la file des documents à acquérir, simplifier et enrichir. La seconde indexe dans `tisseuse.assemblee_text_search` les articles et les exposés des motifs comme résultats distincts. Les déclencheurs sur `assemblee.documents`, le hash du contenu et les files PostgreSQL permettent les mises à jour ciblées ; les options `--all` demandent une réconciliation complète.
82
+
83
+ Exploratrice et Moulineuse ne téléchargent jamais un document pendant une lecture. Lorsqu’un document source existe mais que son contenu n’est pas encore disponible, son état est conservé en base et l’interface doit l’indiquer au lieu de servir une copie locale périmée.
84
+
85
+ ### Première itération de recherche plein texte Sénat
86
+
87
+ La recherche Sénat indexe les articles et les exposés des motifs des états documentaires `senat.dosleg_texte`. Elle conserve la source Akoma Ntoso institutionnelle, son rendu HTML et une projection PostgreSQL par fragment ; un résultat est donc toujours associé à un `texcod`, une étape et un dossier, jamais présenté comme une version du droit en vigueur.
88
+
89
+ Après l’import des tables Sénat, exécuter ces commandes **sur le primaire PostgreSQL avec un rôle d’écriture** :
90
+
91
+ ```sh
92
+ npm run configure
93
+ npm run configure:postgres:senat-triggers
94
+ npm run sync:postgres:senat-content
95
+ npm run index:postgres:senat
96
+ npm run index:postgres:senat-amendments
97
+ ```
98
+
99
+ `sync:postgres:senat-content` vide la file d’acquisition : il résout les URL `senat.dosleg_texte.texurl` vers `https://www.senat.fr/akomantoso/<nom>.akn.xml`, valide que la réponse est bien du XML Akoma Ntoso et conserve le XML, les rendus et les erreurs dans `tisseuse.senat_document_content`. Il ne doit jamais être exécuté par une requête utilisateur, un affichage Exploratrice ou un appel MCP.
100
+
101
+ `index:postgres:senat` vide la file d’indexation et produit `tisseuse.senat_text_search` depuis le contenu déjà stocké. Il peut donc recalculer l’index après une évolution du parseur ou des métadonnées sans relire le réseau. Pour réconcilier explicitement toutes les lignes, par exemple après un import Sénat qui modifie des libellés ou des dossiers :
102
+
103
+ ```sh
104
+ npm run index:postgres:senat -- --all
105
+ ```
106
+
107
+ Pour forcer une nouvelle acquisition de l’ensemble du corpus, par exemple après une évolution du récupérateur :
108
+
109
+ ```sh
110
+ npm run sync:postgres:senat-content -- --all
111
+ npm run index:postgres:senat
112
+ ```
113
+
114
+ Les documents sans URL, externes au Sénat, sans Akoma Ntoso ou en échec de parsing ont un statut explicite et ne sont pas silencieusement remplacés par un fichier local.
115
+
116
+ `index:postgres:senat-amendments` consomme la file AMELI et produit deux fragments distincts par amendement dans `tisseuse.senat_amendment_search` : `dispositif` depuis `senat.ameli_amd.dis` et `expose_sommaire` depuis `senat.ameli_amd.obj`. Les métadonnées parlementaires restent liées à chaque résultat. L'option `--all` réconcilie l'ensemble du corpus sans téléchargement réseau.
117
+
42
118
  ## Legal reference resolver
43
119
 
44
120
  Tisseuse resolves legal references through a `LegiResolver`. The default
package/dist/index.js CHANGED
@@ -1,71 +1,80 @@
1
- import { $ as e, $t as t, A as n, An as r, At as i, B as a, Bn as o, Bt as s, C as c, Cn as l, Ct as u, D as d, Dn as f, Dt as p, E as m, En as ee, Et as te, F as h, Fn as ne, Ft as re, G as ie, Gn as ae, Gt as oe, H as se, Hn as ce, Ht as le, I as ue, In as de, It as fe, J as pe, Jt as me, K as he, Kn as ge, Kt as _e, Ln as ve, Lt as ye, M as be, Mn as xe, Mt as g, N as Se, Nn as _, Nt as Ce, O as we, On as v, Ot as y, P as Te, Pn as Ee, Pt as De, Q as Oe, Qt as b, R as x, Rn as S, Rt as C, S as w, Sn as T, St as ke, T as Ae, Tn as je, Tt as Me, U as Ne, Un as Pe, Ut as Fe, V as Ie, Vn as Le, Vt as Re, W as ze, Wn as Be, Wt as Ve, X as He, Xt as Ue, Y as We, Yt as Ge, Z as Ke, Zt as qe, _ as Je, _n as Ye, _t as Xe, a as Ze, an as Qe, at as $e, b as et, bn as tt, bt as nt, c as E, cn as rt, ct as it, d as at, dn as ot, dt as D, en as st, et as ct, f as O, fn as k, ft as A, g as lt, gn as ut, gt as dt, h as ft, hn as pt, ht as mt, i as ht, in as gt, it as _t, j as vt, jn as j, jt as yt, k as bt, kn as M, kt as xt, l as St, ln as Ct, lt as wt, m as Tt, mn as Et, mt as Dt, n as N, nn as Ot, nt as kt, o as At, on as jt, ot as Mt, p as Nt, pn as Pt, q as Ft, qn as P, qt as It, r as Lt, rn as Rt, rt as F, s as zt, sn as Bt, st as Vt, t as Ht, tn as Ut, tt as Wt, u as Gt, un as Kt, ut as qt, v as Jt, vn as Yt, vt as Xt, w as Zt, wn as Qt, wt as $t, x as en, xn as tn, xt as nn, y as rn, yn as an, yt as on, z as I, zn as sn, zt as cn } from "./textes-Enqe3lpa.js";
1
+ import { $ as e, $t as t, A as n, An as r, At as i, B as a, Bn as o, Bt as s, C as c, Cn as l, Ct as u, D as d, Dn as f, Dt as p, E as m, En as ee, Et as te, F as ne, Fn as re, Ft as h, G as ie, Gn as ae, Gt as oe, H as se, Hn as ce, Ht as le, I as ue, In as de, It as fe, J as pe, Jn as g, Jt as me, K as he, Kn as ge, Kt as _e, Ln as ve, Lt as ye, M as be, Mn as xe, Mt as Se, N as Ce, Nn as _, Nt as we, O as Te, On as v, Ot as y, P as Ee, Pn as De, Pt as Oe, Q as ke, Qt as b, R as x, Rn as S, Rt as C, S as w, Sn as T, St as Ae, T as je, Tn as Me, Tt as Ne, U as Pe, Un as Fe, Ut as Ie, V as Le, Vn as Re, Vt as ze, W as Be, Wn as Ve, Wt as He, X as Ue, Xt as We, Y as Ge, Yt as Ke, Z as qe, Zt as Je, _ as Ye, _n as Xe, _t as Ze, a as Qe, an as $e, at as et, b as tt, bn as nt, bt as rt, c as E, cn as it, ct as at, d as ot, dn as st, dt as D, en as ct, et as lt, f as O, fn as k, ft as A, g as ut, gn as dt, gt as ft, h as pt, hn as mt, ht, i as gt, in as _t, it as vt, j as yt, jn as j, jt as bt, k as xt, kn as M, kt as St, l as Ct, ln as wt, lt as Tt, m as Et, mn as Dt, mt as Ot, n as kt, nn as At, nt as jt, o as Mt, on as Nt, ot as Pt, p as Ft, pn as It, q as Lt, qn as Rt, qt as zt, r as Bt, rn as Vt, rt as N, s as Ht, sn as Ut, st as Wt, t as Gt, tn as Kt, tt as qt, u as Jt, un as Yt, ut as Xt, v as Zt, vn as Qt, vt as $t, w as en, wn as tn, wt as nn, x as rn, xn as an, xt as on, y as sn, yn as cn, yt as ln, z as P, zn as un, zt as dn } from "./textes-BIJjrNwg.js";
2
2
  //#region ../../node_modules/@tricoteuses/legifrance/dist/legal/index.js
3
- function ln(e, t) {
3
+ function fn(e, t) {
4
4
  if (e != null) {
5
5
  if (!Array.isArray(e)) return e;
6
6
  for (let n of e) if (n["@debut"] <= t && t <= n["@fin"]) return n;
7
7
  return e[0];
8
8
  }
9
9
  }
10
- function* L(e) {
11
- yield e, e.TM !== void 0 && (yield* L(e.TM));
12
- }
13
10
  //#endregion
14
11
  //#region src/lib/articles.ts
15
- var R = ["2222-02-22", "2999-01-01"], un = (e) => {
12
+ var F = ["2222-02-22", "2999-01-01"];
13
+ function I(e) {
14
+ return [e, ...e.TM === void 0 ? [] : I(e.TM)];
15
+ }
16
+ function L(e) {
17
+ return e !== void 0 && F.includes(e);
18
+ }
19
+ function pn({ dateDebut: e, sourceDateDebut: t, sourceDateFin: n }) {
20
+ return t !== void 0 && n !== void 0 && !L(t) && !L(n) && n <= t ? "never_effective" : e === void 0 || L(e) ? "unknown" : n === "2999-01-01" ? "open_ended" : n === void 0 || L(n) ? "unknown" : n > e ? "dated" : "unknown";
21
+ }
22
+ var mn = (e) => {
16
23
  if (e !== void 0) for (let t = 0; t < e.length; ++t) {
17
24
  let n = k(new f(e, t));
18
25
  if (typeof n == "string") return n;
19
26
  }
20
- }, z = (e) => (e === void 0 ? [] : Array.isArray(e) ? e : [e]).map((e) => un(e["#text"])).find((e) => e !== void 0), dn = (e) => {
27
+ }, R = (e) => (e === void 0 ? [] : Array.isArray(e) ? e : [e]).map((e) => mn(e["#text"])).find((e) => e !== void 0), hn = (e) => {
21
28
  let t = e.META.META_SPEC.META_ARTICLE.DATE_DEBUT;
22
- if (t !== void 0 && !R.includes(t)) return t;
23
- let n = e.CONTEXTE.TEXTE, r = n.TITRE_TXT, i = [...r === void 0 ? [] : (Array.isArray(r) ? r : [r]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : L(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).toArray().flat()].filter((e) => !R.includes(e));
29
+ if (t !== void 0 && !F.includes(t)) return t;
30
+ let n = e.CONTEXTE.TEXTE, r = n.TITRE_TXT, i = [...r === void 0 ? [] : (Array.isArray(r) ? r : [r]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : I(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).flat()].filter((e) => !F.includes(e));
24
31
  if (i.length > 0) return i.sort().at(-1);
25
32
  let a = n["@date_publi"];
26
- if (a !== void 0 && !R.includes(a)) return a;
33
+ if (a !== void 0 && !F.includes(a)) return a;
27
34
  let o = n["@date_signature"];
28
- if (o !== void 0 && !R.includes(o)) return o;
35
+ if (o !== void 0 && !F.includes(o)) return o;
29
36
  let s = e.META.META_SPEC.META_ARTICLE.DATE_FIN;
30
- if (s !== void 0 && !R.includes(s)) return s;
31
- let c = z(r);
37
+ if (s !== void 0 && !F.includes(s)) return s;
38
+ let c = R(r);
32
39
  if (c !== void 0) return c;
33
- if (R.includes(t ?? "")) return t;
40
+ if (F.includes(t ?? "")) return t;
34
41
  throw Error(`Missing date signature in article ${e.META.META_COMMUN.ID}`);
35
- }, B = (e) => {
42
+ }, z = (e) => {
36
43
  let t = e.META.META_SPEC.META_ARTICLE.DATE_DEBUT;
37
- if (t !== void 0 && !R.includes(t)) return t;
44
+ if (t !== void 0 && !F.includes(t)) return t;
38
45
  let n = e.CONTEXTE.TEXTE, r = n["@date_signature"];
39
- if (r !== void 0 && !R.includes(r)) return r;
46
+ if (r !== void 0 && !F.includes(r)) return r;
40
47
  let i = n["@date_publi"];
41
- if (i !== void 0 && !R.includes(i)) return i;
42
- let a = n.TITRE_TXT, o = [...a === void 0 ? [] : (Array.isArray(a) ? a : [a]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : L(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).toArray().flat()].filter((e) => !R.includes(e));
48
+ if (i !== void 0 && !F.includes(i)) return i;
49
+ let a = n.TITRE_TXT, o = [...a === void 0 ? [] : (Array.isArray(a) ? a : [a]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : I(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).flat()].filter((e) => !F.includes(e));
43
50
  if (o.length > 0) return o.sort().at(-1);
44
51
  let s = e.META.META_SPEC.META_ARTICLE.DATE_FIN;
45
- if (s !== void 0 && !R.includes(s)) return s;
46
- let c = z(a);
52
+ if (s !== void 0 && !F.includes(s)) return s;
53
+ let c = R(a);
47
54
  if (c !== void 0) return c;
48
- if (R.includes(t ?? "")) return t;
55
+ if (F.includes(t ?? "")) return t;
49
56
  throw Error(`Missing date signature in article ${e.META.META_COMMUN.ID}`);
50
57
  };
51
- async function fn(e, t, n, r) {
58
+ async function gn(e, t, n, r) {
52
59
  let i = await S(e, t, n);
53
60
  if (i === void 0) return;
54
- let a = B(i), o = i.META.META_COMMUN.ORIGINE, s = i.CONTEXTE.TEXTE;
61
+ let a = z(i), o = i.META.META_COMMUN.ORIGINE;
62
+ if (o === "KALI") return;
63
+ let s = i.CONTEXTE.TEXTE;
55
64
  if (s.TM === void 0) return;
56
- let c = L(s.TM).toArray().reverse(), l;
65
+ let c = I(s.TM).reverse(), l;
57
66
  switch (o) {
58
67
  case "JORF":
59
68
  l = c.map((e) => e.TITRE_TM["@id"]);
60
69
  break;
61
70
  case "LEGI":
62
- l = c.map((e) => ln(e.TITRE_TM, a)?.["@id"]);
71
+ l = c.map((e) => fn(e.TITRE_TM, a)?.["@id"]);
63
72
  break;
64
- default: P("getOrLoadArticleSiblingId origine", o);
73
+ default: g("getOrLoadArticleSiblingId origine", o);
65
74
  }
66
- return await (r === -1 ? G : W)(e, t, n, a, i.num, l);
75
+ return await (r === -1 ? W : U)(e, t, n, a, i.num, l);
67
76
  }
68
- async function V(e, t, n, r, i, a) {
77
+ async function B(e, t, n, r, i, a) {
69
78
  let s = r[n];
70
79
  if (s === void 0) {
71
80
  let c = await o(e, t, n);
@@ -96,7 +105,7 @@ async function V(e, t, n, r, i, a) {
96
105
  }
97
106
  return s;
98
107
  }
99
- async function H(e, t, n) {
108
+ async function V(e, t, n) {
100
109
  let r = await o(e, t, n);
101
110
  if (r === void 0) return;
102
111
  let i = r.STRUCTURE_TA;
@@ -105,26 +114,26 @@ async function H(e, t, n) {
105
114
  if (a !== void 0) return a[0]["@id"];
106
115
  let s = i.LIEN_SECTION_TA;
107
116
  if (s !== void 0) for (let n of s) {
108
- let r = await H(e, t, n["@id"]);
117
+ let r = await V(e, t, n["@id"]);
109
118
  if (r !== void 0) return r;
110
119
  }
111
120
  }
112
- async function U(e, t, n) {
121
+ async function H(e, t, n) {
113
122
  let r = await o(e, t, n);
114
123
  if (r === void 0) return;
115
124
  let i = r.STRUCTURE_TA;
116
125
  if (i === void 0) return;
117
126
  let a = i.LIEN_SECTION_TA;
118
127
  if (a !== void 0) for (let n of a.toReversed()) {
119
- let r = await U(e, t, n["@id"]);
128
+ let r = await H(e, t, n["@id"]);
120
129
  if (r !== void 0) return r;
121
130
  }
122
131
  return i.LIEN_ART?.at(-1)?.["@id"];
123
132
  }
124
- async function W(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
133
+ async function U(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
125
134
  let l = a[o];
126
135
  if (l === void 0) return;
127
- let u = await V(e, t, l, s, n, c);
136
+ let u = await B(e, t, l, s, n, c);
128
137
  if (u === void 0) return;
129
138
  let { area: d, index: f, sectionTa: p } = u, m = p.STRUCTURE_TA;
130
139
  switch (d) {
@@ -134,31 +143,31 @@ async function W(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
134
143
  let a = c[n];
135
144
  if (a["@num"] !== i) {
136
145
  let n = await S(e, t, a["@id"]);
137
- if (n !== void 0 && B(n) <= r) return a["@id"];
146
+ if (n !== void 0 && z(n) <= r) return a["@id"];
138
147
  }
139
148
  }
140
149
  let u = m.LIEN_SECTION_TA;
141
150
  if (u !== void 0) for (let n of u) {
142
- let r = await H(e, t, n["@id"]);
151
+ let r = await V(e, t, n["@id"]);
143
152
  if (r !== void 0) return r;
144
153
  }
145
- return await W(e, t, n, r, i, a, o + 1, s, l);
154
+ return await U(e, t, n, r, i, a, o + 1, s, l);
146
155
  }
147
156
  case "LIEN_SECTION_TA": {
148
157
  let c = m.LIEN_SECTION_TA;
149
158
  for (let n = f + 1; n < c.length; n++) {
150
- let r = await H(e, t, c[n]["@id"]);
159
+ let r = await V(e, t, c[n]["@id"]);
151
160
  if (r !== void 0) return r;
152
161
  }
153
- return await W(e, t, n, r, i, a, o + 1, s, l);
162
+ return await U(e, t, n, r, i, a, o + 1, s, l);
154
163
  }
155
- default: P("moveToNextArticleId area", d);
164
+ default: g("moveToNextArticleId area", d);
156
165
  }
157
166
  }
158
- async function G(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
167
+ async function W(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
159
168
  let l = a[o];
160
169
  if (l === void 0) return;
161
- let u = await V(e, t, l, s, n, c);
170
+ let u = await B(e, t, l, s, n, c);
162
171
  if (u === void 0) return;
163
172
  let { area: d, index: f, sectionTa: p } = u, m = p.STRUCTURE_TA;
164
173
  switch (d) {
@@ -168,23 +177,23 @@ async function G(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
168
177
  let a = c[n];
169
178
  if (a["@num"] !== i) {
170
179
  let n = await S(e, t, a["@id"]);
171
- if (n !== void 0 && B(n) <= r) return a["@id"];
180
+ if (n !== void 0 && z(n) <= r) return a["@id"];
172
181
  }
173
182
  }
174
- return await G(e, t, n, r, i, a, o + 1, s, l);
183
+ return await W(e, t, n, r, i, a, o + 1, s, l);
175
184
  }
176
185
  case "LIEN_SECTION_TA": {
177
186
  for (let n = f - 1; n >= 0; n--) {
178
- let r = await U(e, t, m.LIEN_SECTION_TA[n]["@id"]);
187
+ let r = await H(e, t, m.LIEN_SECTION_TA[n]["@id"]);
179
188
  if (r !== void 0) return r;
180
189
  }
181
190
  let c = m.LIEN_ART;
182
- return c === void 0 ? await G(e, t, n, r, i, a, o + 1, s, l) : (u.area = "LIEN_ART", u.index = c.length, await G(e, t, n, r, i, a, o, s));
191
+ return c === void 0 ? await W(e, t, n, r, i, a, o + 1, s, l) : (u.area = "LIEN_ART", u.index = c.length, await W(e, t, n, r, i, a, o, s));
183
192
  }
184
- default: P("moveToPreviousArticleId area", d);
193
+ default: g("moveToPreviousArticleId area", d);
185
194
  }
186
195
  }
187
- var pn = (e) => (t, n) => {
196
+ var G = (e) => (t, n) => {
188
197
  let r = e(t), i = e(n);
189
198
  if (r !== i) return r.localeCompare(i);
190
199
  let a = t.META.META_COMMUN, o = a.ORIGINE, s = n.META.META_COMMUN, c = s.ORIGINE;
@@ -203,13 +212,13 @@ var pn = (e) => (t, n) => {
203
212
  if (m <= i) return 1;
204
213
  }
205
214
  throw Error(`TODO: Unable to sort articles ${a.ID} & ${s.ID} by date.`);
206
- }, mn = new Intl.DateTimeFormat("fr-FR", { dateStyle: "long" });
207
- function hn(e) {
208
- return mn.format(new Date(e)).replace(/^1 /, "1er ");
215
+ }, _n = new Intl.DateTimeFormat("fr-FR", { dateStyle: "long" });
216
+ function vn(e) {
217
+ return _n.format(new Date(e)).replace(/^1 /, "1er ");
209
218
  }
210
219
  //#endregion
211
220
  //#region src/lib/json.ts
212
- var gn = (e, t) => t instanceof Object && !Array.isArray(t) ? Object.keys(t).sort().reduce((e, n) => (e[n] = t[n], e), {}) : t;
221
+ var yn = (e, t) => t instanceof Object && !Array.isArray(t) ? Object.keys(t).sort().reduce((e, n) => (e[n] = t[n], e), {}) : t;
213
222
  //#endregion
214
223
  //#region src/lib/markdown.ts
215
224
  function K(e) {
@@ -218,7 +227,7 @@ function K(e) {
218
227
  //#endregion
219
228
  //#region src/lib/linkers/markdown.ts
220
229
  async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousContext: i, text: a }) {
221
- let o = F(a), s = new f(o.output);
230
+ let o = N(a), s = new f(o.output);
222
231
  s.currentArticle = i?.currentArticle, s.currentText = i?.currentText;
223
232
  let c = a, l = 0;
224
233
  for await (let i of O({
@@ -272,7 +281,7 @@ async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousC
272
281
  c = c.slice(0, t.position.start + l) + n + c.slice(t.position.stop + l), l += n.length - (t.position.stop - t.position.start);
273
282
  break;
274
283
  }
275
- default: P("Link", i);
284
+ default: g("Link", i);
276
285
  }
277
286
  return {
278
287
  context: s,
@@ -281,7 +290,7 @@ async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousC
281
290
  }
282
291
  //#endregion
283
292
  //#region src/lib/loaders/assemblee.ts
284
- async function _n(e, t, n) {
293
+ async function bn(e, t, n) {
285
294
  let r = t.get("Document");
286
295
  r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("Document", r));
287
296
  let i = r.get(n);
@@ -291,7 +300,7 @@ async function _n(e, t, n) {
291
300
  WHERE uid = ${n}
292
301
  `)[0]?.data, r.set(n, i ?? null)), i ?? void 0;
293
302
  }
294
- async function vn(e, t, n) {
303
+ async function xn(e, t, n) {
295
304
  let r = t.get("Document");
296
305
  return r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("Document", r)), (await e`
297
306
  SELECT data, uid
@@ -299,7 +308,7 @@ async function vn(e, t, n) {
299
308
  WHERE data ->> 'dossierRef' = ${n}
300
309
  `).map(({ data: e, uid: t }) => (r.set(t, e ?? null), e));
301
310
  }
302
- async function yn(e, t, n) {
311
+ async function Sn(e, t, n) {
303
312
  let r = t.get("DossierParlementaire");
304
313
  r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("DossierParlementaire", r));
305
314
  let i = r.get(n);
@@ -430,10 +439,10 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
430
439
  })), Z = v(X, r(a, { value: (e, t) => e === void 0 ? void 0 : {
431
440
  ...e,
432
441
  position: t.position()
433
- } }), r(I, { value: (e, t) => ({
442
+ } }), r(P, { value: (e, t) => ({
434
443
  ...e,
435
444
  position: t.position()
436
- }) })), Q = j(_(" (?:du |de la |de l'|des |de |d')?", { flags: "i" }), { default: "" }), bn = _(".+?(?=\\s*(?:du |de la |de l'|des |de |d')?\\s*(?:art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?))", {
445
+ }) })), Q = j(_(" (?:du |de la |de l'|des |de |d')?", { flags: "i" }), { default: "" }), Cn = _(".+?(?=\\s*(?:du |de la |de l'|des |de |d')?\\s*(?:art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?))", {
437
446
  flags: "i",
438
447
  value: (e, t) => ({
439
448
  type: "texte",
@@ -447,7 +456,7 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
447
456
  title: e[0].trim(),
448
457
  position: t.position()
449
458
  })
450
- }), xn = v(M([
459
+ }), wn = v(M([
451
460
  Z,
452
461
  Q,
453
462
  Y
@@ -469,7 +478,7 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
469
478
  position: t.position(),
470
479
  type: "parent-enfant"
471
480
  }) }), M([
472
- bn,
481
+ Cn,
473
482
  Q,
474
483
  Y
475
484
  ], { value: (e, t) => {
@@ -489,6 +498,6 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
489
498
  parent: e[2],
490
499
  position: t.position(),
491
500
  type: "parent-enfant"
492
- }) }), Y, Z, $), Sn = q;
501
+ }) }), Y, Z, $), Tn = q;
493
502
  //#endregion
494
- export { f as TextParserContext, se as action, rn as actionDirective, qe as actionTargets, oe as addChildLeftToLastChild, Ze as addLinksOrReferencesToHtmlPage, At as addLinksToHtml, q as addLinksToMarkdown, Sn as addLinksToText, St as addPositionsToTableOfContentsItems, Et as adjectifNumeralCardinal, pt as adjectifNumeralOrdinalCourt, C as adjectifTemporelSingulier, ut as adverbeMultiplicatifLatin, De as adverbeRelatif, v as alternatives, nn as article, ke as articles, P as assertNever, xt as auPortion, i as auxPortions, he as buildArticlePortionTreeFromHtml, M as chain, Mt as chainTransformers, Ne as citation, ze as citationLigne, ie as citationSimple, Ht as cleanTexteTitle, b as compoundReferencesSeparators, r as convert, He as convertHtmlElementsToText, _e as createEnumerationOrBoundedInterval, It as createParentChildTreeFromReferences, k as date, Ke as decodeNamedHtmlEntities, Oe as decodeNumericHtmlEntities, u as definitionArticleDansCitation, $t as definitionArticleDansProjetOuPropositionLoi, mt as definitionDivision, n as definitionTexteFrancais, Me as designationArticle, dt as designationDivision, cn as ditPluriel, s as ditSingulier, Xe as division, t as divisionTypes, Xt as divisions, Pt as duDate, T as espace, re as espaceAdverbeRelatif, st as europeanLawNatures, ve as extendLoadedArticle, Tt as extractActionDirectiveAstsFromText, ft as extractActionDirectivesFromHtml, lt as extractActionDirectivesFromText, Dt as extractBillDefinitions, et as extractCitationReferences, Ft as extractPortionSelectors, en as extractReferences, w as extractReferencesWithOriginalTransformations, O as extractTextLinks, hn as formatLongDate, Ut as frenchLawNatures, dn as getArticleDateDebut, B as getArticleDateSignature, c as getExtractedReferences, Zt as getExtractedReferencesWithOriginalTransformations, Gt as getExtractedTableOfContentsFromTextBill, S as getOrLoadArticle, fn as getOrLoadArticleSiblingId, _n as getOrLoadDocument, vn as getOrLoadDocumentsByDossierParlementaireUid, yn as getOrLoadDossierParlementaire, sn as getOrLoadJo, o as getOrLoadSectionTa, Le as getOrLoadSectionsTa, ce as getOrLoadTexteVersion, Pe as getOrLoadTextelr, Be as getOrLoadTextesVersions, ae as getOrLoadTexteslr, N as getTexteVersionDateDebut, Lt as getTexteVersionDateSignature, vt as identificationTexteEuropeen, Ot as internationalLawNatures, Re as introPluriel, le as introSingulier, pe as isArticlePortionStructuralStart, Rt as isTextAstAtomicReference, gt as isTextAstDivision, Qe as isTextAstPortion, me as iterAtomicFirstParentReferences, Ge as iterAtomicReferences, Ue as iterIncludedReferences, Nt as iterReferenceLinks, gn as jsonReplacer, jt as lawNatures, l as lettreAscii, Fe as liaisonPluriel, Ve as liaisonSingulier, zt as linkTypes, te as listeArticles, Ae as listeReferencesSeules, ge as loadArticles, Bt as localizationAdverbs, on as natureDivisionSingulier, be as natureTexteFrancais, Ct as newAssembleeObjectCache, Kt as newLegifranceObjectCache, ot as newObjectCache, Vt as newReverseTransformationsMergedFromPositionsIterator, p as nomArticle, y as nomSpecialArticle, Ye as nombreAsTextAstNumber, Yt as nombreCardinal, an as nombreRomainCardinal, tt as nombreRomainOrdinal, tn as nombreRomainOu0iAsTextAstNumber, Qt as nonLettre, je as numero, nt as numeroDivision, Se as numeroEtOuDateTexteFrancais, yt as numeroPortion, Te as numeroTexteEuropeen, h as numeroTexteFrancais, j as optional, ue as optionalEspaceDuTerritoire, xe as parseText, rt as portionTypes, g as portions, m as reference, d as referenceSeule, _ as regExp, fe as relatifPlurielPrepose, ye as relatifSingulierPrepose, Ee as repeat, e as replaceHtmlPatterns, ct as replacePattern, Wt as replaceTextPatterns, Je as resolveActionDirectivesFromHtml, Jt as resolveActionDirectivesFromText, We as resolvePortionSelector, it as reversePositionsSplitFromPositions, wt as reverseTransformationFromPosition, qt as reverseTransformationsMergedFromPositions, D as reverseTransformedInnerFragment, A as reverseTransformedReplacement, Y as searchArticle, J as searchArticleKeyword, xn as searchQueryReference, Z as searchTexte, X as searchTexteAbbreviations, kt as simplifyHtml, F as simplifyPlainText, _t as simplifyText, $e as simplifyUnicodeCharacters, pn as sortArticlesByDate, ht as sortTextesVersionsByDate, x as texte, I as texteEuropeen, a as texteFrancais, Ie as texteInternational, Ce as unePortion, we as uniteBasePreciseeSingulier, bt as uniteBaseSingulier, E as urlFromLegalId, ne as variable, ee as virguleOuEspace, at as walkTableOfContents, de as wordsTree };
503
+ export { f as TextParserContext, se as action, sn as actionDirective, Je as actionTargets, oe as addChildLeftToLastChild, Qe as addLinksOrReferencesToHtmlPage, Mt as addLinksToHtml, q as addLinksToMarkdown, Tn as addLinksToText, Ct as addPositionsToTableOfContentsItems, Dt as adjectifNumeralCardinal, mt as adjectifNumeralOrdinalCourt, C as adjectifTemporelSingulier, dt as adverbeMultiplicatifLatin, Oe as adverbeRelatif, v as alternatives, on as article, Ae as articles, g as assertNever, St as auPortion, i as auxPortions, he as buildArticlePortionTreeFromHtml, M as chain, Pt as chainTransformers, Pe as citation, Be as citationLigne, ie as citationSimple, pn as classifyArticleTemporalStatus, Gt as cleanTexteTitle, b as compoundReferencesSeparators, r as convert, Ue as convertHtmlElementsToText, _e as createEnumerationOrBoundedInterval, zt as createParentChildTreeFromReferences, k as date, qe as decodeNamedHtmlEntities, ke as decodeNumericHtmlEntities, u as definitionArticleDansCitation, nn as definitionArticleDansProjetOuPropositionLoi, ht as definitionDivision, n as definitionTexteFrancais, Ne as designationArticle, ft as designationDivision, dn as ditPluriel, s as ditSingulier, Ze as division, t as divisionTypes, $t as divisions, It as duDate, T as espace, h as espaceAdverbeRelatif, ct as europeanLawNatures, ve as extendLoadedArticle, Et as extractActionDirectiveAstsFromText, pt as extractActionDirectivesFromHtml, ut as extractActionDirectivesFromText, Ot as extractBillDefinitions, tt as extractCitationReferences, Lt as extractPortionSelectors, rn as extractReferences, w as extractReferencesWithOriginalTransformations, O as extractTextLinks, vn as formatLongDate, Kt as frenchLawNatures, hn as getArticleDateDebut, z as getArticleDateSignature, c as getExtractedReferences, en as getExtractedReferencesWithOriginalTransformations, Jt as getExtractedTableOfContentsFromTextBill, S as getOrLoadArticle, gn as getOrLoadArticleSiblingId, bn as getOrLoadDocument, xn as getOrLoadDocumentsByDossierParlementaireUid, Sn as getOrLoadDossierParlementaire, un as getOrLoadJo, o as getOrLoadSectionTa, Re as getOrLoadSectionsTa, ce as getOrLoadTexteVersion, Fe as getOrLoadTextekali, Ve as getOrLoadTextelr, ae as getOrLoadTextesVersions, ge as getOrLoadTexteslr, kt as getTexteVersionDateDebut, Bt as getTexteVersionDateSignature, yt as identificationTexteEuropeen, At as internationalLawNatures, ze as introPluriel, le as introSingulier, pe as isArticlePortionStructuralStart, L as isLegifranceSentinelDate, Vt as isTextAstAtomicReference, _t as isTextAstDivision, $e as isTextAstPortion, me as iterAtomicFirstParentReferences, Ke as iterAtomicReferences, We as iterIncludedReferences, Ft as iterReferenceLinks, yn as jsonReplacer, Nt as lawNatures, l as lettreAscii, Ie as liaisonPluriel, He as liaisonSingulier, Ht as linkTypes, te as listeArticles, je as listeReferencesSeules, Rt as loadArticles, Ut as localizationAdverbs, ln as natureDivisionSingulier, be as natureTexteFrancais, wt as newAssembleeObjectCache, Yt as newLegifranceObjectCache, st as newObjectCache, Wt as newReverseTransformationsMergedFromPositionsIterator, p as nomArticle, y as nomSpecialArticle, Xe as nombreAsTextAstNumber, Qt as nombreCardinal, cn as nombreRomainCardinal, nt as nombreRomainOrdinal, an as nombreRomainOu0iAsTextAstNumber, tn as nonLettre, Me as numero, rt as numeroDivision, Ce as numeroEtOuDateTexteFrancais, bt as numeroPortion, Ee as numeroTexteEuropeen, ne as numeroTexteFrancais, j as optional, ue as optionalEspaceDuTerritoire, xe as parseText, it as portionTypes, Se as portions, m as reference, d as referenceSeule, _ as regExp, fe as relatifPlurielPrepose, ye as relatifSingulierPrepose, De as repeat, e as replaceHtmlPatterns, lt as replacePattern, qt as replaceTextPatterns, Ye as resolveActionDirectivesFromHtml, Zt as resolveActionDirectivesFromText, Ge as resolvePortionSelector, at as reversePositionsSplitFromPositions, Tt as reverseTransformationFromPosition, Xt as reverseTransformationsMergedFromPositions, D as reverseTransformedInnerFragment, A as reverseTransformedReplacement, Y as searchArticle, J as searchArticleKeyword, wn as searchQueryReference, Z as searchTexte, X as searchTexteAbbreviations, jt as simplifyHtml, N as simplifyPlainText, vt as simplifyText, et as simplifyUnicodeCharacters, G as sortArticlesByDate, gt as sortTextesVersionsByDate, x as texte, P as texteEuropeen, a as texteFrancais, Le as texteInternational, we as unePortion, Te as uniteBasePreciseeSingulier, xt as uniteBaseSingulier, E as urlFromLegalId, re as variable, ee as virguleOuEspace, ot as walkTableOfContents, de as wordsTree };