gedcom-ts 2026.6.1 → 2026.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,8 +2,28 @@
2
2
 
3
3
  All notable changes of gedcom-ts
4
4
 
5
+ ## [2026.6.3] - 2026-06-13
6
+
7
+ ### Changed
8
+
9
+ - **Import / export GEDZIP** : retour à **fflate** seul (`unzip` / `zip` asynchrones) — suppression de `@zip.js/zip.js`.
10
+
11
+ ## [2026.6.2] - 2026-06-12
12
+
13
+ ### Fixed
14
+
15
+ - **`DateAct`** : jetons de mois insensibles à la casse (`18 may 1991`, `JAN` / `jan` / `May`) — corrige l’import GEDCOM courant où seuls l’année et parfois le jour étaient conservés.
16
+ - **Qualificateurs de date** : `ABT`, `BEF`, `AFT`, … reconnus en minuscules ; plages `BET … AND …` et `FROM … TO …` insensibles à la casse.
17
+
5
18
  ## [2026.6.1] - 2026-06-09
6
19
 
20
+ ### Changed
21
+
22
+ - **Import GEDZIP** : décompression par entrée via `@zip.js/zip.js` (`BlobReader` / lectures aléatoires) à la place de `unzipSync` + `arrayBuffer()` sur l’archive entière — prise en charge d’archives volumineuses sans plafond artificiel côté lib.
23
+ - **Export GEDZIP** : `ExportGedzipFile.gedzipBlob()` / `download()` construisent le ZIP via `ZipWriter` + `BlobReader` par entrée (fini le `zip()` fflate monolithique et les `arrayBuffer()` sur chaque média).
24
+ - **Progression import / export** : `ImportGedFileOptions.onProgress` et `GedcomExportOptions.onProgress` (`GedcomTransferProgress`, phases `zip-extract`, `gedcom-parse`, `zip-build`, …).
25
+ - **Export unions FAM** : actes `MARR` / `DIV` / … avec deux conjoints réexportés sous `0 @F…@ FAM` (et retirés des blocs `INDI`) lorsque les deux époux sont dans l’export — round-trip des `act.INDIS` conjoint.
26
+
7
27
  ### Fixed
8
28
 
9
29
  - **FORM / MEDI élargis** : TIFF, HEIC, BMP, SVG, MOV, MKV, DjVu, PDF, Office (DOCX, ODT, XLSX), CSV, HTML, SRT, etc. ; PDF et documents numériques → `MEDI ELECTRONIC` (conforme `enumset-MEDI` GEDCOM 7, plus `DOCUMENT`).
@@ -13,12 +33,12 @@ All notable changes of gedcom-ts
13
33
  ### Added
14
34
 
15
35
  - **Multimédia GEDCOM 7 (`OBJE`)** : import et export complets des enregistrements `0 @O…@ OBJE` avec plusieurs `FILE`, `FORM`, `MEDI` (`AUDIO`, `PHOTO`, `VIDEO`, …), `PHRASE`, `TITL` et variantes `FILE`.`TRAN` (transcodage, WebVTT).
16
- - **`ReadGed.objeRecordsById`** : map des OBJE absorbés depuis le fichier (round-trip via `GedcomExportOptions.objeRecordsById`).
36
+ - `**ReadGed.objeRecordsById`\*\* : map des OBJE absorbés depuis le fichier (round-trip via `GedcomExportOptions.objeRecordsById`).
17
37
  - **Types et utilitaires OBJE** : `ObjeRecord`, `ObjeFileEntry`, `primaryObjeFileUri`, `parseStandaloneObjeBlock`, `formatObjeRecordBlock`, `guessMediFromForm`, `registerObjeRecord`.
18
38
  - **Entretiens audio / histoire orale** : actes `EVEN` + `TYPE Interview` (ou « Oral history ») avec lien `2 OBJE`, note de transcription (`2 NOTE`) et API dédiée — `createAudioInterviewAct`, `attachAudioInterviewToAct`, `editAct(act).asAudioInterview()`, `editAudioInterviewAct`.
19
39
  - **Détection et lecture** : `isAudioInterviewAct`, `isAudioInterviewEvenType`, `getAudioInterviewTranscription`, `getAudioInterviewMedia`, `getAudioInterviewObjeRecords`, `primaryAudioInterviewUri`, `nextObjeXrefId`.
20
40
  - **Constantes** : `GEDCOM_7_EVEN_TYPE_AUDIO_INTERVIEW`, `GEDCOM_7_EVEN_TYPE_ORAL_HISTORY`.
