@treeviz/gedcom-parser 2.1.17 → 2.1.22

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.
@@ -361,6 +361,30 @@ var mediaIdValue = (obje, path) => {
361
361
  return typeof value === "string" && value.trim() ? value.trim() : void 0;
362
362
  };
363
363
  var resolveObjeMediaId = (obje) => mediaIdValue(obje, "RIN") || mediaIdValue(obje, "_CLON._OID") || mediaIdValue(obje, "_MSER._LKID") || mediaIdValue(obje, "_OID") || mediaIdValue(obje, "_LKID");
364
+ var ANCESTRY_TREE_MEDIA_NAMESPACE = 1093;
365
+ var ANCESTRY_NAMESPACE_IN_URL = /\/namespaces\/(\d+)\/media\//i;
366
+ var parseAncestryNamespaceFromUrl = (url) => {
367
+ if (!url) {
368
+ return void 0;
369
+ }
370
+ const match = url.match(ANCESTRY_NAMESPACE_IN_URL);
371
+ const namespace = match?.[1] ? Number(match[1]) : NaN;
372
+ return Number.isFinite(namespace) ? namespace : void 0;
373
+ };
374
+ var isAncestryOriginObje = (obje) => {
375
+ if (!obje) {
376
+ return false;
377
+ }
378
+ const orig = mediaIdValue(obje, "_ORIG");
379
+ if (orig?.toLowerCase() === "acom") {
380
+ return true;
381
+ }
382
+ const file = mediaIdValue(obje, "FILE") ?? "";
383
+ if (parseAncestryNamespaceFromUrl(file)) {
384
+ return true;
385
+ }
386
+ return Boolean(resolveObjeMediaId(obje) && !file.trim());
387
+ };
364
388
  var ANCESTRY_MEDIA_RETRIEVAL_PREFIX = "https://www.ancestry.com/api/media/retrieval/v2/image";
365
389
  var ANCESTRY_MEDIA_QUERY = "client=trees-mediaservice&imageQuality=hq";
366
390
  var ancestryMediaPath = (namespace, imgId) => `/namespaces/${namespace}/media/${imgId}?${ANCESTRY_MEDIA_QUERY}`;
@@ -1154,8 +1178,25 @@ var Common = class _Common {
1154
1178
  getHeadRecord() {
1155
1179
  return get(this, "HEAD") || get(this.getGedcom(), "HEAD");
1156
1180
  }
1181
+ unwrapHeadRecord(node) {
1182
+ if (!node) {
1183
+ return void 0;
1184
+ }
1185
+ const common = node instanceof List ? node.index(0) : node;
1186
+ if (!common || typeof common.get !== "function") {
1187
+ return void 0;
1188
+ }
1189
+ const nested = common.get("HEAD");
1190
+ if (nested instanceof List) {
1191
+ return nested.index(0) ?? common;
1192
+ }
1193
+ if (nested instanceof _Common) {
1194
+ return nested;
1195
+ }
1196
+ return common;
1197
+ }
1157
1198
  getOriginalHeadRecord() {
1158
- return get(this, ORIG_HEAD_TAG) || get(this.getGedcom(), ORIG_HEAD_TAG) || get(this.getHeadRecord(), ORIG_HEAD_TAG);
1199
+ return this.unwrapHeadRecord(get(this, ORIG_HEAD_TAG)) || this.unwrapHeadRecord(get(this.getGedcom(), ORIG_HEAD_TAG)) || this.unwrapHeadRecord(get(this.getHeadRecord(), ORIG_HEAD_TAG));
1159
1200
  }
1160
1201
  getSourceHeads() {
1161
1202
  const heads = [this.getOriginalHeadRecord(), this.getHeadRecord()];
@@ -1163,9 +1204,23 @@ var Common = class _Common {
1163
1204
  return Boolean(head && heads.indexOf(head) === index);
1164
1205
  });
1165
1206
  }
