@treeviz/gedcom-parser 1.0.1 → 1.0.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.
Files changed (90) hide show
  1. package/README.md +176 -0
  2. package/bin/gedcom-parser.js +3 -0
  3. package/dist/classes/common.js +7 -7
  4. package/dist/classes/date.js +4 -4
  5. package/dist/classes/fam.js +3 -3
  6. package/dist/classes/fams.js +3 -3
  7. package/dist/classes/gedcom.d.ts +29 -0
  8. package/dist/classes/gedcom.d.ts.map +1 -1
  9. package/dist/classes/gedcom.js +180 -4
  10. package/dist/classes/index.js +18 -18
  11. package/dist/classes/indi.js +13 -13
  12. package/dist/classes/indis.d.ts.map +1 -1
  13. package/dist/classes/indis.js +42 -24
  14. package/dist/classes/list.js +6 -6
  15. package/dist/classes/name.js +2 -2
  16. package/dist/classes/note.js +2 -2
  17. package/dist/classes/obje.js +1 -1
  18. package/dist/classes/objes.js +1 -1
  19. package/dist/classes/repo.js +1 -1
  20. package/dist/classes/repos.js +1 -1
  21. package/dist/classes/sour.js +1 -1
  22. package/dist/classes/sours.js +1 -1
  23. package/dist/classes/subm.js +1 -1
  24. package/dist/classes/subms.js +1 -1
  25. package/dist/cli/commands/convert.d.ts +3 -0
  26. package/dist/cli/commands/convert.d.ts.map +1 -0
  27. package/dist/cli/commands/convert.js +83 -0
  28. package/dist/cli/commands/extract.d.ts +3 -0
  29. package/dist/cli/commands/extract.d.ts.map +1 -0
  30. package/dist/cli/commands/extract.js +85 -0
  31. package/dist/cli/commands/find.d.ts +3 -0
  32. package/dist/cli/commands/find.d.ts.map +1 -0
  33. package/dist/cli/commands/find.js +97 -0
  34. package/dist/cli/commands/info.d.ts +3 -0
  35. package/dist/cli/commands/info.d.ts.map +1 -0
  36. package/dist/cli/commands/info.js +80 -0
  37. package/dist/cli/commands/merge.d.ts +3 -0
  38. package/dist/cli/commands/merge.d.ts.map +1 -0
  39. package/dist/cli/commands/merge.js +93 -0
  40. package/dist/cli/commands/relatives.d.ts +3 -0
  41. package/dist/cli/commands/relatives.d.ts.map +1 -0
  42. package/dist/cli/commands/relatives.js +107 -0
  43. package/dist/cli/commands/show.d.ts +3 -0
  44. package/dist/cli/commands/show.d.ts.map +1 -0
  45. package/dist/cli/commands/show.js +176 -0
  46. package/dist/cli/commands/stats.d.ts +3 -0
  47. package/dist/cli/commands/stats.d.ts.map +1 -0
  48. package/dist/cli/commands/stats.js +59 -0
  49. package/dist/cli/commands/validate.d.ts +3 -0
  50. package/dist/cli/commands/validate.d.ts.map +1 -0
  51. package/dist/cli/commands/validate.js +148 -0
  52. package/dist/cli/index.d.ts +3 -0
  53. package/dist/cli/index.d.ts.map +1 -0
  54. package/dist/cli/index.js +40 -0
  55. package/dist/cli/utils/formatters.d.ts +69 -0
  56. package/dist/cli/utils/formatters.d.ts.map +1 -0
  57. package/dist/cli/utils/formatters.js +125 -0
  58. package/dist/cli/utils/helpers.d.ts +21 -0
  59. package/dist/cli/utils/helpers.d.ts.map +1 -0
  60. package/dist/cli/utils/helpers.js +58 -0
  61. package/dist/constants/filters.js +1 -1
  62. package/dist/constants/index.js +3 -3
  63. package/dist/constants/orders.js +2 -2
  64. package/dist/factories/cache-factory.js +1 -1
  65. package/dist/factories/date-locale-factory.js +1 -1
  66. package/dist/factories/i18n-factory.js +1 -1
  67. package/dist/factories/index.js +4 -4
  68. package/dist/factories/kinship-factory.js +2 -2
  69. package/dist/factories/place-parser-provider.js +1 -1
  70. package/dist/factories/place-translator-provider.js +1 -1
  71. package/dist/index.js +37 -37
  72. package/dist/kinship-translator/index.js +9 -9
  73. package/dist/kinship-translator/kinship-translator.de.js +3 -3
  74. package/dist/kinship-translator/kinship-translator.en.js +4 -4
  75. package/dist/kinship-translator/kinship-translator.es.js +4 -4
  76. package/dist/kinship-translator/kinship-translator.fr.js +4 -4
  77. package/dist/kinship-translator/kinship-translator.hu.js +4 -4
  78. package/dist/kinship-translator/kinship-translator.js +1 -1
  79. package/dist/kinship-translator/translators.js +5 -5
  80. package/dist/types/index.js +3 -3
  81. package/dist/utils/cache.js +2 -2
  82. package/dist/utils/common-creator.js +11 -11
  83. package/dist/utils/date-formatter.js +3 -3
  84. package/dist/utils/get-places.js +1 -1
  85. package/dist/utils/get-product-details.js +1 -1
  86. package/dist/utils/index.js +16 -16
  87. package/dist/utils/name-formatter.js +2 -2
  88. package/dist/utils/nested-group.js +3 -3
  89. package/dist/utils/parser.js +14 -14
  90. package/package.json +13 -4