21
- - **`GedcomExportOptionsEdit.setObjeRecordsById`** / **`clearObjeRecordsById`**.
41
+ - `**GedcomExportOptionsEdit.setObjeRecordsById`** / `**clearObjeRecordsById\*\*`.
22
42
  - **Tests** : `parseStandaloneObje`, `guessMediFromForm`, `audioInterviewAct`, extension des specs export / import `maximal70`.
23
43
 
24
44
  ### Changed
@@ -37,10 +57,10 @@ All notable changes of gedcom-ts
37
57
  ### Added
38
58
 
39
59
  - **Livret multilingue** : traductions dédiées pour les 11 langues du site (`en`, `fr`, `de`, `nl`, `es`, `zh`, `it`, `pt`, `pl`, `ar`, `he`) — messages PDF, dates, lieux, accords de genre et récits narratifs.
40
- - **RTL arabe / hébreu** : `isBookletLocaleRtl`, `bookletTextDirection`, mise en page PDF miroir ; **`bidi-js`** (réordonnancement visuel) et **`naqqash`** (formes contextuelles arabes).
41
- - **Polices PDF intégrées** : Noto Sans Hebrew, Noto Sans Arabic et Noto Sans SC (subset, SIL OFL) en chunks lazy (`dist/font-chunks/`) ; chunk **`booklet-pdf-font-bytes-zh-ext`** (~1,4 MiB) si le GEDCOM contient des hanzi hors subset de base.
60
+ - **RTL arabe / hébreu** : `isBookletLocaleRtl`, `bookletTextDirection`, mise en page PDF miroir ; `**bidi-js`** (réordonnancement visuel) et `**naqqash\*\*` (formes contextuelles arabes).
61
+ - **Polices PDF intégrées** : Noto Sans Hebrew, Noto Sans Arabic et Noto Sans SC (subset, SIL OFL) en chunks lazy (`dist/font-chunks/`) ; chunk `**booklet-pdf-font-bytes-zh-ext`\*\* (~1,4 MiB) si le GEDCOM contient des hanzi hors subset de base.
42
62
  - **Rendu bi-police** : Helvetica pour le latin + Noto pour arabe / hébreu / chinois.
43
- - **Architecture lazy du livret** : locales (`dist/locale-chunks/`), polices, logo SVG et frise canvas (`dist/feature-chunks/`) via `import()` — cœur `gedcom-ts/booklet` ~75 KiB minifié (~100 KiB obfusqué).
63
+ - **Architecture lazy du livret** : locales (`dist/locale-chunks/`), polices, logo SVG et frise canvas (`dist/feature-chunks/`) via `import()` — cœur `gedcom-ts/booklet` ~~75 KiB minifié (~~100 KiB obfusqué).
44
64
  - **Exports TypeScript des chunks** : chaque sous-chemin `gedcom-ts/booklet/locale-chunks/*`, `font-chunks/*` et `feature-chunks/*` expose `types` + `import` / `require`.
45
65
  - **Manifeste unique** : `scripts/booklet-chunk-manifest.mjs` alimente `build.js` et `package.json` (`npm run sync:exports` ou fin de `build:js`).
46
66
  - **API hôte** : `registerBookletPdfFontBytes`, `registerPdfFontkit`, `ensureBookletLocale` — preload explicite des chunks (recommandé Vite/Angular).
@@ -50,11 +70,11 @@ All notable changes of gedcom-ts
50
70
 
51
71
  ### Changed
52
72
 
53
- - **`pdf-lib` externalisé** : peer dependency ; `@pdf-lib/fontkit` chargé à la demande pour `zh` / `ar` / `he`.
73
+ - `**pdf-lib` externalisé\*\* : peer dependency ; `@pdf-lib/fontkit` chargé à la demande pour `zh` / `ar` / `he`.
54
74
  - **Pipeline build livret** : esbuild → réécriture `./…-chunks/` → `gedcom-ts/booklet/…-chunks/` → obfuscation avec `reservedStrings` sur les chemins d’import dynamiques (analyse statique Vite).
55
- - **`resolveBookletLocale`** : retourne la locale demandée (plus de repli silencieux vers l’anglais).
56
- - **`drawGedcomTsLogoOnPage`** : async ; logo lazy (`getGedcomTsLogoPaths()`).
57
- - **`ensureBookletLocale(locale)`** requis avant les APIs sync.
75
+ - `**resolveBookletLocale`\*\* : retourne la locale demandée (plus de repli silencieux vers l’anglais).
76
+ - `**drawGedcomTsLogoOnPage**` : async ; logo lazy (`getGedcomTsLogoPaths()`).
77
+ - `**ensureBookletLocale(locale)**` requis avant les APIs sync.
58
78
  - **Frise chronologique** : titre et libellé « dates inconnues » localisés.
