@treeviz/gedcom-parser 1.0.1 → 1.0.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.
Files changed (90) hide show
  1. package/README.md +174 -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
@@ -5,6 +5,7 @@ A lightweight, pluggable GEDCOM parser library for JavaScript/TypeScript applica
5
5
  ## Features
6
6
 
7
7
  - 🚀 **Parse GEDCOM files** - Full GEDCOM 5.5.1 support
8
+ - 🖥️ **Command-Line Interface** - CLI tools for common GEDCOM operations
8
9
  - 🔌 **Pluggable Architecture** - Zero dependencies on browser-specific APIs
9
10
  - 💾 **Optional Caching** - Provide your own cache implementation (IndexedDB, localStorage, Redis, etc.)
10
11
  - 🌍 **Optional Place Matching** - Provide your own country/place data
@@ -39,6 +40,179 @@ individuals.forEach(indi => {
39
40
  });
40
41
  ```
41
42
 
43
+ ## Command-Line Interface (CLI)
44
+
45
+ The package includes a powerful CLI for working with GEDCOM files directly from the terminal.
46
+
47
+ ### Installation
48
+
49
+ ```bash
50
+ # Install globally
51
+ npm install -g @treeviz/gedcom-parser
52
+
53
+ # Or use npx
54
+ npx @treeviz/gedcom-parser --help
55
+ ```
56
+
57
+ ### Available Commands
58
+
59
+ #### `info` - Display file information
60
+
61
+ ```bash
62
+ gedcom-parser info <file> [options]
63
+
64
+ # Show basic statistics
65
+ gedcom-parser info family.ged
66
+
67
+ # Show detailed information
68
+ gedcom-parser info family.ged --verbose
69
+
70
+ # Output as JSON
71
+ gedcom-parser info family.ged --json
72
+ ```
73
+
74
+ #### `find` - Search for individuals
75
+
76
+ ```bash
77
+ gedcom-parser find <file> [query] [options]
78
+
79
+ # Find by name
80
+ gedcom-parser find family.ged "John Smith"
81
+
82
+ # Find by ID
83
+ gedcom-parser find family.ged --id @I123@
84
+
85
+ # Find with filters
86
+ gedcom-parser find family.ged --birth-year 1850 --death-year 1920
87
+
88
+ # Output as JSON
89
+ gedcom-parser find family.ged "Smith" --json
90
+ ```
91
+
92
+ #### `show` - Display individual details
93
+
94
+ ```bash
95
+ gedcom-parser show <file> <id> [options]
96
+
97
+ # Show individual details
98
+ gedcom-parser show family.ged @I123@
99
+
100
+ # Output as JSON
101
+ gedcom-parser show family.ged @I123@ --json
102
+
103
+ # Output as Markdown
104
+ gedcom-parser show family.ged @I123@ --format markdown
105
+ ```
106
+
107
+ #### `validate` - Validate GEDCOM file
108
+
109
+ ```bash
110
+ gedcom-parser validate <file> [options]
111
+
112
+ # Validate file
113
+ gedcom-parser validate family.ged
114
+
115
+ # Strict validation
116
+ gedcom-parser validate family.ged --strict
117
+
118
+ # Output as JSON
119
+ gedcom-parser validate family.ged --json
120
+ ```
121
+
122
+ #### `relatives` - Extract family tree
123
+
124
+ ```bash
125
+ gedcom-parser relatives <file> <id> [options]
126
+
127
+ # Get ancestors
128
+ gedcom-parser relatives family.ged @I123@ --ancestors
129
+
130
+ # Get descendants
131
+ gedcom-parser relatives family.ged @I123@ --descendants
132
+
133
+ # Get full tree (ancestors and descendants)
134
+ gedcom-parser relatives family.ged @I123@ --tree
135
+
136
+ # Limit depth
137
+ gedcom-parser relatives family.ged @I123@ --ancestors --depth 3
138
+
139
+ # Save to file
140
+ gedcom-parser relatives family.ged @I123@ --tree --output subset.ged
141
+ ```
142
+
143
+ #### `extract` - Create filtered subset
144
+
145
+ ```bash
146
+ gedcom-parser extract <file> --output <output> [options]
147
+
148
+ # Extract by surname
149
+ gedcom-parser extract family.ged --surname Smith --output smiths.ged
150
+
151
+ # Extract by birth year range
152
+ gedcom-parser extract family.ged --birth-after 1900 --birth-before 2000 --output 20th-century.ged
153
+
154
+ # Combine filters
155
+ gedcom-parser extract family.ged --surname "Johnson" --birth-after 1850 --output johnsons.ged
156
+ ```
157
+
158
+ #### `stats` - Generate statistics
159
+
160
+ ```bash
161
+ gedcom-parser stats <file> [options]
162
+
163
+ # Show statistics
164
+ gedcom-parser stats family.ged
165
+
166
+ # Output as JSON
167
+ gedcom-parser stats family.ged --json
168
+ ```
169
+
170
+ #### `merge` - Combine GEDCOM files
171
+
172
+ ```bash
173
+ gedcom-parser merge <files...> --output <output> [options]
174
+
175
+ # Merge multiple files
176
+ gedcom-parser merge file1.ged file2.ged file3.ged --output merged.ged
177
+
178
+ # Merge with deduplication
179
+ gedcom-parser merge file1.ged file2.ged --output merged.ged --dedupe
180
+ ```
181
+
182
+ #### `convert` - Convert to other formats
183
+
184
+ ```bash
185
+ gedcom-parser convert <file> --format <format> [options]
186
+
187
+ # Convert to JSON
188
+ gedcom-parser convert family.ged --format json --output data.json
189
+
190
+ # Convert to CSV
191
+ gedcom-parser convert family.ged --format csv --output individuals.csv
192
+
193
+ # Convert to Markdown
194
+ gedcom-parser convert family.ged --format markdown --output tree.md
195
+ ```
196
+
197
+ ### CLI Examples
198
+
199
+ ```bash
200
+ # Find all individuals with surname "Smith" born after 1900
201
+ gedcom-parser find family.ged --surname Smith --birth-after 1900
202
+
203
+ # Show detailed information about an individual
204
+ gedcom-parser show family.ged @I123@
205
+
206
+ # Extract all descendants of an individual
207
+ gedcom-parser relatives family.ged @I123@ --descendants --output descendants.ged
208
+
209
+ # Generate statistics in JSON format
210
+ gedcom-parser stats family.ged --json > stats.json
211
+
212
+ # Validate and check for errors
213
+ gedcom-parser validate family.ged
214
+ ```
215
+
42
216
  ## Factory Providers
43
217
 
44
218
  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) => {