package/README.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # @treeviz/gedcom-parser
2
2
 
3
+ > Part of the [@treeviz](https://www.npmjs.com/org/treeviz) organization - A collection of tools for genealogy data processing and visualization.
4
+
3
5
  A lightweight, pluggable GEDCOM parser library for JavaScript/TypeScript applications. Originally part of [TreeViz](https://treeviz.com), extracted as a standalone package for reusability.
4
6
 
5
7
  ## Features
6
8
 
7
9
  - 🚀 **Parse GEDCOM files** - Full GEDCOM 5.5.1 support
10
+ - 🖥️ **Command-Line Interface** - CLI tools for common GEDCOM operations
8
11
  - 🔌 **Pluggable Architecture** - Zero dependencies on browser-specific APIs
9
12
  - 💾 **Optional Caching** - Provide your own cache implementation (IndexedDB, localStorage, Redis, etc.)
10
13
  - 🌍 **Optional Place Matching** - Provide your own country/place data
@@ -39,6 +42,179 @@ individuals.forEach(indi => {
39
42
  });
40
43
  ```
41
44
 
45
+ ## Command-Line Interface (CLI)
46
+
47
+ The package includes a powerful CLI for working with GEDCOM files directly from the terminal.
48
+
49
+ ### Installation
50
+
51
+ ```bash
52
+ # Install globally
53
+ npm install -g @treeviz/gedcom-parser
54
+
55
+ # Or use npx
56
+ npx @treeviz/gedcom-parser --help
57
+ ```
58
+
59
+ ### Available Commands
60
+
61
+ #### `info` - Display file information
62
+
63
+ ```bash
64
+ gedcom-parser info <file> [options]
65
+
66
+ # Show basic statistics
67
+ gedcom-parser info family.ged
68
+
69
+ # Show detailed information
70
+ gedcom-parser info family.ged --verbose
71
+
72
+ # Output as JSON
73
+ gedcom-parser info family.ged --json
74
+ ```
75
+
76
+ #### `find` - Search for individuals
77
+
78
+ ```bash
79
+ gedcom-parser find <file> [query] [options]
80
+
81
+ # Find by name
82
+ gedcom-parser find family.ged "John Smith"
83
+
84
+ # Find by ID
85
+ gedcom-parser find family.ged --id @I123@
86
+
87
+ # Find with filters
88
+ gedcom-parser find family.ged --birth-year 1850 --death-year 1920
89
+
90
+ # Output as JSON
91
+ gedcom-parser find family.ged "Smith" --json
92
+ ```
93
+
94
+ #### `show` - Display individual details
95
+
96
+ ```bash
97
+ gedcom-parser show <file> <id> [options]
98
+
99
+ # Show individual details
100
+ gedcom-parser show family.ged @I123@
101
+
102
+ # Output as JSON
103
+ gedcom-parser show family.ged @I123@ --json
104
+
105
+ # Output as Markdown
106
+ gedcom-parser show family.ged @I123@ --format markdown
107
+ ```
108
+
109
+ #### `validate` - Validate GEDCOM file
110
+
111
+ ```bash
112
+ gedcom-parser validate <file> [options]
113
+
114
+ # Validate file
115
+ gedcom-parser validate family.ged
116
+
117
+ # Strict validation
118
+ gedcom-parser validate family.ged --strict
119
+
120
+ # Output as JSON
121
+ gedcom-parser validate family.ged --json
122
+ ```
123
+
124
+ #### `relatives` - Extract family tree
125
+
126
+ ```bash
127
+ gedcom-parser relatives <file> <id> [options]
128
+
129
+ # Get ancestors
130
+ gedcom-parser relatives family.ged @I123@ --ancestors
131
+
132
+ # Get descendants
133
+ gedcom-parser relatives family.ged @I123@ --descendants
134
+
135
+ # Get full tree (ancestors and descendants)
136
+ gedcom-parser relatives family.ged @I123@ --tree
137
+
138
+ # Limit depth
139
+ gedcom-parser relatives family.ged @I123@ --ancestors --depth 3
140
+
141
+ # Save to file
142
+ gedcom-parser relatives family.ged @I123@ --tree --output subset.ged
143
+ ```
144
+
145
+ #### `extract` - Create filtered subset
146
+
147
+ ```bash
148
+ gedcom-parser extract <file> --output <output> [options]
149
+
150
+ # Extract by surname
151
+ gedcom-parser extract family.ged --surname Smith --output smiths.ged
152
+
153
+ # Extract by birth year range
154
+ gedcom-parser extract family.ged --birth-after 1900 --birth-before 2000 --output 20th-century.ged
155
+
156
+ # Combine filters
157
+ gedcom-parser extract family.ged --surname "Johnson" --birth-after 1850 --output johnsons.ged
158
+ ```
159
+
160
+ #### `stats` - Generate statistics
161
+
162
+ ```bash
163
+ gedcom-parser stats <file> [options]
164
+
165
+ # Show statistics
166
+ gedcom-parser stats family.ged
167
+
168
+ # Output as JSON
169
+ gedcom-parser stats family.ged --json
170
+ ```
171
+
172
+ #### `merge` - Combine GEDCOM files
173
+
174
+ ```bash
175
+ gedcom-parser merge <files...> --output <output> [options]
176
+
177
+ # Merge multiple files
178
+ gedcom-parser merge file1.ged file2.ged file3.ged --output merged.ged
179
+
180
+ # Merge with deduplication
181
+ gedcom-parser merge file1.ged file2.ged --output merged.ged --dedupe
182
+ ```
183
+
184
+ #### `convert` - Convert to other formats
185
+
186
+ ```bash
187
+ gedcom-parser convert <file> --format <format> [options]
188
+
189
+ # Convert to JSON
190
+ gedcom-parser convert family.ged --format json --output data.json
191
+
192
+ # Convert to CSV
193
+ gedcom-parser convert family.ged --format csv --output individuals.csv
194
+
195
+ # Convert to Markdown
196
+ gedcom-parser convert family.ged --format markdown --output tree.md
197
+ ```
198
+
199
+ ### CLI Examples
200
+
201
+ ```bash
202
+ # Find all individuals with surname "Smith" born after 1900
203
+ gedcom-parser find family.ged --surname Smith --birth-after 1900
204
+
205
+ # Show detailed information about an individual
206
+ gedcom-parser show family.ged @I123@
207
+
208
+ # Extract all descendants of an individual
209
+ gedcom-parser relatives family.ged @I123@ --descendants --output descendants.ged
210
+
211
+ # Generate statistics in JSON format
212
+ gedcom-parser stats family.ged --json > stats.json
213
+
214
+ # Validate and check for errors
215
+ gedcom-parser validate family.ged
216
+ ```
217
+
42
218
  ## Factory Providers
43
219
 
44
220
  The package uses factory patterns to allow customization of core functionality. All factories are **optional** - the package provides sensible defaults.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import '../dist/cli/index.js';
@@ -1,10 +1,10 @@
1
- import get from "lodash/get";
2
- import set from "lodash/set";
3
- import uniqBy from "lodash/uniqBy";
4
- import unset from "lodash/unset";
5
- import { ID_GETTER_REG, ID_REG } from "../constants/constants";
6
- import { List } from "./list";
7
- // import GedcomTree from "../../../utils/parser";
1
+ import get from "lodash-es/get.js";
2
+ import set from "lodash-es/set.js";
3
+ import uniqBy from "lodash-es/uniqBy.js";
4
+ import unset from "lodash-es/unset.js";
5
+ import { ID_GETTER_REG, ID_REG } from "../constants/constants.js";
6
+ import { List } from "./list.js";
7
+ // import GedcomTree from "../../../utils/parser.js";
8
8
  export class Common {
9
9
  constructor(gedcom, id, main, parent) {
10
10
  this.isListable = true;
@@ -1,8 +1,8 @@
1
1
  import { format, isValid, parse } from "date-fns";
2
- import { ACCEPTED_DATE_FORMATS } from "../utils/date-formatter";
3
- import { inRange } from "../utils/range";
4
- import { Common, createCommon, createProxy } from "./common";
5
- import { getDateLocale } from "../factories";
2
+ import { ACCEPTED_DATE_FORMATS } from "../utils/date-formatter.js";
3
+ import { inRange } from "../utils/range.js";
4
+ import { Common, createCommon, createProxy } from "./common.js";
5
+ import { getDateLocale } from "../factories/index.js";
6
6
  const LONG_NOTES = {
7
7
  "Abt.": "About",
8
8
  "Bef.": "Before",
@@ -1,6 +1,6 @@
1
- import { Common, createProxy } from "./common";
2
- import { Families } from "./fams";
3
- import { Individuals } from "./indis";
1
+ import { Common, createProxy } from "./common.js";
2
+ import { Families } from "./fams.js";
3
+ import { Individuals } from "./indis.js";
4
4
  export class Fam extends Common {
5
5
  getFamilyMembers(type) {
6
6
  const familyMembers = new Individuals();
@@ -1,6 +1,6 @@
1
- import { Fam } from "./fam";
2
- import { Individuals } from "./indis";
3
- import { List } from "./list";
1
+ import { Fam } from "./fam.js";
2
+ import { Individuals } from "./indis.js";
3
+ import { List } from "./list.js";
4
4
  export class Families extends List {
5
5
  copy() {
6
6
  return super.copy(Families);
@@ -73,6 +73,35 @@ export declare class GedCom extends Common implements IGedcom {
73
73
  * @returns Record mapping place names to arrays of individual IDs
74
74
  */
75
75
  getAllPlacesWithIndis(usedIndis?: IndiKey[]): Record<string, (`@I${number}@` | `@P${number}@` | `@XI${number}@` | `@XXI${number}@`)[]>;
76
+ /**
77
+ * Generate statistics about the GEDCOM file
78
+ * @param individuals Optional list of individuals to calculate statistics for. If not provided, all individuals from the GEDCOM will be used.
79
+ * @returns Object containing various statistics about the GEDCOM data
80
+ */
81
+ stats(individuals?: Individuals): {
82
+ totalIndividuals: number;
83
+ totalFamilies: number;
84
+ byGender: {
85
+ males: number;
86
+ females: number;
87
+ unknown: number;
88
+ };
89
+ dateRange: {
90
+ earliest: number;
91
+ latest: number;
92
+ };
93
+ averageLifespan: number;
94
+ topSurnames: {
95
+ surname: string;
96
+ count: number;
97
+ }[];
98
+ topBirthPlaces: {
99
+ place: string;
100
+ count: number;
101
+ }[];
102
+ firstPersonEvent: any;
103
+ lastPersonEvent: any;
104
+ };
76
105
  }
77
106
  export type GedComType = GedCom & IGedComStructure;
78
107
  export declare const createGedCom: () => GedComType;
@@ -1 +1 @@
1
- {"version":3,"file":"gedcom.d.ts","sourceRoot":"","sources":["../../src/classes/gedcom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gedcom.d.ts","sourceRoot":"","sources":["../../src/classes/gedcom.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { getVersion } from "../utils/get-product-details";
2
- import { Common, createCommon } from "./common";
3
- import { CustomTags } from "./indi";
4
- import { List } from "./list";
1
+ import { getVersion } from "../utils/get-product-details.js";
2
+ import { Common, createCommon } from "./common.js";
3
+ import { CustomTags } from "./indi.js";
4
+ import { List } from "./list.js";
5
5
  export class GedCom extends Common {
6
6
  constructor() {
7
7
  super();
@@ -356,6 +356,182 @@ export class GedCom extends Common {
356
356
  });
357
357
  return allPlaces;
358
358
  }
359
+ /**
360
+ * Generate statistics about the GEDCOM file
361
+ * @param individuals Optional list of individuals to calculate statistics for. If not provided, all individuals from the GEDCOM will be used.
362
+ * @returns Object containing various statistics about the GEDCOM data
363
+ */
364
+ stats(individuals) {
365
+ const indis = individuals ?? this.indis();
366
+ // Build families list based on whether individuals filter is provided
367
+ let families;
368
+ if (individuals) {
369
+ // If individuals filter is provided, filter families by references
370
+ const familyIds = new Set();
371
+ indis?.forEach((indi) => {
372
+ // Add spouse families
373
+ indi.FAMS?.toList()?.forEach((famRef) => {
374
+ const famId = famRef.value;
375
+ if (famId)
376
+ familyIds.add(famId);
377
+ });
378
+ // Add parent families
379
+ indi.FAMC?.toList()?.forEach((famRef) => {
380
+ const famId = famRef.value;
381
+ if (famId)
382
+ familyIds.add(famId);
383
+ });
384
+ });
385
+ families = this.fams()?.filter((fam) => fam.id ? familyIds.has(fam.id) : false);
386
+ }
387
+ else {
388
+ // No filter provided, use all families directly
389
+ families = this.fams();
390
+ } // Calculate statistics
391
+ const totalIndividuals = indis?.length || 0;
392
+ const totalFamilies = families?.length || 0;
393
+ // Count by sex
394
+ let males = 0;
395
+ let females = 0;
396
+ let unknownSex = 0;
397
+ indis?.forEach((indi) => {
398
+ const sex = indi.SEX?.value;
399
+ if (sex === "M")
400
+ males++;
401
+ else if (sex === "F")
402
+ females++;
403
+ else
404
+ unknownSex++;
405
+ });
406
+ // Most common surnames
407
+ const surnames = new Map();
408
+ indis?.forEach((indi) => {
409
+ const name = indi.NAME?.toValue();
410
+ if (name) {
411
+ const match = name.match(/\/(.+?)\//);
412
+ if (match) {
413
+ const surname = match[1];
414
+ surnames.set(surname, (surnames.get(surname) || 0) + 1);
415
+ }
416
+ }
417
+ });
418
+ const topSurnames = Array.from(surnames.entries())
419
+ .sort((a, b) => b[1] - a[1])
420
+ .slice(0, 10)
421
+ .map(([surname, count]) => ({ surname, count }));
422
+ // Most common birth places
423
+ const birthPlaces = new Map();
424
+ indis?.forEach((indi) => {
425
+ const place = indi.BIRT?.PLAC?.value;
426
+ if (place) {
427
+ birthPlaces.set(place, (birthPlaces.get(place) || 0) + 1);
428
+ }
429
+ });
430
+ const topBirthPlaces = Array.from(birthPlaces.entries())
431
+ .sort((a, b) => b[1] - a[1])
432
+ .slice(0, 10)
433
+ .map(([place, count]) => ({ place, count }));
434
+ // Date range
435
+ const years = [];
436
+ indis?.forEach((indi) => {
437
+ const birthDate = indi.BIRT?.DATE?.toValue();
438
+ if (birthDate) {
439
+ const match = birthDate.match(/\d{4}/);
440
+ if (match) {
441
+ years.push(parseInt(match[0], 10));
442
+ }
443
+ }
444
+ const deathDate = indi.DEAT?.DATE?.toValue();
445
+ if (deathDate) {
446
+ const match = deathDate.match(/\d{4}/);
447
+ if (match) {
448
+ years.push(parseInt(match[0], 10));
449
+ }
450
+ }
451
+ });
452
+ const minYear = years.length > 0 ? Math.min(...years) : null;
453
+ const maxYear = years.length > 0 ? Math.max(...years) : null;
454
+ // Average lifespan
455
+ const lifespans = [];
456
+ indis?.forEach((indi) => {
457
+ const birthDate = indi.BIRT?.DATE?.toValue();
458
+ const deathDate = indi.DEAT?.DATE?.toValue();
459
+ if (birthDate && deathDate) {
460
+ const birthMatch = birthDate.match(/\d{4}/);
461
+ const deathMatch = deathDate.match(/\d{4}/);
462
+ if (birthMatch && deathMatch) {
463
+ const birthYear = parseInt(birthMatch[0], 10);
464
+ const deathYear = parseInt(deathMatch[0], 10);
465
+ if (deathYear > birthYear) {
466
+ lifespans.push(deathYear - birthYear);
467
+ }
468
+ }
469
+ }
470
+ });
471
+ const avgLifespan = lifespans.length > 0
472
+ ? lifespans.reduce((sum, age) => sum + age, 0) /
473
+ lifespans.length
474
+ : null;
475
+ // First and last person events with type information
476
+ const firstPerson = indis?.getFirstEvent();
477
+ const firstBirth = firstPerson?.BIRT?.toList().index(0);
478
+ const firstDeath = firstPerson?.DEAT?.toList().index(0);
479
+ let firstPersonEvent = null;
480
+ const firstBirthDate = firstBirth?.DATE
481
+ ?.rawValue;
482
+ const firstDeathDate = firstDeath?.DATE
483
+ ?.rawValue;
484
+ if (firstBirthDate || firstDeathDate) {
485
+ const isBirth = !firstBirthDate ||
486
+ (firstDeathDate && firstDeathDate < firstBirthDate)
487
+ ? false
488
+ : true;
489
+ firstPersonEvent = {
490
+ type: isBirth ? "BIRT" : "DEAT",
491
+ event: isBirth ? firstBirth : firstDeath,
492
+ person: firstPerson,
493
+ };
494
+ }
495
+ const lastPerson = indis?.getLastEvent();
496
+ const lastBirth = lastPerson?.BIRT?.toList().index(0);
497
+ const lastDeath = lastPerson?.DEAT?.toList().index(0);
498
+ let lastPersonEvent = null;
499
+ const lastBirthDate = lastBirth
500
+ ?.DATE?.rawValue;
501
+ const lastDeathDate = lastDeath
502
+ ?.DATE?.rawValue;
503
+ if (lastBirthDate || lastDeathDate) {
504
+ const isBirth = !lastDeathDate ||
505
+ (lastBirthDate && lastDeathDate < lastBirthDate)
506
+ ? true
507
+ : false;
508
+ lastPersonEvent = {
509
+ type: isBirth ? "BIRT" : "DEAT",
510
+ event: isBirth ? lastBirth : lastDeath,
511
+ person: lastPerson,
512
+ };
513
+ }
514
+ return {
515
+ totalIndividuals,
516
+ totalFamilies,
517
+ byGender: {
518
+ males,
519
+ females,
520
+ unknown: unknownSex,
521
+ },
522
+ dateRange: {
523
+ earliest: minYear,
524
+ latest: maxYear,
525
+ },
526
+ averageLifespan: avgLifespan
527
+ ? Math.round(avgLifespan * 10) / 10
528
+ : null,
529
+ topSurnames,
530
+ topBirthPlaces,
531
+ firstPersonEvent,
532
+ lastPersonEvent,
533
+ };
534
+ }
359
535
  }
360
536
  export const createGedCom = () => {
361
537
  return new GedCom();
@@ -1,19 +1,19 @@
1
1
  // Classes exports - barrel file for easier imports
2
- export * from "./common";
3
- export * from "./date";
4
- export * from "./fam";
5
- export * from "./fams";
6
- export * from "./gedcom";
7
- export * from "./indi";
8
- export * from "./indis";
9
- export * from "./list";
10
- export * from "./name";
11
- export * from "./note";
12
- export * from "./obje";
13
- export * from "./objes";
14
- export * from "./repo";
15
- export * from "./repos";
16
- export * from "./sour";
17
- export * from "./sours";
18
- export * from "./subm";
19
- export * from "./subms";
2
+ export * from "./common.js";
3
+ export * from "./date.js";
4
+ export * from "./fam.js";
5
+ export * from "./fams.js";
6
+ export * from "./gedcom.js";
7
+ export * from "./indi.js";
8
+ export * from "./indis.js";
9
+ export * from "./list.js";
10
+ export * from "./name.js";
11
+ export * from "./note.js";
12
+ export * from "./obje.js";
13
+ export * from "./objes.js";
14
+ export * from "./repo.js";
15
+ export * from "./repos.js";
16
+ export * from "./sour.js";
17
+ export * from "./sours.js";
18
+ export * from "./subm.js";
19
+ export * from "./subms.js";
@@ -1,16 +1,16 @@
1
- import * as Filters from "../constants/filters";
2
- import { BIRTH_ASC, DATE_ASC, getMarriageAscAndChildBirth, } from "../constants/orders";
3
- import { getKinshipTranslatorClass } from "../factories/kinship-factory";
4
- import { RelationType, PartnerType } from "../types/types";
5
- import { pathCache, relativesCache } from "../utils/cache";
6
- import { dateFormatter } from "../utils/date-formatter";
7
- import { PlaceType, getPlaces } from "../utils/get-places";
8
- import { implemented } from "../utils/logger";
9
- import { Common, createCommon, createProxy } from "./common";
10
- import { Families } from "./fams";
11
- import { Individuals } from "./indis";
12
- import { List } from "./list";
13
- import { CommonName, createCommonName } from "./name";
1
+ import * as Filters from "../constants/filters.js";
2
+ import { BIRTH_ASC, DATE_ASC, getMarriageAscAndChildBirth, } from "../constants/orders.js";
3
+ import { getKinshipTranslatorClass } from "../factories/kinship-factory.js";
4
+ import { RelationType, PartnerType } from "../types/types.js";
5
+ import { pathCache, relativesCache } from "../utils/cache.js";
6
+ import { dateFormatter } from "../utils/date-formatter.js";
7
+ import { PlaceType, getPlaces } from "../utils/get-places.js";
8
+ import { implemented } from "../utils/logger.js";
9
+ import { Common, createCommon, createProxy } from "./common.js";
10
+ import { Families } from "./fams.js";
11
+ import { Individuals } from "./indis.js";
12
+ import { List } from "./list.js";
13
+ import { CommonName, createCommonName } from "./name.js";
14
14
  export var Existed;
15
15
  (function (Existed) {
16
16
  Existed["SPOUSE"] = "spouse";
@@ -1 +1 @@
1
- {"version":3,"file":"indis.d.ts","sourceRoot":"","sources":["../../src/classes/indis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indis.d.ts","sourceRoot":"","sources":["../../src/classes/indis.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import difference from "lodash/difference";
2
- import { BIRTH_ASC, BIRTH_DESC, DEATH_ASC, DEATH_DESC, } from "../constants/orders";
3
- import { getPlaceParserProvider } from "../factories/place-parser-provider";
4
- import { getPlaceTranslatorProvider } from "../factories/place-translator-provider";
5
- import { Range, } from "../types/types";
6
- import { nameFormatter } from "../utils/name-formatter";
7
- import { setNestedGroup } from "../utils/nested-group";
8
- import { getPlaceParts } from "../utils/place-parser";
9
- import { placeTranslator } from "../utils/place-translator";
10
- import { List } from "./list";
1
+ import difference from "lodash-es/difference.js";
2
+ import { BIRTH_ASC, BIRTH_DESC, DEATH_ASC, DEATH_DESC, } from "../constants/orders.js";
3
+ import { getPlaceParserProvider } from "../factories/place-parser-provider.js";
4
+ import { getPlaceTranslatorProvider } from "../factories/place-translator-provider.js";
5
+ import { Range, } from "../types/types.js";
6
+ import { nameFormatter } from "../utils/name-formatter.js";
7
+ import { setNestedGroup } from "../utils/nested-group.js";
8
+ import { getPlaceParts } from "../utils/place-parser.js";
9
+ import { placeTranslator } from "../utils/place-translator.js";
10
+ import { List } from "./list.js";
11
11
  export class Individuals extends List {
12
12
  copy() {
13
13
  return super.copy(Individuals);
@@ -31,24 +31,42 @@ export class Individuals extends List {
31
31
  return super.orderBy(orders, Individuals);
32
32
  }
33
33
  getFirstEvent() {
34
- const firstDeath = this.getFirstBirth();
35
- const firstBirth = this.getFirstDeath();
36
- if (firstBirth?.DATE?.rawValue === undefined ||
37
- (firstDeath?.DATE?.rawValue !== undefined &&
38
- firstDeath.DATE.rawValue < firstBirth.DATE.rawValue)) {
39
- return firstDeath;
34
+ const firstBirthPerson = this.getFirstBirth();
35
+ const firstDeathPerson = this.getFirstDeath();
36
+ const firstBirth = firstBirthPerson?.BIRT?.toList().index(0);
37
+ const firstDeath = firstDeathPerson?.DEAT?.toList().index(0);
38
+ if (!firstBirth?.DATE?.rawValue && !firstDeath?.DATE?.rawValue) {
39
+ return undefined;
40
40
  }
41
- return firstBirth;
41
+ if (!firstBirth?.DATE?.rawValue) {
42
+ return firstDeathPerson;
43
+ }
44
+ if (!firstDeath?.DATE?.rawValue) {
45
+ return firstBirthPerson;
46
+ }
47
+ if (firstDeath.DATE.rawValue < firstBirth.DATE.rawValue) {
48
+ return firstDeathPerson;
49
+ }
50
+ return firstBirthPerson;
42
51
  }
43
52
  getLastEvent() {
44
- const lastDeath = this.getLastDeath();
45
- const lastBirth = this.getLastBirth();
46
- if (lastDeath?.DATE?.rawValue === undefined ||
47
- (lastBirth?.DATE?.rawValue !== undefined &&
48
- lastDeath.DATE.rawValue < lastBirth.DATE.rawValue)) {
49
- return lastBirth;
53
+ const lastDeathPerson = this.getLastDeath();
54
+ const lastBirthPerson = this.getLastBirth();
55
+ const lastBirth = lastBirthPerson?.BIRT?.toList().index(0);
56
+ const lastDeath = lastDeathPerson?.DEAT?.toList().index(0);
57
+ if (!lastBirth?.DATE?.rawValue && !lastDeath?.DATE?.rawValue) {
58
+ return undefined;
59
+ }
60
+ if (!lastDeath?.DATE?.rawValue) {
61
+ return lastBirthPerson;
62
+ }
63
+ if (!lastBirth?.DATE?.rawValue) {
64
+ return lastDeathPerson;
65
+ }
66
+ if (lastDeath.DATE.rawValue < lastBirth.DATE.rawValue) {
67
+ return lastBirthPerson;
50
68
  }
51
- return lastDeath;
69
+ return lastDeathPerson;
52
70
  }
53
71
  getFirstBirth() {
54
72
  return this.filter((item) => {