59
79
  - **README** : tableau des tailles, guide d’intégration Vite/Angular.
60
80
 
@@ -73,7 +93,7 @@ All notable changes of gedcom-ts
73
93
 
74
94
  ### Changed
75
95
 
76
- - **`findHarmonizationClustersFromActs`** : si plusieurs libellés similaires partagent une seule position GPS et que tous les actes ont des coordonnées, unifie automatiquement le libellé (libellé le plus long) sans cluster d’harmonisation manuel.
96
+ - `**findHarmonizationClustersFromActs`\*\* : si plusieurs libellés similaires partagent une seule position GPS et que tous les actes ont des coordonnées, unifie automatiquement le libellé (libellé le plus long) sans cluster d’harmonisation manuel.
77
97
  - Critère d’harmonisation : ne signale plus les seules variantes d’orthographe lorsque les coordonnées sont déjà identiques.
78
98
 
79
99
  ## [2026.5.2] - 2026-05-16
@@ -84,27 +104,27 @@ All notable changes of gedcom-ts
84
104
 
85
105
  ### Changed
86
106
 
87
- - **`findHarmonizationClustersFromActs`** : union-find sur `citiesAreSimilar` (corrige le cas Pleurtuit 29+11 actes après géoloc complète).
88
- - **`clusterKeyForCity`** : clé carte basée sur la localité principale (segment avant la virgule), alignée avec le regroupement par similarité.
107
+ - `**findHarmonizationClustersFromActs`\*\* : union-find sur `citiesAreSimilar` (corrige le cas Pleurtuit 29+11 actes après géoloc complète).
108
+ - `**clusterKeyForCity**` : clé carte basée sur la localité principale (segment avant la virgule), alignée avec le regroupement par similarité.
89
109
  - **README** : guide d’intégration géoloc restructuré (section dédiée, tableaux par cas d’usage) ; retrait de la documentation développement interne.
90
110
 
91
111
  ## [2026.5.1] - 2026-05-15
92
112
 
93
113
  ### Added
94
114
 
95
- - **`src/geocode/`** : géocodage Nominatim (`GET /search?q=…&format=jsonv2`), contexte arbre (`inferGeocodeContext`), ranking (`rankGeocodeCandidates`), harmonisation des lieux (`findHarmonizationClusters`, `applyGeocodeCandidateToActs`), utilitaires ville (`normalizeCityKey`, `findCanonicalCityLabel`). `fetch` et `User-Agent` configurables pour les tests.
115
+ - `**src/geocode/`\*\* : géocodage Nominatim (`GET /search?q=…&format=jsonv2`), contexte arbre (`inferGeocodeContext`), ranking (`rankGeocodeCandidates`), harmonisation des lieux (`findHarmonizationClusters`, `applyGeocodeCandidateToActs`), utilitaires ville (`normalizeCityKey`, `findCanonicalCityLabel`). `fetch` et `User-Agent` configurables pour les tests.
96
116
 
97
117
  ### Changed
98
118
 
99
- - **`getCityCoordinates`** : marqué `@deprecated` ; utilise la nouvelle API Nominatim (plus `search.php?city=` ni `XMLHttpRequest`).
119
+ - `**getCityCoordinates**` : marqué `@deprecated` ; utilise la nouvelle API Nominatim (plus `search.php?city=` ni `XMLHttpRequest`).
100
120
 
101
121
  ## [2026.5.0] - 2026-05-15
102
122
 
103
123
  ### Versioning
104
124
 
105
- À partir de cette release, le numéro de version du paquet npm et de **`GEDCOM_LIBRARY_VERSION`** (`src/version.ts`, exporté dans `HEAD`.`SOUR`.`VERS`) suit un schéma **CalVer** :
125
+ À partir de cette release, le numéro de version du paquet npm et de `**GEDCOM_LIBRARY_VERSION**` (`src/version.ts`, exporté dans `HEAD`.`SOUR`.`VERS`) suit un schéma **CalVer** :
106
126
 
107
- - format **`AAAA.M.micro`** (ex. **`2026.5.0`** = mai 2026, première publication de la série) ;
127
+ - format `**AAAA.M.micro`** (ex. `**2026.5.0\*\*` = mai 2026, première publication de la série) ;
108
128
  - remplace l’ancien **semver** (`2.1.0`, `2.0.x`, …) pour les releases applicatives ;
