@treeviz/gedcom-parser 2.0.10 → 2.0.12

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 (40) hide show
  1. package/dist/classes/common.d.ts +6 -1
  2. package/dist/classes/common.d.ts.map +1 -1
  3. package/dist/classes/fam.d.ts +9 -1
  4. package/dist/classes/fam.d.ts.map +1 -1
  5. package/dist/classes/gedcom.d.ts +6 -2
  6. package/dist/classes/gedcom.d.ts.map +1 -1
  7. package/dist/classes/index.js +495 -50
  8. package/dist/classes/indi.d.ts +6 -0
  9. package/dist/classes/indi.d.ts.map +1 -1
  10. package/dist/cli/index.js +3383 -2932
  11. package/dist/constants/constants.d.ts +7 -0
  12. package/dist/constants/constants.d.ts.map +1 -1
  13. package/dist/constants/index.js +1287 -916
  14. package/dist/factories/index.js +409 -39
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5327 -4777
  18. package/dist/interfaces/fam.d.ts +7 -1
  19. package/dist/interfaces/fam.d.ts.map +1 -1
  20. package/dist/interfaces/gedcom.d.ts +4 -0
  21. package/dist/interfaces/gedcom.d.ts.map +1 -1
  22. package/dist/interfaces/indi.d.ts +5 -1
  23. package/dist/interfaces/indi.d.ts.map +1 -1
  24. package/dist/kinship-translator/index.js +409 -39
  25. package/dist/structures/gedcom.d.ts +1 -0
  26. package/dist/structures/gedcom.d.ts.map +1 -1
  27. package/dist/types/types.d.ts +10 -0
  28. package/dist/types/types.d.ts.map +1 -1
  29. package/dist/utils/fact-edit.d.ts +22 -0
  30. package/dist/utils/fact-edit.d.ts.map +1 -0
  31. package/dist/utils/family-edit.d.ts +23 -0
  32. package/dist/utils/family-edit.d.ts.map +1 -0
  33. package/dist/utils/gedcom-trailer.d.ts +6 -0
  34. package/dist/utils/gedcom-trailer.d.ts.map +1 -0
  35. package/dist/utils/index.d.ts +4 -1
  36. package/dist/utils/index.d.ts.map +1 -1
  37. package/dist/utils/index.js +605 -55
  38. package/dist/utils/parser.d.ts +3 -0
  39. package/dist/utils/parser.d.ts.map +1 -1
  40. package/package.json +1 -1
