gedcom-ts 2026.6.0 → 2026.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,17 +2,37 @@
2
2
 
3
3
  All notable changes of gedcom-ts
4
4
 
5
+ ## [2026.6.2] - 2026-06-12
6
+
7
+ ### Fixed
8
+
9
+ - **`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.
10
+ - **Qualificateurs de date** : `ABT`, `BEF`, `AFT`, … reconnus en minuscules ; plages `BET … AND …` et `FROM … TO …` insensibles à la casse.
11
+
12
+ ## [2026.6.1] - 2026-06-09
13
+
14
+ ### Changed
15
+
16
+ - **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.
17
+ - **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).
18
+ - **Progression import / export** : `ImportGedFileOptions.onProgress` et `GedcomExportOptions.onProgress` (`GedcomTransferProgress`, phases `zip-extract`, `gedcom-parse`, `zip-build`, …).
19
+ - **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.
20
+
21
+ ### Fixed
22
+
23
+ - **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`).
24
+
5
25
  ## [2026.6.0] - 2026-06-01
6
26
 
7
27
  ### Added
8
28
 
9
29
  - **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).
10
- - **`ReadGed.objeRecordsById`** : map des OBJE absorbés depuis le fichier (round-trip via `GedcomExportOptions.objeRecordsById`).
30
+ - `**ReadGed.objeRecordsById`\*\* : map des OBJE absorbés depuis le fichier (round-trip via `GedcomExportOptions.objeRecordsById`).
11
31
  - **Types et utilitaires OBJE** : `ObjeRecord`, `ObjeFileEntry`, `primaryObjeFileUri`, `parseStandaloneObjeBlock`, `formatObjeRecordBlock`, `guessMediFromForm`, `registerObjeRecord`.