109
129
  - la propriété `version` de `package.json` et `GEDCOM_LIBRARY_VERSION` doivent rester **identiques** (vérifié par `tests/version-package-sync.spec.ts`) ;
110
130
  - les branches de release peuvent porter le même libellé (ex. `2026.5.0`).
@@ -113,7 +133,7 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
113
133
 
114
134
  ### Highlights
115
135
 
116
- - Nouvelle couche **`src/dataset/`** : mutations du graphe `ReadGed`, opérations famille, validation typée, commandes sûres (`try*` / `CommandResult`) et clones.
136
+ - Nouvelle couche `**src/dataset/`\*_ : mutations du graphe `ReadGed`, opérations famille, validation typée, commandes sûres (`try_`/`CommandResult`) et clones.
117
137
  - Extension majeure de la **couche d’édition** (`*Edit`, factories, médias, variants de nom, attributs, options d’export).
118
138
  - **Round-trip des notes sous actes** corrigé (import `2 NOTE` / `3 CONT` après `DATE`, ordre d’export `ActLine`).
119
139
  - Refactor interne : médias centralisés, buffer des enregistrements préservés, `Person.clone` / `Act.clone`.
@@ -122,33 +142,33 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
122
142
 
123
143
  #### Dataset (`src/dataset/`)
124
144
 
125
- - **`readGedMutations`** : `addPersonToReadGed`, `removePersonFromReadGedByIndi` (mise à jour `mapPersons`, `persons`, lieux, `groupPartners`).
126
- - **`ReadGedEdit`** / `editReadGed` : `addPerson`, `removePersonByIndi`, `preserved()` → `PreservedTopLevelEdit` (`append`, `insertAt`, `replaceAt`, `removeAt`, `clear`).
127
- - **`graphOps`** : `nextFamilyId`, `createMarriageFamily`, `linkChildToFamily`, `unlinkChildFromFamily`, `removeFamilyReferencesFromDataset`.
128
- - **`CreateUnionFamilyOptions`** : `eventTag` sur `createMarriageFamily` / `tryCreateMarriageFamily` (défaut `MARR` ; aussi `ENGA`, `MARB`, `MARC`, `MARL`, `MARS`, `EVEN` + `CreateActInit`, etc.) ; constante **`GEDCOM_7_PAIR_UNION_EVENT_TAGS`**.
129
- - **`readGedCommands`** : `tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, `tryCreateMarriageFamily` ; `validate*Command` ; **`CommandResult`** / `commandBlockingIssues`.
130
- - **`validation`** : `ModelConsistencyIssue` avec `code`, `severity` (`error` | `warn`), `validatePerson` / `validateReadGed` ; options `checkMarrParticipants`, `checkDuplicateIndis`, `checkFamcWithoutSpouses`, `checkFamsWithoutSpouses`, `checkDuplicateFamsEntries`, `checkAncestorCycles` ; `assertPersonConsistent` / `assertReadGedConsistent` avec `failOn`.
131
- - **`cloneModels`** : `clonePerson`, `cloneAct` (délèguent à `Person.clone` / `Act.clone`).
145
+ - `**readGedMutations`\*\* : `addPersonToReadGed`, `removePersonFromReadGedByIndi` (mise à jour `mapPersons`, `persons`, lieux, `groupPartners`).
146
+ - `**ReadGedEdit**` / `editReadGed` : `addPerson`, `removePersonByIndi`, `preserved()` → `PreservedTopLevelEdit` (`append`, `insertAt`, `replaceAt`, `removeAt`, `clear`).
147
+ - `**graphOps**` : `nextFamilyId`, `createMarriageFamily`, `linkChildToFamily`, `unlinkChildFromFamily`, `removeFamilyReferencesFromDataset`.
148
+ - `**CreateUnionFamilyOptions**` : `eventTag` sur `createMarriageFamily` / `tryCreateMarriageFamily` (défaut `MARR` ; aussi `ENGA`, `MARB`, `MARC`, `MARL`, `MARS`, `EVEN` + `CreateActInit`, etc.) ; constante `**GEDCOM_7_PAIR_UNION_EVENT_TAGS**`.
149
+ - `**readGedCommands**` : `tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, `tryCreateMarriageFamily` ; `validate*Command` ; `**CommandResult**` / `commandBlockingIssues`.
150
+ - `**validation**` : `ModelConsistencyIssue` avec `code`, `severity` (`error` | `warn`), `validatePerson` / `validateReadGed` ; options `checkMarrParticipants`, `checkDuplicateIndis`, `checkFamcWithoutSpouses`, `checkFamsWithoutSpouses`, `checkDuplicateFamsEntries`, `checkAncestorCycles` ; `assertPersonConsistent` / `assertReadGedConsistent` avec `failOn`.
151
+ - `**cloneModels**` : `clonePerson`, `cloneAct` (délèguent à `Person.clone` / `Act.clone`).
132
152
 