1207
+ sourceHeadField(head, path) {
1208
+ const normalized = path.endsWith(".value") ? path.slice(0, -".value".length) : path;
1209
+ const node = head.get(normalized);
1210
+ if (!node) {
1211
+ return void 0;
1212
+ }
1213
+ if (node instanceof List) {
1214
+ return node.index(0)?.toValue();
1215
+ }
1216
+ if (typeof node.toValue === "function") {
1217
+ return node.toValue();
1218
+ }
1219
+ return void 0;
1220
+ }
1166
1221
  getFromSourceHeads(path) {
1167
1222
  for (const head of this.getSourceHeads()) {
1168
- const value = get(head, path);
1223
+ const value = this.sourceHeadField(head, path);
1169
1224
  if (value !== void 0 && value !== null && value !== "") {
1170
1225
  return value;
1171
1226
  }
@@ -1174,8 +1229,8 @@ var Common = class _Common {
1174
1229
  }
1175
1230
  sourStartsWith(prefix) {
1176
1231
  return this.getSourceHeads().some((head) => {
1177
- const sour = get(head, "SOUR.value");
1178
- return !!sour?.toLowerCase()?.startsWith(prefix);
1232
+ const sour = this.sourceHeadField(head, "SOUR");
1233
+ return typeof sour === "string" && sour.toLowerCase().startsWith(prefix);
1179
1234
  });
1180
1235
  }
1181
1236
  isGenoPro() {
@@ -1185,7 +1240,7 @@ var Common = class _Common {
1185
1240
  return this.sourStartsWith("ahnenblatt");
1186
1241
  }
1187
1242
  isGeni() {
1188
- return this.sourStartsWith("geni");
1243
+ return this.sourStartsWith("geni.com");
1189
1244
  }
1190
1245
  isAncestry() {
1191
1246
  return this.sourStartsWith("ancestry");
@@ -1193,6 +1248,51 @@ var Common = class _Common {
1193
1248
  isMyHeritage() {
1194
1249
  return this.sourStartsWith("myheritage");
1195
1250
  }
1251
+ /**
1252
+ * GEDCOM root for Ancestry media helpers.
1253
+ * `this._gedcom` when called on a child record; `this` when called on the file root.
1254
+ *
1255
+ * Cannot use `instanceof GedCom`: `GedComType` is a type alias (erased at runtime),
1256
+ * and importing the `GedCom` class here would cycle (`GedCom extends Common`).
1257
+ * The root is the only Common with an `objes()` method.
1258
+ */
1259
+ hostGedcom() {
1260
+ const linked = this.getGedcom();
1261
+ if (linked) {
1262
+ return linked;
1263
+ }
1264
+ if ("objes" in this && typeof this.objes === "function") {
1265
+ return this;
1266
+ }
1267
+ return void 0;
1268
+ }
1269
+ /** True when the file still has Ancestry tree media (`_ORIG acom`, `_OID`, retrieval URL). */
1270
+ hasAncestryOriginMedia() {
1271
+ const objes = this.hostGedcom()?.objes?.();
1272
+ return objes?.values().some((obje) => isAncestryOriginObje(obje)) ?? false;
1273
+ }
1274
+ /**
1275
+ * Namespace for Ancestry tree photos. Prefer a `namespaces/{id}` FILE URL
1276
+ * (TreeViz GEDCOM 7 / GEDZIP export), otherwise 1093 for member-tree media.
1277
+ */
1278
+ getAncestryMediaNamespace() {
1279
+ const objes = this.hostGedcom()?.objes?.();
1280
+ if (objes) {
1281
+ for (const obje of objes.values()) {
1282
+ const file = obje?.get("FILE")?.toValue();
1283
+ const fromUrl = parseAncestryNamespaceFromUrl(
1284
+ typeof file === "string" ? file : void 0
1285
+ );
1286
+ if (fromUrl) {
1287
+ return fromUrl;
1288
+ }
1289
+ }
1290
+ }
1291
+ if (this.isAncestry() || this.hasAncestryOriginMedia()) {
1292
+ return ANCESTRY_TREE_MEDIA_NAMESPACE;
1293
+ }
1294
+ return void 0;
1295
+ }
1196
1296
  /**
1197
1297
  * Get the source type as a string (for prefixing tree IDs and names)
1198
1298
  * Returns the detected source type or undefined if unknown
@@ -1209,13 +1309,13 @@ var Common = class _Common {
1209
1309
  }
1210
1310
  isFamilySearch() {
1211
1311
  return this.getSourceHeads().some((head) => {
1212
- const sourName = get(head, "SOUR.NAME.value");
1312
+ const sourName = this.sourceHeadField(head, "SOUR.NAME");
1213
1313
  return sourName === "FamilySearch API";
1214
1314
  });
1215
1315
  }
1216
1316
  isGNO2GED() {
1217
1317
  return this.getSourceHeads().some((head) => {
1218
- const sour = get(head, "SOUR.value");
1318
+ const sour = this.sourceHeadField(head, "SOUR");
1219
1319
  return sour === "GNO2GED";
1220
1320
  });
1221
1321
  }
@@ -1260,8 +1360,7 @@ var Common = class _Common {
1260
1360
  return this.getFromSourceHeads("SOUR._TREE.value") || (get(this, "HEAD.SOUR._TREE.value") || get(this.getGedcom(), "HEAD.SOUR._TREE.value"));
1261
1361
  }
1262
1362
  getMyHeritageTreeName() {
1263
- const path = "HEAD.FILE.value";
1264
- const treeDetails = get(this, path) || get(this.getGedcom(), path);
1363
+ const treeDetails = this.getFromSourceHeads("FILE.value") || (get(this, "HEAD.FILE.value") || get(this.getGedcom(), "HEAD.FILE.value"));
1265
1364
  return treeDetails?.match(
1266
1365
  /Exported by MyHeritage.com from (?<tree>.+) in.+$/
1267
1366
  )?.groups?.tree;
@@ -1278,7 +1377,7 @@ var Common = class _Common {
1278
1377
  if (treeName) {
1279
1378
  return treeName;
1280
1379
  }
1281
- const fileName = get(this, "HEAD.FILE.value") || get(this.getGedcom(), "HEAD.FILE.value");
1380
+ const fileName = this.getFromSourceHeads("FILE.value") || get(this, "HEAD.FILE.value") || get(this.getGedcom(), "HEAD.FILE.value");
1282
1381
  return fileName || "FamilySearch Import";
1283
1382
  }
1284
1383
  getAhnenblattTreeId() {
@@ -2873,6 +2972,45 @@ var implemented = (type, ...args) => {
2873
2972
  var notImplemented = (type, ...args) => {
2874
2973
  console.error(`[Not Implemented] ${type}`, ...args);
2875
2974
  };
2975
+
2976
+ // src/utils/multimedia.ts
2977
+ var inferMediaForm = (file, fallback = "bin") => {
2978
+ const withoutQuery = file.split("?")[0] || file;
2979
+ const ext = getFileExtension(withoutQuery);
2980
+ if (ext) {
2981
+ return ext.toLowerCase() === "jpeg" ? "jpg" : ext.toLowerCase();
2982
+ }
2983
+ return fallback;
2984
+ };
2985
+ var mergeMediaLists = (...lists) => {
2986
+ const merged = {};
2987
+ for (const list of lists) {
2988
+ if (!list) continue;
2989
+ Object.assign(merged, list);
2990
+ }
2991
+ return merged;
2992
+ };
2993
+ var mergeMediaListsByObjeKey = (...lists) => {
2994
+ const merged = {};
2995
+ const seen = /* @__PURE__ */ new Set();
2996
+ for (const list of lists) {
2997
+ if (!list) {
2998
+ continue;
2999
+ }
3000
+ for (const [id, item] of Object.entries(list)) {
3001
+ const objeKey = item.key ? String(item.key) : "";
3002
+ if (objeKey && seen.has(objeKey)) {
3003
+ continue;
3004
+ }
3005
+ merged[id] = item;
3006
+ if (objeKey) {
3007
+ seen.add(objeKey);
3008
+ }
3009
+ }
3010
+ }
3011
+ return merged;
3012
+ };
3013
+ var isObjePointer = (value) => typeof value === "string" && /^@O\d+@$/.test(value);
2876
3014
  var uniqueItemsCache = /* @__PURE__ */ new WeakMap();
2877
3015
  var setNestedGroup = (obj, key, value, uniqueCounting = true) => {
2878
3016
  const parts = Array.isArray(key) ? key : key.split(/,\s*/);
@@ -3651,10 +3789,12 @@ var relativesOnLevelCache = relativesCache("relativesOnLevelCache");
3651
3789
  var relativesOnDegreeCache = relativesCache("relativesOnDegreeCache");
3652
3790
  var Indi = class extends Common {
3653
3791
  toName() {
3654
- return this.get("NAME")?.toValue();
3792
+ const name = this.get("NAME");
3793
+ const value = name?.index(0)?.toValue() ?? name?.toValue();
3794
+ return typeof value === "string" ? value : void 0;
3655
3795
  }
3656
3796
  toNaturalName() {
3657
- return this.get("NAME")?.toValue()?.replaceAll("/", "");
3797
+ return this.toName()?.replaceAll("/", "");
3658
3798
  }
3659
3799
  toList() {
3660
3800
  return new Individuals().concat(
@@ -4137,7 +4277,10 @@ var Indi = class extends Common {
4137
4277
  return result;
4138
4278
  }
4139
4279
  ancestryLink() {
4140
- const www = this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4280
+ let www = this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4281
+ if (!www || /treeviz/i.test(String(www))) {
4282
+ www = "www.ancestry.com";
4283
+ }
4141
4284
  const tree = this.getAncestryTreeId();
4142
4285
  if (this.id) {
4143
4286
  return `https://${www}/family-tree/person/tree/${tree}/person/${this.id.replace(
@@ -4149,14 +4292,15 @@ var Indi = class extends Common {
4149
4292
  async ancestryMedia(namespace) {
4150
4293
  const list = {};
4151
4294
  const objeList = this.get("OBJE")?.toList().copy();
4152
- const www = this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4295
+ this.getFromSourceHeads("SOUR.CORP.WWW.value") || this._gedcom?.HEAD?.SOUR?.CORP?.WWW?.value;
4153
4296
  const tree = this.getAncestryTreeId();
4297
+ const usedNamespace = namespace || this.getAncestryMediaNamespace() || ANCESTRY_TREE_MEDIA_NAMESPACE;
4154
4298
  if (objeList) {
4155
4299
  await Promise.all(
4156
4300
  objeList.map(async (objeRef) => {
4157
4301
  const key = objeXrefKey(objeRef, 0);
4158
4302
  const obje = objeRef?.standardizeMedia(
4159
- namespace,
4303
+ usedNamespace,
4160
4304
  true,
4161
4305
  ancestryMediaFileUrl
4162
4306
  );
@@ -4168,27 +4312,9 @@ var Indi = class extends Common {
4168
4312
  const type = resolveObjeForm(obje) ?? (url ? getFileExtension(url) : void 0) ?? "raw";
4169
4313
  let imgId = media;
4170
4314
  const hasEmbeddedOrLocalFile = !!url && (url.startsWith("data:") || url.startsWith("blob:") || !/^https?:\/\//i.test(url));
4171
- if (!hasEmbeddedOrLocalFile && (!www || !tree || !this.id)) {
4172
- return;
4173
- }
4174
4315
  if (!this.id) {
4175
4316
  return;
4176
4317
  }
4177
- if (!namespace && !url) {
4178
- try {
4179
- if (media) {
4180
- const mediaDetailsResponse = await fetch(
4181
- `https://www.ancestry.com/api/media/viewer/v2/trees/${tree}/media?id=${media}`
4182
- );
4183
- const mediaDetails = await mediaDetailsResponse.json();
4184
- if (mediaDetails.url) {
4185
- url = `${mediaDetails.url}&imageQuality=hq`;
4186
- }
4187
- }
4188
- } catch (_e) {
4189
- }
4190
- url = url || `https://${www}/mediaui-viewer/tree/${tree}/media/${media}`;
4191
- }
4192
4318
  if (!imgId && hasEmbeddedOrLocalFile && url) {
4193
4319
  imgId = typeof media === "string" && media || `local-${String(key).replace(/[@]/g, "")}-${getFileExtension(url) || "bin"}`;
4194
4320
  }
@@ -4213,14 +4339,25 @@ var Indi = class extends Common {
4213
4339
  }
4214
4340
  return list;
4215
4341
  }
4216
- myheritageLink(poolId = 0) {
4217
- const www = (this.getFromSourceHeads("SOUR.CORP.value") || this._gedcom?.HEAD?.SOUR?.CORP?.value)?.toLowerCase().replace(/^www\./gi, "");
4342
+ myheritageLink(poolId = 0, treeToken) {
4343
+ let www = (this.getFromSourceHeads("SOUR.CORP.value") || this._gedcom?.HEAD?.SOUR?.CORP?.value)?.toLowerCase().replace(/^www\./gi, "");
4344
+ if (!www || /treeviz/i.test(www)) {
4345
+ www = "myheritage.com";
4346
+ }
4347
+ if (!this.id) {
4348
+ return;
4349
+ }
4350
+ const id = Number(this.id.replace(/@|I/g, "")) + poolId;
4351
+ if (!Number.isFinite(id)) {
4352
+ return;
4353
+ }
4354
+ const slug = this.toNaturalName()?.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || String(id);
4355
+ if (treeToken) {
4356
+ return `https://www.${www}/profile-${treeToken}-${id}/${slug}`;
4357
+ }
4218
4358
  const site = this.getMyHeritageTreeId();
4219
- const file = this._gedcom?.HEAD?.get("FILE")?.toValue()?.match(/Exported by MyHeritage.com from .+ in (?<site>.+) on .+$/)?.groups?.site;
4220
- const normalizedFile = file?.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-");
4221
- if (normalizedFile && this.id) {
4222
- const id = Number(this.id.replace(/@|I/g, "")) + poolId;
4223
- return `https://www.${www}/site-family-tree-${site}/${normalizedFile}#!profile-${id}-info`;
4359
+ if (site) {
4360
+ return `https://www.${www}/person-${id}_${site}_${site}/${slug}`;
4224
4361
  }
4225
4362
  }
4226
4363
  myheritageMedia() {
@@ -4269,6 +4406,14 @@ var Indi = class extends Common {
4269
4406
  });
4270
4407
  return list;
4271
4408
  }
4409
+ geniLink() {
4410
+ if (!this.id) {
4411
+ return;
4412
+ }
4413
+ const id = this.id.replace(/@|I/g, "");
4414
+ const given = this.toNaturalName()?.trim().split(/\s+/)[0] || id;
4415
+ return `https://www.geni.com/people/${given}/${id}`;
4416
+ }
4272
4417
  familySearchLink() {
4273
4418
  const wwwTags = this.get("WWW")?.toList();
4274
4419
  const wwwTag = wwwTags?.find((wwwTag2) => {
@@ -4437,16 +4582,26 @@ var Indi = class extends Common {
4437
4582
  return list;
4438
4583
  }
4439
4584
  async multimedia(namespace) {
4440
- if (this?.isAncestry()) {
4441
- return await this.ancestryMedia(namespace);
4585
+ const lists = [];
4586
+ const ownObjes = this.get("OBJE")?.toList()?.values() ?? [];
4587
+ const ownAncestryMedia = ownObjes.some(
4588
+ (obje) => !!obje && (isAncestryOriginObje(obje) || isAncestryOriginObje(obje.ref))
4589
+ );
4590
+ if (this.isAncestry() || ownAncestryMedia) {
4591
+ lists.push(
4592
+ await this.ancestryMedia(
4593
+ namespace || this.getAncestryMediaNamespace()
4594
+ )
4595
+ );
4442
4596
  }
4443
4597
  if (this?.isMyHeritage()) {
4444
- return this.myheritageMedia();
4598
+ lists.push(this.myheritageMedia());
4445
4599
  }
4446
4600
  if (this?.isGeni()) {
4447
- return this.geniMedia();
4601
+ lists.push(this.geniMedia());
4448
4602
  }
4449
- return this.universalMedia();
4603
+ lists.push(this.universalMedia());
4604
+ return mergeMediaListsByObjeKey(...lists);
4450
4605
  }
4451
4606
  async getProfilePicture(namespace, onlyPrimary = true) {
4452
4607
  if (!this.id) {
@@ -4539,12 +4694,15 @@ var Indi = class extends Common {
4539
4694
  );
4540
4695
  return void 0;
4541
4696
  }
4542
- link(poolId) {
4697
+ link(poolId, treeToken) {
4543
4698
  if (this?.isAncestry()) {
4544
4699
  return this.ancestryLink();
4545
4700
  }
4546
4701
  if (this?.isMyHeritage()) {
4547
- return this.myheritageLink(poolId);
4702
+ return this.myheritageLink(poolId, treeToken);
4703
+ }
4704
+ if (this?.isGeni()) {
4705
+ return this.geniLink();
4548
4706
  }
4549
4707
  if (this?.isFamilySearch()) {
4550
4708
  return this.familySearchLink();
@@ -6304,11 +6462,28 @@ var KinshipTranslatorBasic = class {
6304
6462
  // src/kinship-translator/patterns.hu.ts
6305
6463
  var parentRelationsHu = {
6306
6464
  step: "mostoha",
6307
- foster: "nevelt",
6465
+ foster: { ancestor: "nevel\u0151", other: "nevelt" },
6308
6466
  birth: "v\xE9rszerinti",
6309
6467
  biological: "v\xE9rszerinti",
6310
- adopted: "\xF6r\xF6kbefogadott"
6468
+ adopted: { ancestor: "\xF6r\xF6kbefogad\xF3", other: "\xF6r\xF6kbefogadott" }
6469
+ };
6470
+ var parentRelationPrefix = (relation, ancestor) => {
6471
+ const label = parentRelationsHu[relation];
6472
+ if (!label) {
6473
+ return;
6474
+ }
6475
+ if (typeof label === "string") {
6476
+ return label;
6477
+ }
6478
+ return ancestor ? label.ancestor : label.other;
6311
6479
  };
6480
+ var parentRelationModifiers = [
6481
+ ...new Set(
6482
+ Object.values(parentRelationsHu).flatMap(
6483
+ (label) => typeof label === "string" ? [label] : [label.ancestor, label.other]
6484
+ )
6485
+ )
6486
+ ].join("|");
6312
6487
  var nominativus = {
6313
6488
  apa: { nominativus: "apa", dativus: "apj\xE1nak", possessivus: "apja" },
6314
6489
  anya: { nominativus: "anya", dativus: "anyj\xE1nak", possessivus: "anyja" },
@@ -6386,15 +6561,9 @@ var casesHu = {
6386
6561
  var InLawsHu = {
6387
6562
  "gyermek feles\xE9ge": "meny",
6388
6563
  "gyermek f\xE9rje": "v\u0151",
6389
- [`(f\xE9rj|feles\xE9g) (?<mod1>(${Object.values(parentRelationsHu).join(
6390
- "|"
6391
- )}) )?anyja`]: "any\xF3s",
6392
- [`(f\xE9rj|feles\xE9g) (?<mod1>(${Object.values(parentRelationsHu).join(
6393
- "|"
6394
- )}) )?apja`]: "ap\xF3s",
6395
- [`(f\xE9rj|feles\xE9g) (?<mod1>(${Object.values(parentRelationsHu).join(
6396
- "|"
6397
- )}) )?(f\xE9l)?testv\xE9re`]: (indi) => {
6564
+ [`(f\xE9rj|feles\xE9g) (?<mod1>(${parentRelationModifiers}) )?anyja`]: "any\xF3s",
6565
+ [`(f\xE9rj|feles\xE9g) (?<mod1>(${parentRelationModifiers}) )?apja`]: "ap\xF3s",
6566
+ [`(f\xE9rj|feles\xE9g) (?<mod1>(${parentRelationModifiers}) )?(f\xE9l)?testv\xE9re`]: (indi) => {
6398
6567
  if (indi?.isMale()) {
6399
6568
  return "s\xF3gor";
6400
6569
  }
@@ -6671,7 +6840,12 @@ var KinshipTranslatorHU = class extends KinshipTranslatorBasic {
6671
6840
  if (!relation || !this.pathN?.relation) {
6672
6841
  return relation ?? "";
6673
6842
  }
6674
- return `${parentRelationsHu[this.pathN.relation]} ${relation}`;
6843
+ const isAncestor = (this.pathN.level ?? 0) > 0 && (this.pathN.degree ?? 0) === 0;
6844
+ const prefix = parentRelationPrefix(this.pathN.relation, isAncestor);
6845
+ if (!prefix) {
6846
+ return relation;
6847
+ }
6848
+ return `${prefix} ${relation}`;
6675
6849
  }
6676
6850
  };
6677
6851
 
@@ -6871,6 +7045,10 @@ var KinshipTranslatorEn = class extends KinshipTranslatorBasic {
6871
7045
  if (!relation || !this.pathN?.relation) {
6872
7046
  return relation ?? "";
6873
7047
  }
7048
+ if (this.pathN.relation === "adopted") {
7049
+ const isAncestor = (this.pathN.level ?? 0) > 0 && (this.pathN.degree ?? 0) === 0;
7050
+ return `${isAncestor ? "adoptive" : "adopted"} ${relation}`;
7051
+ }
6874
7052
  return `${this.pathN.relation} ${relation}`;
6875
7053
  }
6876
7054
  };
@@ -8029,6 +8207,39 @@ var lineal = (level, sex, kind) => {
8029
8207
  }
8030
8208
  return `${L - 1}\u4E16\u306E\u5B6B`;
8031
8209
  };
8210
+ var adoptedRelation = (relation) => {
8211
+ if (relation === "\u7236") {
8212
+ return "\u990A\u7236";
8213
+ }
8214
+ if (relation === "\u6BCD") {
8215
+ return "\u990A\u6BCD";
8216
+ }
8217
+ if (relation === "\u89AA") {
8218
+ return "\u990A\u89AA";
8219
+ }
8220
+ if (relation === "\u606F\u5B50" || relation === "\u5B50") {
8221
+ return "\u990A\u5B50";
8222
+ }
8223
+ if (relation === "\u5A18") {
8224
+ return "\u990A\u5973";
8225
+ }
8226
+ return `\u990A${relation}`;
8227
+ };
8228
+ var fosterRelation = (relation) => {
8229
+ if (relation === "\u7236") {
8230
+ return "\u91CC\u7236";
8231
+ }
8232
+ if (relation === "\u6BCD") {
8233
+ return "\u91CC\u6BCD";
8234
+ }
8235
+ if (relation === "\u89AA") {
8236
+ return "\u91CC\u89AA";
8237
+ }
8238
+ if (relation === "\u606F\u5B50" || relation === "\u5A18" || relation === "\u5B50") {
8239
+ return "\u91CC\u5B50";
8240
+ }
8241
+ return `\u91CC${relation}`;
8242
+ };
8032
8243
  var cousinPlain = (degree) => {
8033
8244
  if (degree <= 1) {
8034
8245
  return "\u3044\u3068\u3053";
@@ -8188,10 +8399,10 @@ var KinshipTranslatorJa = class extends KinshipTranslatorBasic {
8188
8399
  return `\u7D99${relation}`;
8189
8400
  }
8190
8401
  if (this.pathN.relation === "adopted") {
8191
- return `\u990A\u5B50\u306E${relation}`;
8402
+ return adoptedRelation(relation);
8192
8403
  }
8193
8404
  if (this.pathN.relation === "foster") {
8194
- return `\u91CC\u89AA\u306E${relation}`;
8405
+ return fosterRelation(relation);
8195
8406
  }
8196
8407
  return relation;
8197
8408
  }
@@ -9199,7 +9410,8 @@ var extractGedzip = async (data) => {
9199
9410
  if (!preferred) {
9200
9411
  throw new Error("No .ged file found in the archive.");
9201
9412
  }
9202
- const gedcomText = await preferred.async("string");
9413
+ const gedcomBytes = await preferred.async("uint8array");
9414
+ const gedcomText = new TextDecoder("utf-8").decode(gedcomBytes);
9203
9415
  const mediaEntries = [];
9204
9416
  for (const entry of entries) {
9205
9417
  const path = normalizeZipPath(entry.name);
@@ -9773,7 +9985,7 @@ var collectExtensionTagsFrom = (node, into = /* @__PURE__ */ new Set()) => {
9773
9985
  // package.json
9774
9986
  var package_default = {
9775
9987
  name: "@treeviz/gedcom-parser",
9776
- version: "2.1.17"};
9988
+ version: "2.1.22"};
9777
9989
 
9778
9990
  // src/utils/get-product-details.ts
9779
9991
  var isDevelopment = () => {
@@ -9782,25 +9994,6 @@ var isDevelopment = () => {
9782
9994
  var getVersion = () => package_default.version;
9783
9995
  var getName = () => package_default.name;
9784
9996
 
9785
- // src/utils/multimedia.ts
9786
- var inferMediaForm = (file, fallback = "bin") => {
9787
- const withoutQuery = file.split("?")[0] || file;
9788
- const ext = getFileExtension(withoutQuery);
9789
- if (ext) {
9790
- return ext.toLowerCase() === "jpeg" ? "jpg" : ext.toLowerCase();
9791
- }
9792
- return fallback;
9793
- };
9794
- var mergeMediaLists = (...lists) => {
9795
- const merged = {};
9796
- for (const list of lists) {
9797
- if (!list) continue;
9798
- Object.assign(merged, list);
9799
- }
9800
- return merged;
9801
- };
9802
- var isObjePointer = (value) => typeof value === "string" && /^@O\d+@$/.test(value);
9803
-
9804
9997
  // src/classes/note.ts
9805
9998
  var CommonNote = class extends Common {
9806
9999
  constructor(gedcom, id, main, parent) {
@@ -9951,6 +10144,10 @@ var Obje = class extends Common {
9951
10144
  if (lkidNode && !newObject.get("_LKID")) {
9952
10145
  newObject.set("_LKID", lkidNode);
9953
10146
  }
10147
+ const origNode = this.get("_ORIG");
10148
+ if (origNode && !newObject.get("_ORIG")) {
10149
+ newObject.set("_ORIG", origNode);
10150
+ }
9954
10151
  if (override) {
9955
10152
  this.remove("FILE");
9956
10153
  this.remove("FORM");
@@ -10938,6 +11135,7 @@ var GedcomTree = {
10938
11135
  return this.parseHierarchy(content, options);
10939
11136
  },
10940
11137
  parseHierarchy: function(content, options) {
11138
+ content = content.replace(/^\uFEFF+/, "");
10941
11139
  const { settings, filename = "" } = options ?? {};
10942
11140
  const { linkedPersons = "skip", linkingKey } = settings ?? {};
10943
11141
  const gedcom = createGedCom();
@@ -11451,4 +11649,4 @@ var hydrateFromContentAsync = async (content, options) => {
11451
11649
  return hydrateFromContent(content, options);
11452
11650
  };
11453
11651
 
11454
- export { ACCEPTED_DATE_FORMATS, ACCEPTED_DATE_FORMATS_REGEX, ANCESTRY_MEDIA_RETRIEVAL_PREFIX, DEFAULT_GEDCOM_EXPORT_VERSION, GEDCOM7_CALENDARS, GEDCOM7_PEDI_VALUES, GEDCOM7_RESN_VALUES, GEDCOM7_ROLE_VALUES, GEDCOM7_SEX_VALUES, GEDCOM_EXPORT_VERSIONS, GEDCOM_TRAILER_TAG, GEDZIP_EXTENSION, GEDZIP_GEDCOM_ENTRY, GEDZIP_MIME, parser_default as GedcomTree, PEDIGREE_VALUES, PlaceType, STRUCTURAL_FORMAT, STRUCTURAL_VERSION, TREEVIZ_EXTENSION_BASE_URI, TREEVIZ_EXTENSION_URIS, addFamilyFact, addIndividualFact, addNonEvent, ancestryMediaFileUrl, appendGedcomTrailer, applyGedcom7DatePhrases, applyGedcom7Enumerations, applyGedcom7RecordMetadata, attachChildToFamily, attachSpouseToFamily, buildGedzip, buildGedzipBlob, bytesToDataUrl, cacheDiscoveredPath, canAttachAsSpouse, collectExtensionTagsFrom, commonDateFormatter, consolidateChildIntoFamily, coupleKeyForFam, create, createEmptyGedcom, createGedcomUid, dateFormatter, deleteIndividual, downloadGedzipMedia, ensureExtensionSchema, extractGedzip, extractGedzipGedcom, extractSeparationYears, extractSplitPoints, familyHasChild, familyHasParent, findDegenerateFamiliesForIndi, findDuplicateCoupleFamiliesForIndi, findMatchingRangeForSplitRange, findReusableParentChildFamily, firstPointerId, formatGedcom7Timestamp, fromObject, fromObjectAsync, fromTuple, generateSplitRanges, getAllProp, getExtensionSchema, getFamilyWith, getFileExtension, getName, getPlaceParts, getPlaces, getRawSize, getVersion, hungarianOrdinalize, hydrateFromContent, hydrateFromContentAsync, implemented, inRange, inferMediaForm, initializeCache, isDegenerateFamily, isDevelopment, isGedcom7, isGedcomTrailerLine, isGedcomTrailerTag, isGedzipContainer, isImageFormat, isIntersectedRange, isObjePointer, isRangeContained, isRemoteOrEmbeddedMediaUrl, isStructuralEnvelope, makePointer, marriageDateFormatter, mergeDuplicateCoupleFamilies, mergeMediaLists, nameFormatter, nextRecordId, normalizeGedcomVersion, notImplemented, noteDateFormatter, objeNoteValue, objeXrefKey, ordinalize, parseGedcom7CalendarPrefix, parseRangeBounds, parseStructuralEnvelope, pathCache, placeTranslator, pointerIds, profilePictureCache, pruneEmptyFamilies, pruneFamiliesByIds, registerExtensionTag, relativesCache, remountGedzipMediaAsDataUrls, removePointerByValue, resetRelativesCache, resolveLocalMediaUrl, resolveMediaContent, resolveObjeForm, resolveObjeMediaId, rewriteGedcomFilePaths, serializeStructural, setCauseOfDeath, setChildPedigree, setDeceased, setFamilyMarriage, setLocalMediaResolver, setMediaContentResolver, setNestedGroup, splitOverlappingRanges, splitRange, spouseTagFor, toGedcomPedigree, unlinkRelative, updateFactRecord, withGedcom7Calendar };
11652
+ export { ACCEPTED_DATE_FORMATS, ACCEPTED_DATE_FORMATS_REGEX, ANCESTRY_MEDIA_RETRIEVAL_PREFIX, ANCESTRY_TREE_MEDIA_NAMESPACE, DEFAULT_GEDCOM_EXPORT_VERSION, GEDCOM7_CALENDARS, GEDCOM7_PEDI_VALUES, GEDCOM7_RESN_VALUES, GEDCOM7_ROLE_VALUES, GEDCOM7_SEX_VALUES, GEDCOM_EXPORT_VERSIONS, GEDCOM_TRAILER_TAG, GEDZIP_EXTENSION, GEDZIP_GEDCOM_ENTRY, GEDZIP_MIME, parser_default as GedcomTree, PEDIGREE_VALUES, PlaceType, STRUCTURAL_FORMAT, STRUCTURAL_VERSION, TREEVIZ_EXTENSION_BASE_URI, TREEVIZ_EXTENSION_URIS, addFamilyFact, addIndividualFact, addNonEvent, ancestryMediaFileUrl, appendGedcomTrailer, applyGedcom7DatePhrases, applyGedcom7Enumerations, applyGedcom7RecordMetadata, attachChildToFamily, attachSpouseToFamily, buildGedzip, buildGedzipBlob, bytesToDataUrl, cacheDiscoveredPath, canAttachAsSpouse, collectExtensionTagsFrom, commonDateFormatter, consolidateChildIntoFamily, coupleKeyForFam, create, createEmptyGedcom, createGedcomUid, dateFormatter, deleteIndividual, downloadGedzipMedia, ensureExtensionSchema, extractGedzip, extractGedzipGedcom, extractSeparationYears, extractSplitPoints, familyHasChild, familyHasParent, findDegenerateFamiliesForIndi, findDuplicateCoupleFamiliesForIndi, findMatchingRangeForSplitRange, findReusableParentChildFamily, firstPointerId, formatGedcom7Timestamp, fromObject, fromObjectAsync, fromTuple, generateSplitRanges, getAllProp, getExtensionSchema, getFamilyWith, getFileExtension, getName, getPlaceParts, getPlaces, getRawSize, getVersion, hungarianOrdinalize, hydrateFromContent, hydrateFromContentAsync, implemented, inRange, inferMediaForm, initializeCache, isAncestryOriginObje, isDegenerateFamily, isDevelopment, isGedcom7, isGedcomTrailerLine, isGedcomTrailerTag, isGedzipContainer, isImageFormat, isIntersectedRange, isObjePointer, isRangeContained, isRemoteOrEmbeddedMediaUrl, isStructuralEnvelope, makePointer, marriageDateFormatter, mergeDuplicateCoupleFamilies, mergeMediaLists, mergeMediaListsByObjeKey, nameFormatter, nextRecordId, normalizeGedcomVersion, notImplemented, noteDateFormatter, objeNoteValue, objeXrefKey, ordinalize, parseAncestryNamespaceFromUrl, parseGedcom7CalendarPrefix, parseRangeBounds, parseStructuralEnvelope, pathCache, placeTranslator, pointerIds, profilePictureCache, pruneEmptyFamilies, pruneFamiliesByIds, registerExtensionTag, relativesCache, remountGedzipMediaAsDataUrls, removePointerByValue, resetRelativesCache, resolveLocalMediaUrl, resolveMediaContent, resolveObjeForm, resolveObjeMediaId, rewriteGedcomFilePaths, serializeStructural, setCauseOfDeath, setChildPedigree, setDeceased, setFamilyMarriage, setLocalMediaResolver, setMediaContentResolver, setNestedGroup, splitOverlappingRanges, splitRange, spouseTagFor, toGedcomPedigree, unlinkRelative, updateFactRecord, withGedcom7Calendar };
@@ -24,6 +24,16 @@ type ObjeGetter = {
24
24
  * have `_OID` without `_MSER._LKID`; both are the UUID used in media URLs.
25
25
  */
26
26
  export declare const resolveObjeMediaId: (obje?: ObjeGetter) => string | undefined;
27
+ /**
28
+ * Ancestry member-tree photos (user uploads) always live in media
29
+ * namespace 1093. Ancestry GEDCOM exports do not store this id — only
30
+ * `_OID` / `_MSER._LKID` UUIDs and `_ORIG acom`. Other namespaces
31
+ * (e.g. 7163) are historical record databases, not tree media.
32
+ */
33
+ export declare const ANCESTRY_TREE_MEDIA_NAMESPACE = 1093;
34
+ export declare const parseAncestryNamespaceFromUrl: (url?: string) => number | undefined;
35
+ /** Tree-media object from Ancestry: `_ORIG acom`, empty FILE + UUID, or a retrieval URL. */
36
+ export declare const isAncestryOriginObje: (obje?: ObjeGetter) => boolean;
27
37
  /** Ancestry tree media host used by their viewer. */
28
38
  export declare const ANCESTRY_MEDIA_RETRIEVAL_PREFIX = "https://www.ancestry.com/api/media/retrieval/v2/image";
29
39
  export declare const ancestryMediaFileUrl: (namespace?: string | number, imgId?: string) => string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"media-utils.d.ts","sourceRoot":"","sources":["../../src/utils/media-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,KAAG,MAenD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,OAyB9C,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,eAAe,GAAI,OAAO;IACtC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAClE,KAAG,MAAM,GAAG,SAKZ,CAAC;AAEF,KAAK,UAAU,GAAG;IACjB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAClE,CAAC;AAOF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,KAAG,MAAM,GAAG,SAKpC,CAAC;AAE7B,qDAAqD;AACrD,eAAO,MAAM,+BAA+B,0DACY,CAAC;AAMzD,eAAO,MAAM,oBAAoB,GAChC,YAAY,MAAM,GAAG,MAAM,EAC3B,QAAQ,MAAM,KACZ,MAAM,GAAG,SAKX,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,WAAW,GACvB,OAAO;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,EAC/C,WAAU,MAAM,GAAG,MAAU,KAC3B,MAYF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,UAAU,KAAG,MACkB,CAAC"}
1
+ {"version":3,"file":"media-utils.d.ts","sourceRoot":"","sources":["../../src/utils/media-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,KAAG,MAenD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,OAyB9C,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,eAAe,GAAI,OAAO;IACtC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAClE,KAAG,MAAM,GAAG,SAKZ,CAAC;AAEF,KAAK,UAAU,GAAG;IACjB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAClE,CAAC;AAOF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,KAAG,MAAM,GAAG,SAKpC,CAAC;AAE7B;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAIlD,eAAO,MAAM,6BAA6B,GACzC,MAAM,MAAM,KACV,MAAM,GAAG,SAOX,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,GAAI,OAAO,UAAU,KAAG,OAaxD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,+BAA+B,0DACY,CAAC;AAMzD,eAAO,MAAM,oBAAoB,GAChC,YAAY,MAAM,GAAG,MAAM,EAC3B,QAAQ,MAAM,KACZ,MAAM,GAAG,SAKX,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,WAAW,GACvB,OAAO;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,EAC/C,WAAU,MAAM,GAAG,MAAU,KAC3B,MAYF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,UAAU,KAAG,MACkB,CAAC"}
@@ -34,5 +34,10 @@ export declare const inferMediaForm: (file: string, fallback?: string) => string
34
34
  * Merge MediaList maps (later entries overwrite same keys).
35
35
  */
36
36
  export declare const mergeMediaLists: (...lists: Array<MediaList | undefined>) => MediaList;
37
+ /**
38
+ * Merge media from vendor resolvers and local/GEDZIP FILE payloads.
39
+ * First list wins when the same OBJE xref appears twice.
40
+ */
41
+ export declare const mergeMediaListsByObjeKey: (...lists: Array<MediaList | undefined>) => MediaList;
37
42
  export declare const isObjePointer: (value: unknown) => value is ObjeKey;
38
43
  //# sourceMappingURL=multimedia.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multimedia.d.ts","sourceRoot":"","sources":["../../src/utils/multimedia.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,MAAM,qBAAqB,GAAG;IACnC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,iBAAgB,WAO5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,OAAO,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,cAOrE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OACJ,CAAC"}
1
+ {"version":3,"file":"multimedia.d.ts","sourceRoot":"","sources":["../../src/utils/multimedia.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,MAAM,qBAAqB,GAAG;IACnC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,iBAAgB,WAO5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,OAAO,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,cAOrE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACpC,GAAG,OAAO,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,cAoBtC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,mBAAmB,CAAC;AAgB7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAuB,QAAQ,EAAW,MAAM,gBAAgB,CAAC;AA4D7E,QAAA,MAAM,UAAU;qBAEL,MAAM,YACL;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;8BAK3C,MAAM,YACL;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;oBA6ThD,MAAM,QACJ,QAAQ,UACN,MAAM,QACR,MAAM;CAuBb,CAAC;AAOF,eAAe,UAAU,CAAC;AAE1B,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,4BAchE,CAAC"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,mBAAmB,CAAC;AAgB7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAuB,QAAQ,EAAW,MAAM,gBAAgB,CAAC;AA4D7E,QAAA,MAAM,UAAU;qBAEL,MAAM,YACL;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;8BAK3C,MAAM,YACL;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;oBAgUhD,MAAM,QACJ,QAAQ,UACN,MAAM,QACR,MAAM;CAuBb,CAAC;AAOF,eAAe,UAAU,CAAC;AAE1B,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,4BAchE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeviz/gedcom-parser",
3
- "version": "2.1.17",
3
+ "version": "2.1.22",
4
4
  "description": "Lightweight, pluggable GEDCOM parser for JavaScript/TypeScript with optional caching and place matching. Zero browser dependencies.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",