@@ -1846,6 +1846,11 @@ var inRange = (year, range, trueIfNoYear = false) => {
1846
1846
  // src/constants/constants.ts
1847
1847
  var ID_REG = /^@[_a-zA-Z0-9]+@/;
1848
1848
  var ID_GETTER_REG = /^(?<at>@)?(?<letter>[A-Z])?/i;
1849
+ var ORIG_HEAD_TAG = "_ORIGHEAD";
1850
+
1851
+ // src/utils/gedcom-trailer.ts
1852
+ var GEDCOM_TRAILER_TAG = "TRLR";
1853
+ var isGedcomTrailerTag = (tag) => tag === GEDCOM_TRAILER_TAG;
1849
1854
  var List = class _List {
1850
1855
  // length = 0;
1851
1856
  constructor(items) {
@@ -2356,6 +2361,9 @@ var Common = class _Common {
2356
2361
  delete this._value;
2357
2362
  }
2358
2363
  set(name, value) {
2364
+ if (isGedcomTrailerTag(name)) {
2365
+ return void 0;
2366
+ }
2359
2367
  if (typeof value === "string") {
2360
2368
  const usedValue = createCommon(this._gedcom, void 0, this.main);
2361
2369
  usedValue.value = value;
@@ -2366,6 +2374,9 @@ var Common = class _Common {
2366
2374
  return get(this, name);
2367
2375
  }
2368
2376
  assign(name, value, unique = false) {
2377
+ if (isGedcomTrailerTag(name)) {
2378
+ return void 0;
2379
+ }
2369
2380
  let curValue = this.get(name);
2370
2381
  if (curValue?.isListable) {
2371
2382
  if (curValue instanceof _Common) {
@@ -2588,30 +2599,47 @@ var Common = class _Common {
2588
2599
  });
2589
2600
  return gedcom;
2590
2601
  }
2602
+ getHeadRecord() {
2603
+ return get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2604
+ }
2605
+ getOriginalHeadRecord() {
2606
+ return get(this, ORIG_HEAD_TAG) || get(this.getGedcom(), ORIG_HEAD_TAG) || get(this.getHeadRecord(), ORIG_HEAD_TAG);
2607
+ }
2608
+ getSourceHeads() {
2609
+ const heads = [this.getOriginalHeadRecord(), this.getHeadRecord()];
2610
+ return heads.filter((head, index) => {
2611
+ return Boolean(head && heads.indexOf(head) === index);
2612
+ });
2613
+ }
2614
+ getFromSourceHeads(path) {
2615
+ for (const head of this.getSourceHeads()) {
2616
+ const value = get(head, path);
2617
+ if (value !== void 0 && value !== null && value !== "") {
2618
+ return value;
2619
+ }
2620
+ }
2621
+ return void 0;
2622
+ }
2623
+ sourStartsWith(prefix) {
2624
+ return this.getSourceHeads().some((head) => {
2625
+ const sour = get(head, "SOUR.value");
2626
+ return !!sour?.toLowerCase()?.startsWith(prefix);
2627
+ });
2628
+ }
2591
2629
  isGenoPro() {
2592
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2593
- const sour = get(head, "SOUR.value");
2594
- return !!sour?.toLowerCase()?.startsWith("genopro");
2630
+ return this.sourStartsWith("genopro");
2595
2631
  }
2596
2632
  isAhnenblatt() {
2597
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2598
- const sour = get(head, "SOUR.value");
2599
- return !!sour?.toLowerCase()?.startsWith("ahnenblatt");
2633
+ return this.sourStartsWith("ahnenblatt");
2600
2634
  }
2601
2635
  isGeni() {
2602
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2603
- const sour = get(head, "SOUR.value");
2604
- return !!sour?.toLowerCase()?.startsWith("geni");
2636
+ return this.sourStartsWith("geni");
2605
2637
  }
2606
2638
  isAncestry() {
2607
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2608
- const sour = get(head, "SOUR.value");
2609
- return !!sour?.toLowerCase()?.startsWith("ancestry");
2639
+ return this.sourStartsWith("ancestry");
2610
2640
  }
2611
2641
  isMyHeritage() {
2612
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2613
- const sour = get(head, "SOUR.value");
2614
- return !!sour?.toLowerCase()?.startsWith("myheritage");
2642
+ return this.sourStartsWith("myheritage");
2615
2643
  }
2616
2644
  /**
2617
2645
  * Get the source type as a string (for prefixing tree IDs and names)
@@ -2628,22 +2656,22 @@ var Common = class _Common {
2628
2656
  return void 0;
2629
2657
  }
2630
2658
  isFamilySearch() {
2631
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2632
- const sourName = get(head, "SOUR.NAME.value");
2633
- return sourName === "FamilySearch API";
2659
+ return this.getSourceHeads().some((head) => {
2660
+ const sourName = get(head, "SOUR.NAME.value");
2661
+ return sourName === "FamilySearch API";
2662
+ });
2634
2663
  }
2635
2664
  isGNO2GED() {
2636
- const head = get(this, "HEAD") || get(this.getGedcom(), "HEAD");
2637
- const sour = get(head, "SOUR.value");
2638
- return sour === "GNO2GED";
2665
+ return this.getSourceHeads().some((head) => {
2666
+ const sour = get(head, "SOUR.value");
2667
+ return sour === "GNO2GED";
2668
+ });
2639
2669
  }
2640
2670
  getAncestryTreeId() {
2641
- const path = "HEAD.SOUR._TREE.RIN.value";
2642
- return get(this, path) || get(this.getGedcom(), path);
2671
+ return this.getFromSourceHeads("SOUR._TREE.RIN.value") || (get(this, "HEAD.SOUR._TREE.RIN.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.RIN.value"));
2643
2672
  }
2644
2673
  getMyHeritageTreeId() {
2645
- const path = "HEAD._EXPORTED_FROM_SITE_ID.value";
2646
- return get(this, path) || get(this.getGedcom(), path);
2674
+ return this.getFromSourceHeads("_EXPORTED_FROM_SITE_ID.value") || (get(this, "HEAD._EXPORTED_FROM_SITE_ID.value") || get(this.getGedcom(), "HEAD._EXPORTED_FROM_SITE_ID.value"));
2647
2675
  }
2648
2676
  getTreeId() {
2649
2677
  if (this?.isAncestry()) {
@@ -2677,8 +2705,7 @@ var Common = class _Common {
2677
2705
  return this.getUniversalTreeId();
2678
2706
  }
2679
2707
  getAncestryTreeName() {
2680
- const path = "HEAD.SOUR._TREE.value";
2681
- return get(this, path) || get(this.getGedcom(), path);
2708
+ return this.getFromSourceHeads("SOUR._TREE.value") || (get(this, "HEAD.SOUR._TREE.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.value"));
2682
2709
  }
2683
2710
  getMyHeritageTreeName() {
2684
2711
  const path = "HEAD.FILE.value";
@@ -2688,14 +2715,14 @@ var Common = class _Common {
2688
2715
  )?.groups?.tree;
2689
2716
  }
2690
2717
  getFamilySearchTreeId() {
2691
- const rin = get(this, "HEAD.SOUR._TREE.RIN.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.RIN.value");
2718
+ const rin = this.getFromSourceHeads("SOUR._TREE.RIN.value") || get(this, "HEAD.SOUR._TREE.RIN.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.RIN.value");
2692
2719
  if (rin) {
2693
2720
  return rin;
2694
2721
  }
2695
2722
  return "familysearch";
2696
2723
  }
2697
2724
  getFamilySearchTreeName() {
2698
- const treeName = get(this, "HEAD.SOUR._TREE.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.value");
2725
+ const treeName = this.getFromSourceHeads("SOUR._TREE.value") || get(this, "HEAD.SOUR._TREE.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.value");
2699
2726
  if (treeName) {
2700
2727
  return treeName;
2701
2728
  }
@@ -2787,11 +2814,11 @@ var Common = class _Common {
2787
2814
  const cleanName = fileName.replace(/\.ged$/i, "").replace(/_/g, " ");
2788
2815
  return `${prefix}${cleanName}`;
2789
2816
  }
2790
- const sourName = get(this, "HEAD.SOUR.NAME.value") || get(this.getGedcom(), "HEAD.SOUR.NAME.value");
2817
+ const sourName = this.getFromSourceHeads("SOUR.NAME.value") || get(this, "HEAD.SOUR.NAME.value") || get(this.getGedcom(), "HEAD.SOUR.NAME.value");
2791
2818
  if (sourName) {
2792
2819
  return `${prefix}${sourName}`;
2793
2820
  }
2794
- const sourValue = get(this, "HEAD.SOUR.value") || get(this.getGedcom(), "HEAD.SOUR.value");
2821
+ const sourValue = this.getFromSourceHeads("SOUR.value") || get(this, "HEAD.SOUR.value") || get(this.getGedcom(), "HEAD.SOUR.value");
2795
2822
  if (sourValue) {
2796
2823
  return `${prefix}${sourValue}`;
2797
2824
  }
@@ -2857,7 +2884,7 @@ var isOnlyMainProp = (key) => {
2857
2884
  };
2858
2885
  var isValidKey = (common, key) => {
2859
2886
  const prop = get(common, key);
2860
- return key !== "_gedcom" && key !== "_main" && key !== "_parent" && key !== "_uniqueId" && key !== "_refs" && key !== "_type" && (key === "id" || key === "_id" || key === "value" || key === "_value" || prop instanceof Common || prop instanceof List);
2887
+ return key !== "_gedcom" && key !== "_main" && key !== "_parent" && key !== "_uniqueId" && key !== "_refs" && key !== "_type" && !(typeof key === "string" && isGedcomTrailerTag(key)) && (key === "id" || key === "_id" || key === "value" || key === "_value" || prop instanceof Common || prop instanceof List);
2861
2888
  };
2862
2889
  var getValidKeys = (common) => {
2863
2890
  return Object.keys(common).filter((key) => {
@@ -3532,6 +3559,239 @@ var cacheDiscoveredPath = (gedcom, path) => {
3532
3559
  }
3533
3560
  };
3534
3561
 
3562
+ // src/utils/fact-edit.ts
3563
+ var SINGLETON_TAGS = /* @__PURE__ */ new Set(["BIRT", "DEAT", "SSN", "SEX", "DSCR"]);
3564
+ var firstRecord = (node) => {
3565
+ if (!node) {
3566
+ return void 0;
3567
+ }
3568
+ if (node instanceof List) {
3569
+ return node.index(0);
3570
+ }
3571
+ return node.index(0) ?? node;
3572
+ };
3573
+ var setDateOn = (gedcom, owner, parent, date) => {
3574
+ const trimmed = date.trim();
3575
+ if (!trimmed) {
3576
+ return;
3577
+ }
3578
+ let dateNode = parent.get("DATE");
3579
+ if (!dateNode || dateNode instanceof List) {
3580
+ dateNode = createCommonDate(gedcom, void 0, owner, parent);
3581
+ dateNode.type = "DATE";
3582
+ parent.set("DATE", dateNode);
3583
+ }
3584
+ dateNode.value = trimmed;
3585
+ };
3586
+ var fillFact = (gedcom, owner, event, input) => {
3587
+ if (input.value?.trim()) {
3588
+ event.value = input.value.trim();
3589
+ }
3590
+ if (input.type?.trim()) {
3591
+ event.set("TYPE", input.type.trim());
3592
+ }
3593
+ if (input.date) {
3594
+ setDateOn(gedcom, owner, event, input.date);
3595
+ }
3596
+ if (input.place?.trim()) {
3597
+ event.set("PLAC", input.place.trim());
3598
+ }
3599
+ if (input.note?.trim()) {
3600
+ event.set("NOTE", input.note.trim());
3601
+ }
3602
+ };
3603
+ var addIndividualFact = (indi, input) => {
3604
+ const gedcom = indi.getGedcom();
3605
+ if (!gedcom) {
3606
+ return void 0;
3607
+ }
3608
+ const tag = input.tag;
3609
+ let event = SINGLETON_TAGS.has(tag) ? firstRecord(indi.get(tag)) : void 0;
3610
+ if (!event) {
3611
+ event = createCommon(gedcom, void 0, indi);
3612
+ event.type = tag;
3613
+ if (SINGLETON_TAGS.has(tag)) {
3614
+ indi.set(tag, event);
3615
+ } else {
3616
+ indi.assign(tag, event);
3617
+ }
3618
+ }
3619
+ fillFact(gedcom, indi, event, input);
3620
+ return event;
3621
+ };
3622
+ var addFamilyFact = (fam, input) => {
3623
+ const gedcom = fam.getGedcom();
3624
+ if (!gedcom) {
3625
+ return void 0;
3626
+ }
3627
+ const event = createCommon(gedcom, void 0, fam);
3628
+ event.type = input.tag;
3629
+ fam.assign(input.tag, event);
3630
+ fillFact(gedcom, fam, event, input);
3631
+ return event;
3632
+ };
3633
+
3634
+ // src/utils/family-edit.ts
3635
+ var PEDIGREE_VALUES = [
3636
+ "birth" /* BIRTH */,
3637
+ "adopted" /* ADOPTED */,
3638
+ "foster" /* FOSTER */,
3639
+ "step" /* STEP */,
3640
+ "sealing" /* SEALING */
3641
+ ];
3642
+ var toGedcomPedigree = (value) => {
3643
+ const normalized = String(value || "birth" /* BIRTH */).toLowerCase();
3644
+ if (normalized === "biological" /* BIOLOGICAL */ || normalized === "birth" /* BIRTH */) {
3645
+ return "birth" /* BIRTH */;
3646
+ }
3647
+ const match = PEDIGREE_VALUES.find((item) => item === normalized);
3648
+ return match ?? "birth" /* BIRTH */;
3649
+ };
3650
+ var pointerIds = (tag) => {
3651
+ if (!tag) {
3652
+ return [];
3653
+ }
3654
+ if (tag instanceof List) {
3655
+ return tag.values().map((item) => item?.toValue?.()).filter((value2) => !!value2);
3656
+ }
3657
+ const value = tag.toValue?.();
3658
+ return value ? [String(value)] : [];
3659
+ };
3660
+ var firstPointerId = (tag) => pointerIds(tag)[0];
3661
+ var makePointer = (gedcom, parent, value, refType) => {
3662
+ const pointer = createCommon(gedcom, void 0, parent);
3663
+ pointer.value = value;
3664
+ pointer.refType = refType;
3665
+ return pointer;
3666
+ };
3667
+ var familyHasParent = (fam, indiId) => pointerIds(fam.get("HUSB")).includes(indiId) || pointerIds(fam.get("WIFE")).includes(indiId);
3668
+ var familyHasChild = (fam, indiId) => pointerIds(fam.get("CHIL")).includes(indiId);
3669
+ var spouseTagFor = (indi, fam) => {
3670
+ const husbId = firstPointerId(fam.get("HUSB"));
3671
+ const wifeId = firstPointerId(fam.get("WIFE"));
3672
+ if (husbId === indi.id) {
3673
+ return "HUSB";
3674
+ }
3675
+ if (wifeId === indi.id) {
3676
+ return "WIFE";
3677
+ }
3678
+ if (indi.isFemale()) {
3679
+ return wifeId && wifeId !== indi.id ? "HUSB" : "WIFE";
3680
+ }
3681
+ if (indi.isMale()) {
3682
+ return husbId && husbId !== indi.id ? "WIFE" : "HUSB";
3683
+ }
3684
+ return husbId ? "WIFE" : "HUSB";
3685
+ };
3686
+ var canAttachAsSpouse = (fam, indi) => {
3687
+ if (!indi.id) {
3688
+ return false;
3689
+ }
3690
+ if (familyHasParent(fam, indi.id)) {
3691
+ return true;
3692
+ }
3693
+ const tag = spouseTagFor(indi, fam);
3694
+ const occupied = firstPointerId(fam.get(tag));
3695
+ return !occupied || occupied === indi.id;
3696
+ };
3697
+ var pointerByValue = (tag, id) => {
3698
+ if (!tag) {
3699
+ return void 0;
3700
+ }
3701
+ const fromValues = tag.toValueList?.().item(id);
3702
+ if (fromValues) {
3703
+ return fromValues;
3704
+ }
3705
+ return tag.toList()?.values().find((item) => item?.toValue?.() === id);
3706
+ };
3707
+ var setChildPedigree = (fam, child, pedigree, parent) => {
3708
+ if (!fam.id || !child.id) {
3709
+ return;
3710
+ }
3711
+ const pedi = toGedcomPedigree(pedigree);
3712
+ const famc = pointerByValue(child.get("FAMC"), fam.id);
3713
+ if (famc) {
3714
+ famc.set("PEDI", pedi);
3715
+ }
3716
+ const chil = pointerByValue(fam.get("CHIL"), child.id);
3717
+ if (!chil) {
3718
+ return;
3719
+ }
3720
+ const setFather = !parent || parent.isMale() || parent.isUnknownSex();
3721
+ const setMother = !parent || parent.isFemale() || parent.isUnknownSex();
3722
+ if (setFather) {
3723
+ chil.set("_FREL", pedi);
3724
+ }
3725
+ if (setMother) {
3726
+ chil.set("_MREL", pedi);
3727
+ }
3728
+ };
3729
+ var attachSpouseToFamily = (fam, indi) => {
3730
+ const gedcom = fam.getGedcom() ?? indi.getGedcom();
3731
+ if (!indi.id || !fam.id || !gedcom) {
3732
+ return false;
3733
+ }
3734
+ if (!canAttachAsSpouse(fam, indi)) {
3735
+ return false;
3736
+ }
3737
+ const tag = spouseTagFor(indi, fam);
3738
+ if (firstPointerId(fam.get(tag)) !== indi.id) {
3739
+ fam.set(tag, makePointer(gedcom, fam, indi.id, "INDI"));
3740
+ }
3741
+ indi.assign("FAMS", makePointer(gedcom, indi, fam.id, "FAM"), true);
3742
+ return true;
3743
+ };
3744
+ var attachChildToFamily = (fam, child, pedigree, parent) => {
3745
+ const gedcom = fam.getGedcom() ?? child.getGedcom();
3746
+ if (!child.id || !fam.id || !gedcom) {
3747
+ return false;
3748
+ }
3749
+ if (!familyHasChild(fam, child.id)) {
3750
+ fam.assign("CHIL", makePointer(gedcom, fam, child.id, "INDI"), true);
3751
+ }
3752
+ const existingFamc = pointerByValue(child.get("FAMC"), fam.id);
3753
+ if (!existingFamc) {
3754
+ child.assign("FAMC", makePointer(gedcom, child, fam.id, "FAM"), true);
3755
+ }
3756
+ setChildPedigree(fam, child, pedigree, parent);
3757
+ return true;
3758
+ };
3759
+ var findReusableParentChildFamily = (parent, child) => {
3760
+ if (!parent.id || !child.id) {
3761
+ return void 0;
3762
+ }
3763
+ let reusableFamc;
3764
+ let already = false;
3765
+ child.getFamilies("FAMC")?.forEach((fam) => {
3766
+ if (!fam) {
3767
+ return;
3768
+ }
3769
+ if (familyHasParent(fam, parent.id) && familyHasChild(fam, child.id)) {
3770
+ already = true;
3771
+ return;
3772
+ }
3773
+ if (!reusableFamc && canAttachAsSpouse(fam, parent)) {
3774
+ reusableFamc = fam;
3775
+ }
3776
+ });
3777
+ if (already) {
3778
+ return "already";
3779
+ }
3780
+ if (reusableFamc) {
3781
+ return reusableFamc;
3782
+ }
3783
+ const parentFams = [];
3784
+ parent.getFamilies("FAMS")?.forEach((fam) => {
3785
+ if (fam) {
3786
+ parentFams.push(fam);
3787
+ }
3788
+ });
3789
+ if (parentFams.length === 1) {
3790
+ return parentFams[0];
3791
+ }
3792
+ return void 0;
3793
+ };
3794
+
3535
3795
  // src/utils/get-places.ts
3536
3796
  var getPlaces = (common, type = ["ALL" /* All */], maxLevel = 1, level = 0, mainKey) => {
3537
3797
  const types = Array.isArray(type) ? type : [type];
@@ -4162,6 +4422,31 @@ var Fam = class extends Common {
4162
4422
  getParents() {
4163
4423
  return this.getHusband().copy().merge(this.getWife());
4164
4424
  }
4425
+ hasParent(indi) {
4426
+ const indiId = typeof indi === "string" ? indi : indi?.id;
4427
+ return !!indiId && familyHasParent(this, indiId);
4428
+ }
4429
+ hasChild(indi) {
4430
+ const indiId = typeof indi === "string" ? indi : indi?.id;
4431
+ return !!indiId && familyHasChild(this, indiId);
4432
+ }
4433
+ canAddSpouse(indi) {
4434
+ return canAttachAsSpouse(this, indi);
4435
+ }
4436
+ addSpouse(indi) {
4437
+ return attachSpouseToFamily(this, indi);
4438
+ }
4439
+ addChild(child, pedigree, parent) {
4440
+ return attachChildToFamily(
4441
+ this,
4442
+ child,
4443
+ pedigree,
4444
+ parent
4445
+ );
4446
+ }
4447
+ addFact(input) {
4448
+ return addFamilyFact(this, input);
4449
+ }
4165
4450
  toList() {
4166
4451
  return new Families().concat(
4167
4452
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -4262,19 +4547,51 @@ var ALLOWED_FACTS = [
4262
4547
  "OCCU",
4263
4548
  "OCCUPATIONS",
4264
4549
  "RESI",
4550
+ "BIRT",
4551
+ "DEAT",
4265
4552
  "BAPT",
4553
+ "BAPM",
4266
4554
  "CHRI",
4267
4555
  "CHR",
4556
+ "CHRA",
4268
4557
  "BURI",
4269
- "EDUC",
4558
+ "CREM",
4559
+ "ADOP",
4560
+ "BARM",
4561
+ "BASM",
4562
+ "BLES",
4563
+ "CONF",
4564
+ "FCOM",
4565
+ "ORDN",
4566
+ "NATU",
4567
+ "EMIG",
4568
+ "IMMI",
4569
+ "CENS",
4570
+ "PROB",
4571
+ "WILL",
4270
4572
  "GRAD",
4573
+ "RETI",
4574
+ "EDUC",
4271
4575
  "DIV",
4272
- "IMMI",
4273
4576
  "RELI",
4577
+ "CAST",
4578
+ "DSCR",
4579
+ "NATI",
4580
+ "PROP",
4581
+ "SSN",
4582
+ "TITL",
4583
+ "ADDR",
4584
+ "BAPL",
4585
+ "CONL",
4586
+ "ENDL",
4587
+ "SLGC",
4274
4588
  "_MILT",
4275
4589
  "_MILTID",
4276
4590
  "FACT",
4277
- "_ORIG"
4591
+ "_ORIG",
4592
+ "_WLNK",
4593
+ "WWW",
4594
+ "URL"
4278
4595
  ];
4279
4596
  var DISALLOWED_CUSTOM_FACTS = ["DNA Test", "Newspaper"];
4280
4597
  var CustomFactRenderers = {
@@ -4818,7 +5135,7 @@ var Indi = class extends Common {
4818
5135
  return result;
4819
5136
  }
4820
5137
  ancestryLink() {
4821
- const www = this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
5138
+ const www = this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4822
5139
  const tree = this.getAncestryTreeId();
4823
5140
  if (this.id) {
4824
5141
  return `https://${www}/family-tree/person/tree/${tree}/person/${this.id.replace(
@@ -4830,7 +5147,7 @@ var Indi = class extends Common {
4830
5147
  async ancestryMedia(namespace) {
4831
5148
  const list = {};
4832
5149
  const objeList = this.get("OBJE")?.toList().copy();
4833
- const www = this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
5150
+ const www = this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4834
5151
  const tree = this.getAncestryTreeId();
4835
5152
  if (objeList) {
4836
5153
  await Promise.all(
@@ -4890,7 +5207,7 @@ var Indi = class extends Common {
4890
5207
  return list;
4891
5208
  }
4892
5209
  myheritageLink(poolId = 0) {
4893
- const www = this._gedcom?.HEAD?.SOUR?.CORP?.value?.toLowerCase().replace(/^www\./gi, "");
5210
+ const www = (this.getFromSourceHeads("SOUR.CORP.value") || this._gedcom?.HEAD?.SOUR?.CORP?.value)?.toLowerCase().replace(/^www\./gi, "");
4894
5211
  const site = this.getMyHeritageTreeId();
4895
5212
  const file = this._gedcom?.HEAD?.get("FILE")?.toValue()?.match(/Exported by MyHeritage.com from .+ in (?<site>.+) on .+$/)?.groups?.site;
4896
5213
  const normalizedFile = file?.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-");
@@ -5411,6 +5728,57 @@ var Indi = class extends Common {
5411
5728
  isUnknownSex() {
5412
5729
  return !this.isMale() && !this.isFemale();
5413
5730
  }
5731
+ addSpouse(other) {
5732
+ if (!this.id || !other?.id || this.id === other.id || !this._gedcom) {
5733
+ return void 0;
5734
+ }
5735
+ const existing = getFamilyWith(this, other.id);
5736
+ if (existing) {
5737
+ return existing;
5738
+ }
5739
+ const fam = this._gedcom.createFamily();
5740
+ if (!fam.addSpouse(this) || !fam.addSpouse(other)) {
5741
+ return void 0;
5742
+ }
5743
+ return fam;
5744
+ }
5745
+ addChild(child, pedigree) {
5746
+ if (!this.id || !child?.id || this.id === child.id || !this._gedcom) {
5747
+ return void 0;
5748
+ }
5749
+ const existing = findReusableParentChildFamily(
5750
+ this,
5751
+ child
5752
+ );
5753
+ if (existing === "already") {
5754
+ const fam2 = child.getFamilies("FAMC")?.find(
5755
+ (item) => !!item && item.hasParent(this.id) && item.hasChild(child.id)
5756
+ );
5757
+ if (fam2) {
5758
+ setChildPedigree(
5759
+ fam2,
5760
+ child,
5761
+ pedigree,
5762
+ this
5763
+ );
5764
+ }
5765
+ return fam2;
5766
+ }
5767
+ const fam = existing ?? this._gedcom.createFamily();
5768
+ if (!fam.addSpouse(this)) {
5769
+ return void 0;
5770
+ }
5771
+ if (!fam.addChild(child, pedigree, this)) {
5772
+ return void 0;
5773
+ }
5774
+ return fam;
5775
+ }
5776
+ addParent(parent, pedigree) {
5777
+ return parent.addChild(this, pedigree);
5778
+ }
5779
+ addFact(input) {
5780
+ return addIndividualFact(this, input);
5781
+ }
5414
5782
  getParentType(id) {
5415
5783
  let indi;
5416
5784
  if (typeof id === "string" || typeof id === "number") {
@@ -5611,7 +5979,9 @@ var Indi = class extends Common {
5611
5979
  }
5612
5980
  }
5613
5981
  if (kinship !== "child" || !breakAfterSpouse) {
5614
- indi.getBiologicalFathers().copy().merge(indi.getBiologicalMothers()).merge(indi.getFathers().copy().merge(indi.getMothers())).forEach((relative) => {
5982
+ indi.getBiologicalFathers().copy().merge(indi.getBiologicalMothers()).merge(
5983
+ indi.getFathers().copy().merge(indi.getMothers())
5984
+ ).forEach((relative) => {
5615
5985
  if (!visited.has(relative)) {
5616
5986
  const currentRelation = indi.getParentType(relative);
5617
5987
  const isNonBiological = !!currentRelation && currentRelation !== "biological" /* BIOLOGICAL */;
@@ -17,6 +17,7 @@ interface IGedComStructure extends Common, Omit<NonStandard, "id" | "value">, Pa
17
17
  "@@REPO"?: Repositories;
18
18
  "@@SOUR"?: Sources;
19
19
  "@@SUBM"?: Submitters;
20
+ _ORIGHEAD?: Common;
20
21
  HEAD?: Common & {
21
22
  GEDC?: Common & {
22
23
  VERS?: Common;
@@ -1 +1 @@
1
- {"version":3,"file":"gedcom.d.ts","sourceRoot":"","sources":["../../src/structures/gedcom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,iBAAiB,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,cAAc,MAAM,QAAQ,CAAC;AAEzC,UAAU,gBACT,SACC,MAAM,EACN,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,EACjC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG;QACf,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,GAAG;YAChB,GAAG,CAAC,EAAE,MAAM,CAAC;SACb,CAAC;QACF,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,GAAG;gBACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,GAAG,CAAC,EAAE,MAAM,CAAC;aACb,GAAG,iBAAiB,CAAC;YACtB,IAAI,CAAC,EAAE,MAAM,GAAG;gBACf,IAAI,CAAC,EAAE,MAAM,GAAG;oBACf,IAAI,CAAC,EAAE,MAAM,CAAC;iBACd,CAAC;gBACF,IAAI,CAAC,EAAE,MAAM,CAAC;aACd,CAAC;YACF,KAAK,CAAC,EAAE,MAAM,GAAG;gBAChB,GAAG,CAAC,EAAE,MAAM,CAAC;aACb,CAAC;SACF,CAAC;QAEF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;QACF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;KACF,GAAG,cAAc,CAAC;CACnB;AACD,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"gedcom.d.ts","sourceRoot":"","sources":["../../src/structures/gedcom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,iBAAiB,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,cAAc,MAAM,QAAQ,CAAC;AAEzC,UAAU,gBACT,SACC,MAAM,EACN,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,EACjC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG;QACf,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,GAAG;YAChB,GAAG,CAAC,EAAE,MAAM,CAAC;SACb,CAAC;QACF,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,GAAG;gBACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,GAAG,CAAC,EAAE,MAAM,CAAC;aACb,GAAG,iBAAiB,CAAC;YACtB,IAAI,CAAC,EAAE,MAAM,GAAG;gBACf,IAAI,CAAC,EAAE,MAAM,GAAG;oBACf,IAAI,CAAC,EAAE,MAAM,CAAC;iBACd,CAAC;gBACF,IAAI,CAAC,EAAE,MAAM,CAAC;aACd,CAAC;YACF,KAAK,CAAC,EAAE,MAAM,GAAG;gBAChB,GAAG,CAAC,EAAE,MAAM,CAAC;aACb,CAAC;SACF,CAAC;QAEF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;QACF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,GAAG;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;KACF,GAAG,cAAc,CAAC;CACnB;AACD,eAAe,gBAAgB,CAAC"}
@@ -50,9 +50,14 @@ interface Tags {
50
50
  _MILT?: Common;
51
51
  _MILTID?: Common;
52
52
  _ORIG?: Common;
53
+ _ORIGHEAD?: Common;
53
54
  _LABEL?: Common;
54
55
  _WLNK?: Common;
55
56
  _MARNM?: Common;
57
+ _UID?: Common;
58
+ _TID?: Common;
59
+ _TREE?: Common;
60
+ _ENV?: Common;
56
61
  _INDI?: Common;
57
62
  _GUESSEDORIGINAL?: Common;
58
63
  _FS_LINK?: Common;
@@ -111,6 +116,7 @@ interface Tags {
111
116
  DSCR?: Common;
112
117
  EDUC?: Common;
113
118
  EMIG?: Common;
119
+ EMAIL?: Common;
114
120
  ENDL?: Common;
115
121
  ENGA?: Common;
116
122
  EVEN?: Common;
@@ -182,9 +188,13 @@ interface Tags {
182
188
  VERS?: Common;
183
189
  FORM?: Common;
184
190
  WWW?: Common;
191
+ URL?: Common;
185
192
  BAPT?: Common;
186
193
  CHRI?: Common;
187
194
  BURI?: Common;
195
+ CREM?: Common;
196
+ BLES?: Common;
197
+ PROP?: Common;
188
198
  GEDC?: Common;
189
199
  RFN?: Common;
190
200
  }