133
153
  #### Import / modèle
134
154
 
135
- - **`PreservedRecordsBuffer`** : encapsulation des blocs `0 …` préservés (`SplitGedcom` / `ReadGed.preservedTopLevelRecords`).
136
- - **`ReadGed.rehydratePlacesFromActs()`** : reconstruction de `placesMap` après édition manuelle du graphe.
137
- - **`importGedcomNote`** : `createNoteFromGedcomPayload`, `appendGedcomNoteSubline`, `isPersonLevelGedcomLine`, `isActLevelGedcomNoteLine`, `isGedcomNoteContinuationTag`.
138
- - **`registerTrackedMedia`** : chemins relatifs uniques pour médias personne / acte.
139
- - **`uriBasename`** : nom de fichier logique depuis une URI média.
140
- - **`clonePrimitives`** : briques de copie profonde partagées (dates, lieux, notes, médias, variants, attributs).
141
- - **`Person.clone(newIndi)`**, **`Act.clone()`** sur les classes domaine.
155
+ - `**PreservedRecordsBuffer**` : encapsulation des blocs `0 …` préservés (`SplitGedcom` / `ReadGed.preservedTopLevelRecords`).
156
+ - `**ReadGed.rehydratePlacesFromActs()**` : reconstruction de `placesMap` après édition manuelle du graphe.
157
+ - `**importGedcomNote**` : `createNoteFromGedcomPayload`, `appendGedcomNoteSubline`, `isPersonLevelGedcomLine`, `isActLevelGedcomNoteLine`, `isGedcomNoteContinuationTag`.
158
+ - `**registerTrackedMedia**` : chemins relatifs uniques pour médias personne / acte.
159
+ - `**uriBasename**` : nom de fichier logique depuis une URI média.
160
+ - `**clonePrimitives**` : briques de copie profonde partagées (dates, lieux, notes, médias, variants, attributs).
161
+ - `**Person.clone(newIndi)**`, `**Act.clone()**` sur les classes domaine.
142
162
 
143
163
  #### Fluent edit layer (extensions)
144
164
 
145
- - **`factories`** : `createAct`, `createNote`, `createPersonStub`, `createPersonNameVariant`, `createIndiAttribute` (+ types `CreateActInit`, `CreatePersonStubInit`).
146
- - **`NoteEdit`** / `editNote` ; **`NotesEdit`** : `addNew`, `insertNewAt`, `removeNote`, `indexOfNote`.
147
- - **`ActMediaEdit`** / **`PersonMediaEdit`** / **`MultimediaFileEdit`** ; **`NameVariantsEdit`** / **`PersonNameVariantEdit`** ; **`IndiAttributesEdit`**.
148
- - **`ActsEdit`** : `addNew`, `insertNewAt`, `removeAct`, `indexOfAct`.
149
- - **`ActEdit`** : `notes()`, `multimedia()`, `clearNotes`, `clearMultimedia`.
150
- - **`PersonEdit`** : `multimedia()`, `nameVariants()`, `attributes()`, `appendFams`, `removeFamsAt`, `removeFamsById`, etc.
151
- - **`GedcomExportOptionsEdit`** / `editGedcomExportOptions` : `setExtraTopLevelRecords`, `setHeadCopyright`, `setHeadDestination`, `setHeadLanguageTag`, `setHeadSchemaTagDefs`, `clear*`.
165
+ - `**factories**` : `createAct`, `createNote`, `createPersonStub`, `createPersonNameVariant`, `createIndiAttribute` (+ types `CreateActInit`, `CreatePersonStubInit`).
166
+ - `**NoteEdit**` / `editNote` ; `**NotesEdit**` : `addNew`, `insertNewAt`, `removeNote`, `indexOfNote`.
167
+ - `**ActMediaEdit**` / `**PersonMediaEdit**` / `**MultimediaFileEdit**` ; `**NameVariantsEdit**` / `**PersonNameVariantEdit**` ; `**IndiAttributesEdit**`.
168
+ - `**ActsEdit**` : `addNew`, `insertNewAt`, `removeAct`, `indexOfAct`.
169
+ - `**ActEdit**` : `notes()`, `multimedia()`, `clearNotes`, `clearMultimedia`.
170
+ - `**PersonEdit**` : `multimedia()`, `nameVariants()`, `attributes()`, `appendFams`, `removeFamsAt`, `removeFamsById`, etc.
171
+ - `**GedcomExportOptionsEdit**` / `editGedcomExportOptions` : `setExtraTopLevelRecords`, `setHeadCopyright`, `setHeadDestination`, `setHeadLanguageTag`, `setHeadSchemaTagDefs`, `clear*`.
152
172
 