12
32
  - **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`.
13
33
  - **Détection et lecture** : `isAudioInterviewAct`, `isAudioInterviewEvenType`, `getAudioInterviewTranscription`, `getAudioInterviewMedia`, `getAudioInterviewObjeRecords`, `primaryAudioInterviewUri`, `nextObjeXrefId`.
14
34
  - **Constantes** : `GEDCOM_7_EVEN_TYPE_AUDIO_INTERVIEW`, `GEDCOM_7_EVEN_TYPE_ORAL_HISTORY`.
15
- - **`GedcomExportOptionsEdit.setObjeRecordsById`** / **`clearObjeRecordsById`**.
35
+ - `**GedcomExportOptionsEdit.setObjeRecordsById`** / `**clearObjeRecordsById\*\*`.
16
36
  - **Tests** : `parseStandaloneObje`, `guessMediFromForm`, `audioInterviewAct`, extension des specs export / import `maximal70`.
17
37
 
18
38
  ### Changed
@@ -31,10 +51,10 @@ All notable changes of gedcom-ts
31
51
  ### Added
32
52
 
33
53
  - **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.
34
- - **RTL arabe / hébreu** : `isBookletLocaleRtl`, `bookletTextDirection`, mise en page PDF miroir ; **`bidi-js`** (réordonnancement visuel) et **`naqqash`** (formes contextuelles arabes).
35
- - **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.
54
+ - **RTL arabe / hébreu** : `isBookletLocaleRtl`, `bookletTextDirection`, mise en page PDF miroir ; `**bidi-js`** (réordonnancement visuel) et `**naqqash\*\*` (formes contextuelles arabes).
55
+ - **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.
36
56
  - **Rendu bi-police** : Helvetica pour le latin + Noto pour arabe / hébreu / chinois.
37
- - **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é).
57
+ - **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é).
38
58
  - **Exports TypeScript des chunks** : chaque sous-chemin `gedcom-ts/booklet/locale-chunks/*`, `font-chunks/*` et `feature-chunks/*` expose `types` + `import` / `require`.
39
59
  - **Manifeste unique** : `scripts/booklet-chunk-manifest.mjs` alimente `build.js` et `package.json` (`npm run sync:exports` ou fin de `build:js`).
40
60
  - **API hôte** : `registerBookletPdfFontBytes`, `registerPdfFontkit`, `ensureBookletLocale` — preload explicite des chunks (recommandé Vite/Angular).
@@ -44,11 +64,11 @@ All notable changes of gedcom-ts
44
64
 
45
65
  ### Changed
46
66
 
47
- - **`pdf-lib` externalisé** : peer dependency ; `@pdf-lib/fontkit` chargé à la demande pour `zh` / `ar` / `he`.
67
+ - `**pdf-lib` externalisé\*\* : peer dependency ; `@pdf-lib/fontkit` chargé à la demande pour `zh` / `ar` / `he`.
48
68
  - **Pipeline build livret** : esbuild → réécriture `./…-chunks/` → `gedcom-ts/booklet/…-chunks/` → obfuscation avec `reservedStrings` sur les chemins d’import dynamiques (analyse statique Vite).
49
- - **`resolveBookletLocale`** : retourne la locale demandée (plus de repli silencieux vers l’anglais).
50
- - **`drawGedcomTsLogoOnPage`** : async ; logo lazy (`getGedcomTsLogoPaths()`).
51
- - **`ensureBookletLocale(locale)`** requis avant les APIs sync.
69
+ - `**resolveBookletLocale`\*\* : retourne la locale demandée (plus de repli silencieux vers l’anglais).
70
+ - `**drawGedcomTsLogoOnPage**` : async ; logo lazy (`getGedcomTsLogoPaths()`).
71
+ - `**ensureBookletLocale(locale)**` requis avant les APIs sync.
52
72
  - **Frise chronologique** : titre et libellé « dates inconnues » localisés.
53
73
  - **README** : tableau des tailles, guide d’intégration Vite/Angular.
54
74
 
@@ -67,7 +87,7 @@ All notable changes of gedcom-ts
67
87
 
68
88
  ### Changed
69
89
 
70
- - **`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.
90
+ - `**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.
71
91
  - Critère d’harmonisation : ne signale plus les seules variantes d’orthographe lorsque les coordonnées sont déjà identiques.
72
92
 
73
93
  ## [2026.5.2] - 2026-05-16
@@ -78,27 +98,27 @@ All notable changes of gedcom-ts
78
98
 
79
99
  ### Changed
80
100
 
81
- - **`findHarmonizationClustersFromActs`** : union-find sur `citiesAreSimilar` (corrige le cas Pleurtuit 29+11 actes après géoloc complète).
82
- - **`clusterKeyForCity`** : clé carte basée sur la localité principale (segment avant la virgule), alignée avec le regroupement par similarité.
101
+ - `**findHarmonizationClustersFromActs`\*\* : union-find sur `citiesAreSimilar` (corrige le cas Pleurtuit 29+11 actes après géoloc complète).
102
+ - `**clusterKeyForCity**` : clé carte basée sur la localité principale (segment avant la virgule), alignée avec le regroupement par similarité.
83
103
  - **README** : guide d’intégration géoloc restructuré (section dédiée, tableaux par cas d’usage) ; retrait de la documentation développement interne.
84
104
 
85
105
  ## [2026.5.1] - 2026-05-15
86
106
 
87
107
  ### Added
88
108
 
89
- - **`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.
109
+ - `**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.
90
110
 
91
111
  ### Changed
92
112
 
93
- - **`getCityCoordinates`** : marqué `@deprecated` ; utilise la nouvelle API Nominatim (plus `search.php?city=` ni `XMLHttpRequest`).
113
+ - `**getCityCoordinates**` : marqué `@deprecated` ; utilise la nouvelle API Nominatim (plus `search.php?city=` ni `XMLHttpRequest`).
94
114
 
95
115
  ## [2026.5.0] - 2026-05-15
96
116
 
97
117
  ### Versioning
98
118
 
99
- À 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** :
119
+ À 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** :
100
120
 
101
- - format **`AAAA.M.micro`** (ex. **`2026.5.0`** = mai 2026, première publication de la série) ;
121
+ - format `**AAAA.M.micro`** (ex. `**2026.5.0\*\*` = mai 2026, première publication de la série) ;
102
122
  - remplace l’ancien **semver** (`2.1.0`, `2.0.x`, …) pour les releases applicatives ;
103
123
  - la propriété `version` de `package.json` et `GEDCOM_LIBRARY_VERSION` doivent rester **identiques** (vérifié par `tests/version-package-sync.spec.ts`) ;
104
124
  - les branches de release peuvent porter le même libellé (ex. `2026.5.0`).
@@ -107,7 +127,7 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
107
127
 
108
128
  ### Highlights
109
129
 
110
- - Nouvelle couche **`src/dataset/`** : mutations du graphe `ReadGed`, opérations famille, validation typée, commandes sûres (`try*` / `CommandResult`) et clones.
130
+ - Nouvelle couche `**src/dataset/`\*_ : mutations du graphe `ReadGed`, opérations famille, validation typée, commandes sûres (`try_`/`CommandResult`) et clones.
111
131
  - Extension majeure de la **couche d’édition** (`*Edit`, factories, médias, variants de nom, attributs, options d’export).
112
132
  - **Round-trip des notes sous actes** corrigé (import `2 NOTE` / `3 CONT` après `DATE`, ordre d’export `ActLine`).
113
133
  - Refactor interne : médias centralisés, buffer des enregistrements préservés, `Person.clone` / `Act.clone`.
@@ -116,33 +136,33 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
116
136
 
117
137
  #### Dataset (`src/dataset/`)
118
138
 
119
- - **`readGedMutations`** : `addPersonToReadGed`, `removePersonFromReadGedByIndi` (mise à jour `mapPersons`, `persons`, lieux, `groupPartners`).
120
- - **`ReadGedEdit`** / `editReadGed` : `addPerson`, `removePersonByIndi`, `preserved()` → `PreservedTopLevelEdit` (`append`, `insertAt`, `replaceAt`, `removeAt`, `clear`).
121
- - **`graphOps`** : `nextFamilyId`, `createMarriageFamily`, `linkChildToFamily`, `unlinkChildFromFamily`, `removeFamilyReferencesFromDataset`.
122
- - **`CreateUnionFamilyOptions`** : `eventTag` sur `createMarriageFamily` / `tryCreateMarriageFamily` (défaut `MARR` ; aussi `ENGA`, `MARB`, `MARC`, `MARL`, `MARS`, `EVEN` + `CreateActInit`, etc.) ; constante **`GEDCOM_7_PAIR_UNION_EVENT_TAGS`**.
123
- - **`readGedCommands`** : `tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, `tryCreateMarriageFamily` ; `validate*Command` ; **`CommandResult`** / `commandBlockingIssues`.
124
- - **`validation`** : `ModelConsistencyIssue` avec `code`, `severity` (`error` | `warn`), `validatePerson` / `validateReadGed` ; options `checkMarrParticipants`, `checkDuplicateIndis`, `checkFamcWithoutSpouses`, `checkFamsWithoutSpouses`, `checkDuplicateFamsEntries`, `checkAncestorCycles` ; `assertPersonConsistent` / `assertReadGedConsistent` avec `failOn`.
125
- - **`cloneModels`** : `clonePerson`, `cloneAct` (délèguent à `Person.clone` / `Act.clone`).
139
+ - `**readGedMutations`\*\* : `addPersonToReadGed`, `removePersonFromReadGedByIndi` (mise à jour `mapPersons`, `persons`, lieux, `groupPartners`).
140
+ - `**ReadGedEdit**` / `editReadGed` : `addPerson`, `removePersonByIndi`, `preserved()` → `PreservedTopLevelEdit` (`append`, `insertAt`, `replaceAt`, `removeAt`, `clear`).
141
+ - `**graphOps**` : `nextFamilyId`, `createMarriageFamily`, `linkChildToFamily`, `unlinkChildFromFamily`, `removeFamilyReferencesFromDataset`.
142
+ - `**CreateUnionFamilyOptions**` : `eventTag` sur `createMarriageFamily` / `tryCreateMarriageFamily` (défaut `MARR` ; aussi `ENGA`, `MARB`, `MARC`, `MARL`, `MARS`, `EVEN` + `CreateActInit`, etc.) ; constante `**GEDCOM_7_PAIR_UNION_EVENT_TAGS**`.
143
+ - `**readGedCommands**` : `tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, `tryCreateMarriageFamily` ; `validate*Command` ; `**CommandResult**` / `commandBlockingIssues`.
144
+ - `**validation**` : `ModelConsistencyIssue` avec `code`, `severity` (`error` | `warn`), `validatePerson` / `validateReadGed` ; options `checkMarrParticipants`, `checkDuplicateIndis`, `checkFamcWithoutSpouses`, `checkFamsWithoutSpouses`, `checkDuplicateFamsEntries`, `checkAncestorCycles` ; `assertPersonConsistent` / `assertReadGedConsistent` avec `failOn`.
145
+ - `**cloneModels**` : `clonePerson`, `cloneAct` (délèguent à `Person.clone` / `Act.clone`).
126
146
 
127
147
  #### Import / modèle
128
148
 
129
- - **`PreservedRecordsBuffer`** : encapsulation des blocs `0 …` préservés (`SplitGedcom` / `ReadGed.preservedTopLevelRecords`).
130
- - **`ReadGed.rehydratePlacesFromActs()`** : reconstruction de `placesMap` après édition manuelle du graphe.
131
- - **`importGedcomNote`** : `createNoteFromGedcomPayload`, `appendGedcomNoteSubline`, `isPersonLevelGedcomLine`, `isActLevelGedcomNoteLine`, `isGedcomNoteContinuationTag`.
132
- - **`registerTrackedMedia`** : chemins relatifs uniques pour médias personne / acte.
133
- - **`uriBasename`** : nom de fichier logique depuis une URI média.
134
- - **`clonePrimitives`** : briques de copie profonde partagées (dates, lieux, notes, médias, variants, attributs).
135
- - **`Person.clone(newIndi)`**, **`Act.clone()`** sur les classes domaine.
149
+ - `**PreservedRecordsBuffer**` : encapsulation des blocs `0 …` préservés (`SplitGedcom` / `ReadGed.preservedTopLevelRecords`).
150
+ - `**ReadGed.rehydratePlacesFromActs()**` : reconstruction de `placesMap` après édition manuelle du graphe.
151
+ - `**importGedcomNote**` : `createNoteFromGedcomPayload`, `appendGedcomNoteSubline`, `isPersonLevelGedcomLine`, `isActLevelGedcomNoteLine`, `isGedcomNoteContinuationTag`.
152
+ - `**registerTrackedMedia**` : chemins relatifs uniques pour médias personne / acte.
153
+ - `**uriBasename**` : nom de fichier logique depuis une URI média.
154
+ - `**clonePrimitives**` : briques de copie profonde partagées (dates, lieux, notes, médias, variants, attributs).
155
+ - `**Person.clone(newIndi)**`, `**Act.clone()**` sur les classes domaine.
136
156
 
137
157
  #### Fluent edit layer (extensions)
138
158
 
139
- - **`factories`** : `createAct`, `createNote`, `createPersonStub`, `createPersonNameVariant`, `createIndiAttribute` (+ types `CreateActInit`, `CreatePersonStubInit`).
140
- - **`NoteEdit`** / `editNote` ; **`NotesEdit`** : `addNew`, `insertNewAt`, `removeNote`, `indexOfNote`.
141
- - **`ActMediaEdit`** / **`PersonMediaEdit`** / **`MultimediaFileEdit`** ; **`NameVariantsEdit`** / **`PersonNameVariantEdit`** ; **`IndiAttributesEdit`**.
142
- - **`ActsEdit`** : `addNew`, `insertNewAt`, `removeAct`, `indexOfAct`.
143
- - **`ActEdit`** : `notes()`, `multimedia()`, `clearNotes`, `clearMultimedia`.
144
- - **`PersonEdit`** : `multimedia()`, `nameVariants()`, `attributes()`, `appendFams`, `removeFamsAt`, `removeFamsById`, etc.
145
- - **`GedcomExportOptionsEdit`** / `editGedcomExportOptions` : `setExtraTopLevelRecords`, `setHeadCopyright`, `setHeadDestination`, `setHeadLanguageTag`, `setHeadSchemaTagDefs`, `clear*`.
159
+ - `**factories**` : `createAct`, `createNote`, `createPersonStub`, `createPersonNameVariant`, `createIndiAttribute` (+ types `CreateActInit`, `CreatePersonStubInit`).
160
+ - `**NoteEdit**` / `editNote` ; `**NotesEdit**` : `addNew`, `insertNewAt`, `removeNote`, `indexOfNote`.
161
+ - `**ActMediaEdit**` / `**PersonMediaEdit**` / `**MultimediaFileEdit**` ; `**NameVariantsEdit**` / `**PersonNameVariantEdit**` ; `**IndiAttributesEdit**`.
162
+ - `**ActsEdit**` : `addNew`, `insertNewAt`, `removeAct`, `indexOfAct`.
163
+ - `**ActEdit**` : `notes()`, `multimedia()`, `clearNotes`, `clearMultimedia`.
164
+ - `**PersonEdit**` : `multimedia()`, `nameVariants()`, `attributes()`, `appendFams`, `removeFamsAt`, `removeFamsById`, etc.
165
+ - `**GedcomExportOptionsEdit**` / `editGedcomExportOptions` : `setExtraTopLevelRecords`, `setHeadCopyright`, `setHeadDestination`, `setHeadLanguageTag`, `setHeadSchemaTagDefs`, `clear*`.
146
166
 
147
167
  #### Public API (`src/index.ts`)
148
168
 
@@ -163,17 +183,17 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
163
183
 
164
184
  ### Changed
165
185
 
166
- - **`ReadGed`** : `addPerson` / `removePersonByIndi` retirés de la classe ; préférer `editReadGed` ou `addPersonToReadGed` / `removePersonFromReadGedByIndi`.
167
- - **`Person.addMultimedia` / `addMultimediaFromUri`** et **`Act.addMultimedia` / `addMultimediaFromUri`** : délégation à `registerTrackedMedia`.
168
- - **`SplitGedcom`** : liste préservée via `PreservedRecordsBuffer` au lieu d’un tableau interne brut.
169
- - **`package.json`** / **`package-lock.json`** : version **`2026.5.0`** (CalVer).
186
+ - `**ReadGed`\*\* : `addPerson` / `removePersonByIndi` retirés de la classe ; préférer `editReadGed` ou `addPersonToReadGed` / `removePersonFromReadGedByIndi`.
187
+ - `**Person.addMultimedia` / `addMultimediaFromUri**` et `**Act.addMultimedia` / `addMultimediaFromUri**` : délégation à `registerTrackedMedia`.
188
+ - `**SplitGedcom**` : liste préservée via `PreservedRecordsBuffer` au lieu d’un tableau interne brut.
189
+ - `**package.json**` / `**package-lock.json**` : version `**2026.5.0**` (CalVer).
170
190
  - CI (`.gitlab-ci.yml`) : ajustements mineurs liés à la release.
171
191
 
172
192
  ### Fixed
173
193
 
174
194
  - **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`).
175
- - **`ReadGedEdit.addPerson`** : discrimination TypeScript correcte sur `CommandResult` (`r.ok === false`).
176
- - Alignement **`GEDCOM_LIBRARY_VERSION`****`package.json`** pour la série `2026.5.0`.
195
+ - `**ReadGedEdit.addPerson`\*\* : discrimination TypeScript correcte sur `CommandResult` (`r.ok === false`).
196
+ - Alignement `**GEDCOM_LIBRARY_VERSION**` ↔ `**package.json**` pour la série `2026.5.0`.
177
197
 
178
198
  ## [2.1.0] - 2026-05-13
179
199
 
@@ -195,44 +215,44 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
195
215
 
196
216
  #### Export
197
217
 
198
- - `GedcomExportOptions` enrichies : `extraTopLevelRecords` (round-trip), `headLanguageTag`, **`headCopyright`** (`1 COPR`), **`headDestination`** (`1 DEST`), **`headSchemaTagDefs`** (`HEAD`.`SCHMA` / `2 TAG …`).
199
- - `HEAD`.`SOUR` structuré : émission de **`2 VERS`** + **`2 NAME`** sous `SOUR`, en plus du `CHAR` / `LANG` standard.
200
- - Constante **`GEDCOM_LIBRARY_VERSION`** (`src/version.ts`, alignée sur `package.json` via test) utilisée pour `2 VERS` à l’export.
201
- - **FAM** : sexes U / X / indéfini sont exportés en **`1 HUSB`** (placeholder GEDCOM moins biaisé que `WIFE`).
218
+ - `GedcomExportOptions` enrichies : `extraTopLevelRecords` (round-trip), `headLanguageTag`, `**headCopyright`** (`1 COPR`), `**headDestination**` (`1 DEST`), `**headSchemaTagDefs\*\*` (`HEAD`.`SCHMA`/`2 TAG …`).
219
+ - `HEAD`.`SOUR` structuré : émission de `**2 VERS**` + `**2 NAME**` sous `SOUR`, en plus du `CHAR` / `LANG` standard.
220
+ - Constante `**GEDCOM_LIBRARY_VERSION**` (`src/version.ts`, alignée sur `package.json` via test) utilisée pour `2 VERS` à l’export.
221
+ - **FAM** : sexes U / X / indéfini sont exportés en `**1 HUSB`\*\* (placeholder GEDCOM moins biaisé que `WIFE`).
202
222
 
203
223
  #### Domain model — dates, places, events (P1.4)
204
224
 
205
- - **`DateAct`** :
225
+ - `**DateAct**` :
206
226
  - qualificateurs **INT**, **EST**, **CAL** ;
207
- - phrase finale `(...)` et **`datePhrase`** ;
208
- - import **`3 PHRASE`** sous `DATE` ;
209
- - **`3 TIME`** sous `DATE` / **`SDATE`** (`dateTime`) ;
210
- - entrée date **`YYYY-MM-DD`** / **`YYYY-MM`** ;
211
- - **`verbatimDatePayload`** pour charges non typées (URI, texte hors parseur) ;
227
+ - phrase finale `(...)` et `**datePhrase`\*\* ;
228
+ - import `**3 PHRASE**` sous `DATE` ;
229
+ - `**3 TIME**` sous `DATE` / `**SDATE**` (`dateTime`) ;
230
+ - entrée date `**YYYY-MM-DD**` / `**YYYY-MM**` ;
231
+ - `**verbatimDatePayload**` pour charges non typées (URI, texte hors parseur) ;
212
232
  - tolérance `(...)` sur les bornes d’intervalles (`parseCoreDateValue`) ;
213
- - format mois/année slash strict **`d{1,2}/d{2,4}`** uniquement (évite les faux positifs sur URL).
214
- - **`Act`** :
215
- - **`2 SDATE`** (+ sous-lignes) sur `sdateAct` ;
216
- - **`2 PHRASE`** niveau événement (`eventPhrases`) ;
217
- - **`preservedSubrecordPrefix`** / **`preservedSubrecordSuffix`** pour sous-lignes non modélisées (`HUSB`/`AGE`/`4 PHRASE`, `3 DATE` sous `STAT`, …) avec ré-export ;
218
- - tri des actes : **`DATE`** sinon **`SDATE`** valide.
219
- - **`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.
233
+ - format mois/année slash strict `**d{1,2}/d{2,4}**` uniquement (évite les faux positifs sur URL).
234
+ - `**Act**` :
235
+ - `**2 SDATE**` (+ sous-lignes) sur `sdateAct` ;
236
+ - `**2 PHRASE**` niveau événement (`eventPhrases`) ;
237
+ - `**preservedSubrecordPrefix**` / `**preservedSubrecordSuffix**` pour sous-lignes non modélisées (`HUSB`/`AGE`/`4 PHRASE`, `3 DATE` sous `STAT`, …) avec ré-export ;
238
+ - tri des actes : `**DATE**` sinon `**SDATE**` valide.
239
+ - `**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.
220
240
 
221
241
  #### Fluent edit layer
222
242
 
223
243
  - Nouveau module `src/edit/` réexporté depuis la racine du paquet :
224
- - **`editPerson`** / `PersonEdit` (identité, liens `FAMC` / `FAMS`, name variants, attributes, accès chaîné à `acts()` / `notes()`) ;
225
- - **`editActs`** / `ActsEdit` (add, replaceAt, removeAt, clear, sortByDate, at) ;
226
- - **`editAct`** / `ActEdit` (type, indis, date, sdate, place, EVEN, phrases, preserved prefix/suffix) ;
227
- - **`editDateAct`** / `DateActEdit` (clear, applyGedcomPayload, setExactDate, setQualified, setBetween, setFromTo, setTime, setDatePhrase, setVerbatimPayload) ;
228
- - **`editPlace`** / `PlaceEdit` (city/county/state/country, GEDCOM 7 payload, placPhrase, coordinates) ;
229
- - **`editNotes`** / `NotesEdit` (add, replaceAt, removeAt, clear) ;
244
+ - `**editPerson**` / `PersonEdit` (identité, liens `FAMC` / `FAMS`, name variants, attributes, accès chaîné à `acts()` / `notes()`) ;
245
+ - `**editActs**` / `ActsEdit` (add, replaceAt, removeAt, clear, sortByDate, at) ;
246
+ - `**editAct**` / `ActEdit` (type, indis, date, sdate, place, EVEN, phrases, preserved prefix/suffix) ;
247
+ - `**editDateAct**` / `DateActEdit` (clear, applyGedcomPayload, setExactDate, setQualified, setBetween, setFromTo, setTime, setDatePhrase, setVerbatimPayload) ;
248
+ - `**editPlace**` / `PlaceEdit` (city/county/state/country, GEDCOM 7 payload, placPhrase, coordinates) ;
249
+ - `**editNotes**` / `NotesEdit` (add, replaceAt, removeAt, clear) ;
230
250
  - chaînage cohérent (`this`) sur le modèle existant, mutation in-place.
231
251
 
232
252
  #### Public API surface
233
253
 
234
254
  - Types exportés : `PersonGedcomImportOptions`, `GedcomExportOptions`, `TypeDateActSimpleQualifier`, `Gedcom7EventTag`, `IndiGedcomSubLine`, `GedcomDatasetVersion`.
235
- - 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`**.
255
+ - 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**`.
236
256
 
237
257
  #### Tests
238
258
 
@@ -246,12 +266,12 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
246
266
 
247
267
  ### Changed
248
268
 
249
- - 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é).
269
+ - 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é).
250
270
 
251
271
  ### Fixed
252
272
 
253
273
  - Export GEDCOM : terminaison correcte `0 TRLR` avec saut de ligne (au lieu du seul tag `TRLR`).
254
- - **`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.
274
+ - `**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.
255
275
 
256
276
  ## [2.0.4] - 2026-05-11
257
277
 
@@ -377,7 +397,6 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
377
397
  - jest / test in Person / runner
378
398
  - createDirectAncestries
379
399
 
380
-
381
400
  ## 1.0.3 - 2019-10-01
382
401
 
383
402
  ### Added
@@ -387,7 +406,7 @@ Les entrées historiques du changelog conservent leurs numéros semver d’origi
387
406
  ## 1.0.2-alpha - 2019-09-01
388
407
 
389
408
  ### Added
390
-
409
+
391
410
  - export for birth and death in gedcom
392
411
  - All identificators can be used for a developper. It's an enum of properties used for all gedcom
393
412
  - City is removed and replaced by Place. Place gets more informations