153
173
  #### Public API (`src/index.ts`)
154
174
 
@@ -169,17 +189,17 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
169
189
 
170
190
  ### Changed
171
191
 
172
- - **`ReadGed`** : `addPerson` / `removePersonByIndi` retirés de la classe ; préférer `editReadGed` ou `addPersonToReadGed` / `removePersonFromReadGedByIndi`.
173
- - **`Person.addMultimedia` / `addMultimediaFromUri`** et **`Act.addMultimedia` / `addMultimediaFromUri`** : délégation à `registerTrackedMedia`.
174
- - **`SplitGedcom`** : liste préservée via `PreservedRecordsBuffer` au lieu d’un tableau interne brut.
175
- - **`package.json`** / **`package-lock.json`** : version **`2026.5.0`** (CalVer).
192
+ - `**ReadGed`\*\* : `addPerson` / `removePersonByIndi` retirés de la classe ; préférer `editReadGed` ou `addPersonToReadGed` / `removePersonFromReadGedByIndi`.
193
+ - `**Person.addMultimedia` / `addMultimediaFromUri**` et `**Act.addMultimedia` / `addMultimediaFromUri**` : délégation à `registerTrackedMedia`.
194
+ - `**SplitGedcom**` : liste préservée via `PreservedRecordsBuffer` au lieu d’un tableau interne brut.
195
+ - `**package.json**` / `**package-lock.json**` : version `**2026.5.0**` (CalVer).
176
196
  - CI (`.gitlab-ci.yml`) : ajustements mineurs liés à la release.
177
197
 
178
198
  ### Fixed
179
199
 
180
200
  - **Notes d’acte au réimport** : `parsePersonLine` n’attache plus les `NOTE` de niveau 2 au individu ; `convertToActs` traite `2 NOTE` et `3 CONC`/`CONT` **avant** les blocs `pendingAfterDate` / `Plac` / `Sdate`, ce qui évite de perdre les `3 CONT` lorsque l’export place la note après `DATE` (`ActLine`).
181
- - **`ReadGedEdit.addPerson`** : discrimination TypeScript correcte sur `CommandResult` (`r.ok === false`).
182
- - Alignement **`GEDCOM_LIBRARY_VERSION`****`package.json`** pour la série `2026.5.0`.
201
+ - `**ReadGedEdit.addPerson`\*\* : discrimination TypeScript correcte sur `CommandResult` (`r.ok === false`).
202
+ - Alignement `**GEDCOM_LIBRARY_VERSION**` ↔ `**package.json**` pour la série `2026.5.0`.
183
203
 
184
204
  ## [2.1.0] - 2026-05-13
185
205
 
@@ -201,44 +221,44 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
201
221
 
202
222
  #### Export
203
223
 
204
- - `GedcomExportOptions` enrichies : `extraTopLevelRecords` (round-trip), `headLanguageTag`, **`headCopyright`** (`1 COPR`), **`headDestination`** (`1 DEST`), **`headSchemaTagDefs`** (`HEAD`.`SCHMA` / `2 TAG …`).
205
- - `HEAD`.`SOUR` structuré : émission de **`2 VERS`** + **`2 NAME`** sous `SOUR`, en plus du `CHAR` / `LANG` standard.
206
- - Constante **`GEDCOM_LIBRARY_VERSION`** (`src/version.ts`, alignée sur `package.json` via test) utilisée pour `2 VERS` à l’export.
207
- - **FAM** : sexes U / X / indéfini sont exportés en **`1 HUSB`** (placeholder GEDCOM moins biaisé que `WIFE`).
224
+ - `GedcomExportOptions` enrichies : `extraTopLevelRecords` (round-trip), `headLanguageTag`, `**headCopyright`** (`1 COPR`), `**headDestination**` (`1 DEST`), `**headSchemaTagDefs\*\*` (`HEAD`.`SCHMA`/`2 TAG …`).
225
+ - `HEAD`.`SOUR` structuré : émission de `**2 VERS**` + `**2 NAME**` sous `SOUR`, en plus du `CHAR` / `LANG` standard.
226
+ - Constante `**GEDCOM_LIBRARY_VERSION**` (`src/version.ts`, alignée sur `package.json` via test) utilisée pour `2 VERS` à l’export.
227
+ - **FAM** : sexes U / X / indéfini sont exportés en `**1 HUSB`\*\* (placeholder GEDCOM moins biaisé que `WIFE`).
208
228
 
209
229
  #### Domain model — dates, places, events (P1.4)
210
230
 
211
- - **`DateAct`** :
231
+ - `**DateAct**` :
212
232
  - qualificateurs **INT**, **EST**, **CAL** ;
213
- - phrase finale `(...)` et **`datePhrase`** ;
214
- - import **`3 PHRASE`** sous `DATE` ;
215
- - **`3 TIME`** sous `DATE` / **`SDATE`** (`dateTime`) ;
216
- - entrée date **`YYYY-MM-DD`** / **`YYYY-MM`** ;
217
- - **`verbatimDatePayload`** pour charges non typées (URI, texte hors parseur) ;
233
+ - phrase finale `(...)` et `**datePhrase`\*\* ;
234
+ - import `**3 PHRASE**` sous `DATE` ;
235
+ - `**3 TIME**` sous `DATE` / `**SDATE**` (`dateTime`) ;
236
+ - entrée date `**YYYY-MM-DD**` / `**YYYY-MM**` ;
237
+ - `**verbatimDatePayload**` pour charges non typées (URI, texte hors parseur) ;
218
238
  - tolérance `(...)` sur les bornes d’intervalles (`parseCoreDateValue`) ;
219
- - format mois/année slash strict **`d{1,2}/d{2,4}`** uniquement (évite les faux positifs sur URL).
220
- - **`Act`** :
221
- - **`2 SDATE`** (+ sous-lignes) sur `sdateAct` ;
222
- - **`2 PHRASE`** niveau événement (`eventPhrases`) ;
223
- - **`preservedSubrecordPrefix`** / **`preservedSubrecordSuffix`** pour sous-lignes non modélisées (`HUSB`/`AGE`/`4 PHRASE`, `3 DATE` sous `STAT`, …) avec ré-export ;
224
- - tri des actes : **`DATE`** sinon **`SDATE`** valide.
225
- - **`Place`** : **`placPhrase`** et import **`3 PHRASE`** direct sous `PLAC` ; export **`3 PHRASE`** pour date et lieu quand présents ; export **`3 TIME`** / blocs **`SDATE`** / **`2 PHRASE`** événement.
239
+ - format mois/année slash strict `**d{1,2}/d{2,4}**` uniquement (évite les faux positifs sur URL).
240
+ - `**Act**` :
241
+ - `**2 SDATE**` (+ sous-lignes) sur `sdateAct` ;
242
+ - `**2 PHRASE**` niveau événement (`eventPhrases`) ;
243
+ - `**preservedSubrecordPrefix**` / `**preservedSubrecordSuffix**` pour sous-lignes non modélisées (`HUSB`/`AGE`/`4 PHRASE`, `3 DATE` sous `STAT`, …) avec ré-export ;
244
+ - tri des actes : `**DATE**` sinon `**SDATE**` valide.
245
+ - `**Place**` : `**placPhrase**` et import `**3 PHRASE**` direct sous `PLAC` ; export `**3 PHRASE**` pour date et lieu quand présents ; export `**3 TIME**` / blocs `**SDATE**` / `**2 PHRASE**` événement.
226
246
 
227
247
  #### Fluent edit layer
228
248
 
229
249
  - Nouveau module `src/edit/` réexporté depuis la racine du paquet :
230
- - **`editPerson`** / `PersonEdit` (identité, liens `FAMC` / `FAMS`, name variants, attributes, accès chaîné à `acts()` / `notes()`) ;
231
- - **`editActs`** / `ActsEdit` (add, replaceAt, removeAt, clear, sortByDate, at) ;
232
- - **`editAct`** / `ActEdit` (type, indis, date, sdate, place, EVEN, phrases, preserved prefix/suffix) ;
233
- - **`editDateAct`** / `DateActEdit` (clear, applyGedcomPayload, setExactDate, setQualified, setBetween, setFromTo, setTime, setDatePhrase, setVerbatimPayload) ;
234
- - **`editPlace`** / `PlaceEdit` (city/county/state/country, GEDCOM 7 payload, placPhrase, coordinates) ;
235
- - **`editNotes`** / `NotesEdit` (add, replaceAt, removeAt, clear) ;
250
+ - `**editPerson**` / `PersonEdit` (identité, liens `FAMC` / `FAMS`, name variants, attributes, accès chaîné à `acts()` / `notes()`) ;
251
+ - `**editActs**` / `ActsEdit` (add, replaceAt, removeAt, clear, sortByDate, at) ;
252
+ - `**editAct**` / `ActEdit` (type, indis, date, sdate, place, EVEN, phrases, preserved prefix/suffix) ;
253
+ - `**editDateAct**` / `DateActEdit` (clear, applyGedcomPayload, setExactDate, setQualified, setBetween, setFromTo, setTime, setDatePhrase, setVerbatimPayload) ;
254
+ - `**editPlace**` / `PlaceEdit` (city/county/state/country, GEDCOM 7 payload, placPhrase, coordinates) ;
255
+ - `**editNotes**` / `NotesEdit` (add, replaceAt, removeAt, clear) ;
236
256
  - chaînage cohérent (`this`) sur le modèle existant, mutation in-place.
237
257
 
238
258
  #### Public API surface
239
259
 
240
260
  - Types exportés : `PersonGedcomImportOptions`, `GedcomExportOptions`, `TypeDateActSimpleQualifier`, `Gedcom7EventTag`, `IndiGedcomSubLine`, `GedcomDatasetVersion`.
241
- - Classes / valeurs réexportées depuis l’index : `PersonNameVariant`, `PersonNameTranslation`, `IndiAttribute`, `ActConstructionOptions`, `GEDCOM_7_ALL_EVENT_TAGS`, `GEDCOM_7_EVENT_SORT_ORDER`, `GEDCOM_7_EVENT_TAG_SET`, `selectPrimaryNameVariant`, `extractPersonNameVariants`, `extractIndiAttributes`, `createEmptyReadGed`, `IMPORT_ERR_ZIP_GED_UNREADABLE`, **`GEDCOM_LIBRARY_VERSION`**.
261
+ - Classes / valeurs réexportées depuis l’index : `PersonNameVariant`, `PersonNameTranslation`, `IndiAttribute`, `ActConstructionOptions`, `GEDCOM_7_ALL_EVENT_TAGS`, `GEDCOM_7_EVENT_SORT_ORDER`, `GEDCOM_7_EVENT_TAG_SET`, `selectPrimaryNameVariant`, `extractPersonNameVariants`, `extractIndiAttributes`, `createEmptyReadGed`, `IMPORT_ERR_ZIP_GED_UNREADABLE`, `**GEDCOM_LIBRARY_VERSION**`.
242
262
 
243
263
  #### Tests
244
264
 
@@ -252,12 +272,12 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
252
272
 
253
273
  ### Changed
254
274
 
255
- - Export `FAM` : sexe inconnu / non binaire / absent (`U`, `X`, `undefined`) émet **`1 HUSB`** au lieu de **`1 WIFE`** pour le rôle conjoint (placeholder GEDCOM moins biaisé).
275
+ - Export `FAM` : sexe inconnu / non binaire / absent (`U`, `X`, `undefined`) émet `**1 HUSB`** au lieu de `**1 WIFE\*\*` pour le rôle conjoint (placeholder GEDCOM moins biaisé).
256
276
 
257
277
  ### Fixed
258
278
 
259
279
  - Export GEDCOM : terminaison correcte `0 TRLR` avec saut de ligne (au lieu du seul tag `TRLR`).
260
- - **`ReadGed.groupPartners()`** : les cartes `partnersMap` et `childsMap` sont vidées avant reconstruction, afin que des rappels successifs (après édition des liens en mémoire) ne dupliquent plus conjoints ni enfants.
280
+ - `**ReadGed.groupPartners()**` : les cartes `partnersMap` et `childsMap` sont vidées avant reconstruction, afin que des rappels successifs (après édition des liens en mémoire) ne dupliquent plus conjoints ni enfants.
261
281
 
262
282
  ## [2.0.4] - 2026-05-11
263
283
 
@@ -383,7 +403,6 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
383
403
  - jest / test in Person / runner
384
404
  - createDirectAncestries
385
405
 
386
-
387
406
  ## 1.0.3 - 2019-10-01
388
407
 
389
408
  ### Added
@@ -393,7 +412,7 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
393
412
  ## 1.0.2-alpha - 2019-09-01
394
413
 
395
414
  ### Added
396
-
415
+
397
416
  - export for birth and death in gedcom
398
417
  - All identificators can be used for a developper. It's an enum of properties used for all gedcom
399
418
  - City is removed and replaced by Place. Place gets more informations