{"_id":"gedcom-ts","_rev":"42-acd0ef08632fc8c2bc0a14c158e8a46c","name":"gedcom-ts","dist-tags":{"latest":"2026.9.0"},"versions":{"1.1.0":{"name":"gedcom-ts","version":"1.1.0","keywords":["genealogy","gedcom",".ged","tree","typescript","front-end","web"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"proprietary","_id":"gedcom-ts@1.1.0","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"8110a4f5f833f8c7fb52e8f15a8a1eea7b28140a","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-1.1.0.tgz","fileCount":28,"integrity":"sha512-N+qqImtiWEOa5KWkpIwMexeMhsOvPDmPaJgw6h0FiQuwFqkKpeaezU1cqJRbDDtGzuuj6oSI6WBzq7jLdzl6FQ==","signatures":[{"sig":"MEQCICc8zg69Gf2Zwc5JwMqef8NRE+c0xLWLUVUwjD+7n2hCAiBReRbm4h6nmYiQjJZFcx4rwmh0wuDZ7xWEP8YSkciYdg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38439},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2b2a31eb4d5afaf7b9145916308effc351fd913f","scripts":{"pack":"tsc && npm pack","test":"jest"},"_npmUser":{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"},"_npmVersion":"8.19.3","description":"A TypeScript library to create genealogy tree data model and to import/export data in a GEDCOM file (.ged).","directories":{},"_nodeVersion":"16.19.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^25.1.0","ts-jest":"^25.2.1","typescript":"^3.8.3","@types/jest":"^25.1.3","@types/node":"^13.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_1.1.0_1686936064456_0.004075931225899998","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"gedcom-ts","version":"1.1.1","keywords":["genealogy","gedcom",".ged","tree","typescript","front-end","web"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"proprietary","_id":"gedcom-ts@1.1.1","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"44a24fd4d448ecb88ca1750dbe3d52a43e3ba67c","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-1.1.1.tgz","fileCount":24,"integrity":"sha512-jd1HUhVM22yjcJCMotc47dir8Jk1qlNibD41hGBcm+/kFG02cEtudYPkq+p4aHfWblWq5ecm5D91Rjglghq5hw==","signatures":[{"sig":"MEUCIQC5iRjkzQzuW26W/3o/GgltXCQikKUgBliLAuTh2QtNRgIgY1nyKVGvWK6GbS5Qk1NjIPpa4lFPOp5nj0vARJhHmhc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34909},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9a319758f1f48672918e258404dc65802a0c4182","scripts":{"pack":"tsc && npm pack","test":"jest"},"_npmUser":{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"},"_npmVersion":"8.19.3","description":"A TypeScript library to create genealogy tree data model and to import/export data in a GEDCOM file (.ged).","directories":{},"_nodeVersion":"16.19.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.1.3","@types/jest":"^29.5.2","@types/node":"^20.3.1"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_1.1.1_1687090833986_0.08759811850189747","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"gedcom-ts","version":"2.0.0","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2.0.0","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"5f6d0ab5acb5f24f862cf7744de5286eb758731c","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2.0.0.tgz","fileCount":26,"integrity":"sha512-0gmAamMpqZPpVciHyQAW3sX2k58BhqLRe2qe1MxQOpUEdx8okZAIGCa1mL0UroiNlDtW64dSzSMGafoHr5fBUw==","signatures":[{"sig":"MEUCIAVm3mmMzwmGdPvOUIXG4L0rfJHfg6rkGLHz/dlw1UNaAiEAk7opinouy9mRtuZYMoMUCgdkQvBh5uLzKVrGChp8hKE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137943},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2.0.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2.0.0.tgz","_integrity":"sha512-0gmAamMpqZPpVciHyQAW3sX2k58BhqLRe2qe1MxQOpUEdx8okZAIGCa1mL0UroiNlDtW64dSzSMGafoHr5fBUw==","_npmVersion":"11.12.1","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"jszip":"^3.10.1","file-saver":"^2.0.5"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2.0.0_1777998739080_0.014357579771962614","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"gedcom-ts","version":"2.0.1","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2.0.1","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"fc769c22750d61ecbcd02c1e156d265cffe061c7","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2.0.1.tgz","fileCount":26,"integrity":"sha512-fqISWYxeG2VlrVp8dbbVf/mmK/AY4piFejzS+pS0m192hxE52FR3Sl0HZtHO6F7+O4E+FdH2J2gScTDN2fM0qQ==","signatures":[{"sig":"MEUCIDSZIpio9JAphwD/D204TOR+kfU4R66KYFKU9sYAp9BMAiEAk2CHTtaMF597YVAwffcpGPEfZ8ByDgQlsAAsgW16pEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138070},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2.0.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2.0.1.tgz","_integrity":"sha512-fqISWYxeG2VlrVp8dbbVf/mmK/AY4piFejzS+pS0m192hxE52FR3Sl0HZtHO6F7+O4E+FdH2J2gScTDN2fM0qQ==","_npmVersion":"11.12.1","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"jszip":"^3.10.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2.0.1_1778070021307_0.8529722559480133","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"gedcom-ts","version":"2.0.2","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2.0.2","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"9f59a90fdcf37fb9d3af3bf520c7a5aedf9a0475","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2.0.2.tgz","fileCount":32,"integrity":"sha512-oECHip23xxZTohAfOas+ZStJhHB99Umc6zMofiA+5O4Wth74g7Z8KygMcPZc6bxUpLxRQvuvIpXLGZRTp/cZBQ==","signatures":[{"sig":"MEUCIQDmyJkj52k+yaT3KasnGgTCQLGW3wiIKJMD5ZoVGgfn1gIgetKeri/CzpLv/QoeJikfwbSp3lt2FbijKsV0vFiWFpI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158930},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2.0.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2.0.2.tgz","_integrity":"sha512-oECHip23xxZTohAfOas+ZStJhHB99Umc6zMofiA+5O4Wth74g7Z8KygMcPZc6bxUpLxRQvuvIpXLGZRTp/cZBQ==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.1.0","dependencies":{"fflate":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2.0.2_1778490290764_0.4561602954716675","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"gedcom-ts","version":"2.1.0","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2.1.0","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"7f7b00cb5eb08a846d018b3343aa1aeeab33e465","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2.1.0.tgz","fileCount":49,"integrity":"sha512-kjVaNzFyEplTAFAoP3jd2HPh6Ns6YCCGuynBjq4ZeFVToyEkzIrQb4yiVlmpGv4mrzZIXKr3p6qZfxXBNGhfRQ==","signatures":[{"sig":"MEYCIQDHe2/8O9W+srglE8Gnn+hFRnkuJSf9o2thVfnKDZQhSQIhAOkBNctBxKhryCVh1t6O59DxjO1SrggLLITjYCFdZIbt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":306309},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2.1.0.tgz","_integrity":"sha512-kjVaNzFyEplTAFAoP3jd2HPh6Ns6YCCGuynBjq4ZeFVToyEkzIrQb4yiVlmpGv4mrzZIXKr3p6qZfxXBNGhfRQ==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.1.0","dependencies":{"fflate":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2.1.0_1778713498736_0.9211224182501194","host":"s3://npm-registry-packages-npm-production"}},"2026.5.0":{"name":"gedcom-ts","version":"2026.5.0","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.5.0","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"9806fbb265a7a57a097c431fb78b3cc3e30229f6","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.5.0.tgz","fileCount":69,"integrity":"sha512-rUpqa+swe0oTyN7xU+BJtRPhY0ZvnX0qRuUzSRx/giNrEtIuvju55BNeemwDGybcfjuDYZDqCmOoZNU3qCRWVQ==","signatures":[{"sig":"MEQCIBoe1p+Zu386pYwZcetzNtqwJ2f0l/AuMC1Iz6SGJDpAAiAPsXK1losbHU+oP2mOSynha6/JOAPSD841WMtDj9kDrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450642},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.5.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.5.0.tgz","_integrity":"sha512-rUpqa+swe0oTyN7xU+BJtRPhY0ZvnX0qRuUzSRx/giNrEtIuvju55BNeemwDGybcfjuDYZDqCmOoZNU3qCRWVQ==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.1.0","dependencies":{"fflate":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.5.0_1778839093319_0.6919810611557653","host":"s3://npm-registry-packages-npm-production"}},"2026.5.1":{"name":"gedcom-ts","version":"2026.5.1","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.5.1","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"5d9ce8032e81e48bc65fba5af05a0eba96267610","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.5.1.tgz","fileCount":73,"integrity":"sha512-Wi1a9fC0NgAhN+cXW+nKR2GH11z5wPUSjFyNVfKOFYhIqdhRonSDMTIbBDUqfRczJPNjYLppLQD5blnRcBeLkA==","signatures":[{"sig":"MEUCIFRY3rX82OMlx6zcSVZCKmzftJXl7hxj5q2Y423tpkqlAiEAy/E7T8orN5nrrQB3SBRWsFALEJnID9M6YMr+Ut0xwkA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":495232},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.5.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.5.1.tgz","_integrity":"sha512-Wi1a9fC0NgAhN+cXW+nKR2GH11z5wPUSjFyNVfKOFYhIqdhRonSDMTIbBDUqfRczJPNjYLppLQD5blnRcBeLkA==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.1.0","dependencies":{"fflate":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.5.1_1778871792108_0.1387526543554014","host":"s3://npm-registry-packages-npm-production"}},"2026.5.2":{"name":"gedcom-ts","version":"2026.5.2","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.5.2","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"00c0b0f85ad87e4c730d051c297b1dbf1851e8a9","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.5.2.tgz","fileCount":73,"integrity":"sha512-4d612qKrfTRbhO+FDUdGxDsyPB8WdB16wpwvhUbnoSGIZoO+ZDeAefPTCVhK2SctFxUQNRKJNt4LX3oTMAvR9g==","signatures":[{"sig":"MEUCIQDgNyqpzJ3W8GrGLDWP5dWW2X5cnAxqNaaWjSWAoovK2QIgFqUhT5PPEOR+RsKjL/di5uOVY/WvZja783SNtJYug6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":510269},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.5.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.5.2.tgz","_integrity":"sha512-4d612qKrfTRbhO+FDUdGxDsyPB8WdB16wpwvhUbnoSGIZoO+ZDeAefPTCVhK2SctFxUQNRKJNt4LX3oTMAvR9g==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.1.0","dependencies":{"fflate":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.5.2_1778939578473_0.8890381629976538","host":"s3://npm-registry-packages-npm-production"}},"2026.5.3":{"name":"gedcom-ts","version":"2026.5.3","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.5.3","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"2795edca67fc7fb0b6085e75cfe782569b8bf82a","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.5.3.tgz","fileCount":88,"integrity":"sha512-UHXO3SMTiqXvr5ZPLSoprDcbUSReRu5AvW+d+cEsKc8WjG9wb/ghRqXHMUlvP1TXYrYMIVamH1hI/4B2B6JZ/g==","signatures":[{"sig":"MEQCIHmcBBEB857Syx32ao6NREOo+l2BTdlPrkBg81TEMQudAiBu4cyTlNOqus0QwAA/n1dTpDSSwcsUItyNbNnwGlHvNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2445023},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.5.3.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.5.3.tgz","_integrity":"sha512-UHXO3SMTiqXvr5ZPLSoprDcbUSReRu5AvW+d+cEsKc8WjG9wb/ghRqXHMUlvP1TXYrYMIVamH1hI/4B2B6JZ/g==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.2.0","dependencies":{"fflate":"^0.8.2","pdf-lib":"^1.17.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.5.3_1779369994823_0.3145332405658341","host":"s3://npm-registry-packages-npm-production"}},"2026.5.4":{"name":"gedcom-ts","version":"2026.5.4","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.5.4","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"5c2ab6b5b2bbd471425f993d8b916b8a9e346325","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.5.4.tgz","fileCount":172,"integrity":"sha512-d4HnTfrAqDuqk87LCI+FK4ptc2Mh3UN55FxqoehddD74XjNq+86xUpRFzEdfNn1IbcFBkuAE+Ssb25RX2s9ylw==","signatures":[{"sig":"MEQCIBZKw0BFKblU2EcA5lde9HuNJbtejQ0W48eH6KxTt8WnAiA1Qfi8+CcpAaWZ42l2WGyOfHYq54ONWQESSIAqvd3BIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4522375},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.5.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.5.4.tgz","_integrity":"sha512-d4HnTfrAqDuqk87LCI+FK4ptc2Mh3UN55FxqoehddD74XjNq+86xUpRFzEdfNn1IbcFBkuAE+Ssb25RX2s9ylw==","_npmVersion":"11.13.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.2.0","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.5.4_1779634239006_0.6379578736893874","host":"s3://npm-registry-packages-npm-production"}},"2026.6.0":{"name":"gedcom-ts","version":"2026.6.0","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.6.0","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"cffe56d78d5cf4aa2d146e83cf42f02bc460924b","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.6.0.tgz","fileCount":177,"integrity":"sha512-lL+P7j9hspGog96BYumg4gRmUMEPRbdqG4evc9G9EyVj26nIDbOrQB3qBE2r3yoP4moSdvD/HXk3tDq7qmyx+w==","signatures":[{"sig":"MEUCIQDQkInmfLWe8s985/LYZP1D3Lf68mYIKx5ZVWXmXgqClAIgb31lhtuVnwAiJFw6A8r22ptiXDaasZHpHgJvtuUqzVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4572159},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.6.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.6.0.tgz","_integrity":"sha512-lL+P7j9hspGog96BYumg4gRmUMEPRbdqG4evc9G9EyVj26nIDbOrQB3qBE2r3yoP4moSdvD/HXk3tDq7qmyx+w==","_npmVersion":"11.16.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.6.0_1780682198054_0.0005399857345307346","host":"s3://npm-registry-packages-npm-production"}},"2026.6.1":{"name":"gedcom-ts","version":"2026.6.1","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.6.1","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"e2e1ca2199ff23a2e15c5211f0261fff0bbafe90","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.6.1.tgz","fileCount":177,"integrity":"sha512-5ekEOxBAzhuK/Hd1LNpuBYpDz1gX0lB7A2HQCUTk9FSw8nnwHXzq51Wy4YJwjAO6Am1t7/s+eM/pmjmmv4HZ2Q==","signatures":[{"sig":"MEUCIQCP93dheFRE1kXtP0BdStLOykcIj/jwF1sLOAXxKxzn6wIgRqb7v30E8PW4QMD4Cspeh39d+rXOfLow4aYvTmnseSQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4574526},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.6.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.6.1.tgz","_integrity":"sha512-5ekEOxBAzhuK/Hd1LNpuBYpDz1gX0lB7A2HQCUTk9FSw8nnwHXzq51Wy4YJwjAO6Am1t7/s+eM/pmjmmv4HZ2Q==","_npmVersion":"11.16.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.6.1_1781020453748_0.9160472346987256","host":"s3://npm-registry-packages-npm-production"}},"2026.6.2":{"name":"gedcom-ts","version":"2026.6.2","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.6.2","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"aa7d5da2a0799095e120f6a3847b993e330711d7","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.6.2.tgz","fileCount":183,"integrity":"sha512-HBjIbtCc5i+a2NLa1cixdcdMmwlspgGrAkJNb7UlJABMwxz3hdrAdqO25mpi/bRPDkE1YaXALxCVM2doOtl4ww==","signatures":[{"sig":"MEUCIBX+1o8QXV7+92gYPpnM2P/KcY6o+eC6YcNuc6L7b88qAiEAqB0ErYoU2r2O8REP/BYdIxSHVkW7AJtEWGXY2NnPelg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4606398},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.6.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.6.2.tgz","_integrity":"sha512-HBjIbtCc5i+a2NLa1cixdcdMmwlspgGrAkJNb7UlJABMwxz3hdrAdqO25mpi/bRPDkE1YaXALxCVM2doOtl4ww==","_npmVersion":"11.16.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@zip.js/zip.js":"2.7.62","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.6.2_1781278283941_0.15345242324110875","host":"s3://npm-registry-packages-npm-production"}},"2026.6.3":{"name":"gedcom-ts","version":"2026.6.3","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.6.3","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"3aa34c801ef3eeaa3d8eefd440f45afd85b073dd","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.6.3.tgz","fileCount":183,"integrity":"sha512-GHciFtTfJL3JpHYtOVTf3DS/QC3WuHJA+lpgr5ro8WIVmQ5KopNN2v7IxVz1yTkiU8U1ccecNlNveadfTYG0BQ==","signatures":[{"sig":"MEQCIB8niwbDwixbK79D3uNSQP7uU85p+l2e1gDNMZF72Y6fAiAzjGZUg8EZgE44JHFmLHjWxc4fiaCVlAFl+HA/N/L/bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4607597},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.6.3.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.6.3.tgz","_integrity":"sha512-GHciFtTfJL3JpHYtOVTf3DS/QC3WuHJA+lpgr5ro8WIVmQ5KopNN2v7IxVz1yTkiU8U1ccecNlNveadfTYG0BQ==","_npmVersion":"11.16.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.6.3_1781348745825_0.9083475588832943","host":"s3://npm-registry-packages-npm-production"}},"2026.6.4":{"name":"gedcom-ts","version":"2026.6.4","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","_id":"gedcom-ts@2026.6.4","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"dist":{"shasum":"f455e0fba25456118a5cdae9f52c27f77bd5f817","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.6.4.tgz","fileCount":183,"integrity":"sha512-V8uKRIxbHh77tnTOHqT/6V3//3U9lkEeURdfvfD85P5BJs7ImfWmP+77QH5HfNtwAPF4k8pmHkRZohnSgVjKAA==","signatures":[{"sig":"MEUCIQCkCzigsjCBOdhZM5gIN7SGBzhvHehOMbKicM8xhHuRsAIgL8I8DI4S0+8pSYl/p2RvA1QABq5yz8iT2mUA8fXqwWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4613806},"main":"dist/index.cjs","type":"module","_from":"file:gedcom-ts-2026.6.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.6.4.tgz","_integrity":"sha512-V8uKRIxbHh77tnTOHqT/6V3//3U9lkEeURdfvfD85P5BJs7ImfWmP+77QH5HfNtwAPF4k8pmHkRZohnSgVjKAA==","_npmVersion":"11.16.0","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"_nodeVersion":"26.3.1","dependencies":{"fflate":"^0.8.2","bidi-js":"^1.0.3","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.3.0","vitest":"^4.1.5","esbuild":"^0.28.0","globals":"^17.6.0","@eslint/js":"^10.0.1","typescript":"^5.1.3","@types/node":"^20.3.1","subset-font":"^2.5.0","typescript-eslint":"^8.59.1","javascript-obfuscator":"^5.4.2"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/gedcom-ts_2026.6.4_1781960565902_0.9155703557231913","host":"s3://npm-registry-packages-npm-production"}},"2026.9.0":{"_id":"gedcom-ts@2026.9.0","dist":{"shasum":"e69921c4363cb3ebdb5df711f24c80b95eba63b3","tarball":"https://registry.npmjs.org/gedcom-ts/-/gedcom-ts-2026.9.0.tgz","fileCount":183,"integrity":"sha512-rbfKe7J5UOxC5yV8wFC/x2UD/KY+CRJWnURvSVPjZmFcEWyIM8sDSErEjNmBN6ixLEez/QdbEkN+Moj/2HLJig==","signatures":[{"sig":"MEUCIB7cYexn5fxdIjX9/OHVc+pL2lfDpc0PLxP7PC2f8G2zAiEAmg49EYRaP/7xrgZa+XieMg1cYkPriJJuaQ2M2a3ZZUM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD+C4BIulBm4CvI/RkcWN2Z5SW1SBkrdmTyC+f2lXBB9wIhANF87bRQYBAoM57pyUDr6jTA1/WjQ6VqT7a63d5OqhsY"}],"unpackedSize":4617786},"main":"dist/index.cjs","name":"gedcom-ts","type":"module","_from":"file:gedcom-ts-2026.9.0.tgz","types":"dist/index.d.ts","author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./booklet":{"types":"./dist/booklet/index.d.ts","import":"./dist/booklet.mjs","require":"./dist/booklet.cjs"},"./booklet/locale-chunks/booklet-locale-ar":{"types":"./dist/booklet/locale-chunks/booklet-locale-ar.d.ts","import":"./dist/locale-chunks/booklet-locale-ar.mjs","require":"./dist/locale-chunks/booklet-locale-ar.cjs"},"./booklet/locale-chunks/booklet-locale-de":{"types":"./dist/booklet/locale-chunks/booklet-locale-de.d.ts","import":"./dist/locale-chunks/booklet-locale-de.mjs","require":"./dist/locale-chunks/booklet-locale-de.cjs"},"./booklet/locale-chunks/booklet-locale-en":{"types":"./dist/booklet/locale-chunks/booklet-locale-en.d.ts","import":"./dist/locale-chunks/booklet-locale-en.mjs","require":"./dist/locale-chunks/booklet-locale-en.cjs"},"./booklet/locale-chunks/booklet-locale-es":{"types":"./dist/booklet/locale-chunks/booklet-locale-es.d.ts","import":"./dist/locale-chunks/booklet-locale-es.mjs","require":"./dist/locale-chunks/booklet-locale-es.cjs"},"./booklet/locale-chunks/booklet-locale-fr":{"types":"./dist/booklet/locale-chunks/booklet-locale-fr.d.ts","import":"./dist/locale-chunks/booklet-locale-fr.mjs","require":"./dist/locale-chunks/booklet-locale-fr.cjs"},"./booklet/locale-chunks/booklet-locale-he":{"types":"./dist/booklet/locale-chunks/booklet-locale-he.d.ts","import":"./dist/locale-chunks/booklet-locale-he.mjs","require":"./dist/locale-chunks/booklet-locale-he.cjs"},"./booklet/locale-chunks/booklet-locale-it":{"types":"./dist/booklet/locale-chunks/booklet-locale-it.d.ts","import":"./dist/locale-chunks/booklet-locale-it.mjs","require":"./dist/locale-chunks/booklet-locale-it.cjs"},"./booklet/locale-chunks/booklet-locale-nl":{"types":"./dist/booklet/locale-chunks/booklet-locale-nl.d.ts","import":"./dist/locale-chunks/booklet-locale-nl.mjs","require":"./dist/locale-chunks/booklet-locale-nl.cjs"},"./booklet/locale-chunks/booklet-locale-pl":{"types":"./dist/booklet/locale-chunks/booklet-locale-pl.d.ts","import":"./dist/locale-chunks/booklet-locale-pl.mjs","require":"./dist/locale-chunks/booklet-locale-pl.cjs"},"./booklet/locale-chunks/booklet-locale-pt":{"types":"./dist/booklet/locale-chunks/booklet-locale-pt.d.ts","import":"./dist/locale-chunks/booklet-locale-pt.mjs","require":"./dist/locale-chunks/booklet-locale-pt.cjs"},"./booklet/locale-chunks/booklet-locale-zh":{"types":"./dist/booklet/locale-chunks/booklet-locale-zh.d.ts","import":"./dist/locale-chunks/booklet-locale-zh.mjs","require":"./dist/locale-chunks/booklet-locale-zh.cjs"},"./booklet/feature-chunks/booklet-logo-draw":{"types":"./dist/booklet/feature-chunks/booklet-logo-draw.d.ts","import":"./dist/feature-chunks/booklet-logo-draw.mjs","require":"./dist/feature-chunks/booklet-logo-draw.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-ar":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-ar.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-ar.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-ar.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-he":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-he.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-he.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-he.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh.cjs"},"./booklet/feature-chunks/booklet-timeline-raster":{"types":"./dist/booklet/feature-chunks/booklet-timeline-raster.d.ts","import":"./dist/feature-chunks/booklet-timeline-raster.mjs","require":"./dist/feature-chunks/booklet-timeline-raster.cjs"},"./booklet/font-chunks/booklet-pdf-font-bytes-zh-ext":{"types":"./dist/booklet/font-chunks/booklet-pdf-font-bytes-zh-ext.d.ts","import":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.mjs","require":"./dist/font-chunks/booklet-pdf-font-bytes-zh-ext.cjs"}},"license":"SEE LICENSE IN LICENSE","scripts":{"tgz":"npm run build && npm pack --pack-destination .","lint":"eslint .","pack":"npm run tgz","test":"vitest run","build":"npm run prepare:fonts && npm run prepare:locales && npm run clean && npm run build:js && npm run build:types","clean":"rm -rf dist","test:ci":"npm run build && vitest run","build:js":"node build.js","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly","sync:exports":"node scripts/sync-booklet-chunk-exports.mjs","prepare:fonts":"node scripts/extract-zh-pdf-hanzi-supplement.mjs && node scripts/prepare-booklet-fonts.mjs","prepublishOnly":"npm run typecheck && npm run test:ci","prepare:locales":"node scripts/prepare-booklet-locales.mjs"},"version":"2026.9.0","_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:90408a3e-fc57-41b3-ab08-6fc221ed0126"}},"keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"_resolved":"/builds/neosis91/gedcom-ts/gedcom-ts-2026.9.0.tgz","_integrity":"sha512-rbfKe7J5UOxC5yV8wFC/x2UD/KY+CRJWnURvSVPjZmFcEWyIM8sDSErEjNmBN6ixLEez/QdbEkN+Moj/2HLJig==","_npmVersion":"11.19.1","description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","directories":{},"maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"_nodeVersion":"26.10.0","dependencies":{"fflate":"^0.8.3","bidi-js":"^1.1.0","naqqash":"^0.2.0","pdf-lib":"^1.17.1","@pdf-lib/fontkit":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.11.0","vitest":"^4.1.5","esbuild":"^0.28.2","globals":"^17.12.0","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^20.19.0","subset-font":"^2.9.0","typescript-eslint":"^8.70.0","javascript-obfuscator":"^5.8.0"},"peerDependencies":{"pdf-lib":"^1.17.1"},"peerDependenciesMeta":{"pdf-lib":{"optional":false}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gedcom-ts_2026.9.0_1790432208263_0.7671247261041005"}}},"time":{"created":"2019-07-08T21:56:05.589Z","modified":"2026-09-26T14:16:48.638Z","1.0.0":"2019-07-08T21:56:05.708Z","1.0.0-beta":"2019-07-08T22:14:07.902Z","1.0.1-beta":"2019-07-08T22:27:25.780Z","1.0.1-alpha":"2019-07-09T20:30:55.892Z","1.0.2-alpha":"2019-07-13T17:17:29.193Z","1.0.3":"2019-08-11T17:59:23.453Z","1.0.4":"2020-03-10T22:39:35.155Z","1.0.5":"2023-06-10T15:50:36.003Z","1.0.6":"2023-06-15T11:49:02.800Z","1.0.7":"2023-06-15T14:36:25.693Z","1.0.8":"2023-06-15T14:53:27.822Z","1.0.9":"2023-06-16T17:18:17.018Z","1.1.0":"2023-06-16T17:21:04.616Z","1.1.1":"2023-06-18T12:20:34.187Z","2.0.0":"2026-05-05T16:32:19.242Z","2.0.1":"2026-05-06T12:20:21.444Z","2.0.2":"2026-05-11T09:04:50.939Z","2.1.0":"2026-05-13T23:04:58.918Z","2026.5.0":"2026-05-15T09:58:13.483Z","2026.5.1":"2026-05-15T19:03:12.272Z","2026.5.2":"2026-05-16T13:52:58.647Z","2026.5.3":"2026-05-21T13:26:34.985Z","2026.5.4":"2026-05-24T14:50:39.247Z","2026.6.0":"2026-06-05T17:56:38.260Z","2026.6.1":"2026-06-09T15:54:13.946Z","2026.6.2":"2026-06-12T15:31:24.178Z","2026.6.3":"2026-06-13T11:05:46.142Z","2026.6.4":"2026-06-20T13:02:46.144Z","2026.9.0":"2026-09-26T14:16:48.477Z"},"author":{"name":"Bertrand Jaunet","email":"bertrand.jaunet@gmail.com"},"license":"SEE LICENSE IN LICENSE","keywords":["genealogy","gedcom","family-tree","ancestry","genealogie","ged","zip","import","export","tree","typescript","browser","frontend"],"description":"TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.","maintainers":[{"name":"bertrandjnt","email":"bertrand.jaunet@gmail.com"}],"readme":"# gedcom-ts\n\n`gedcom-ts` is a browser-oriented TypeScript library to:\n\n- import genealogy data from GEDCOM (`.ged`) or ZIP (`.zip` / `.gdz`)\n- work with a typed JSON model (persons, acts, dates, places, notes, media, name variants, attributes)\n- edit the model in-place through a fluent, chainable API (`editPerson`, `editAct`, …)\n- export data back to GEDCOM (`.ged`) or GEDZIP (`.zip`)\n- attach **audio** and other media via GEDCOM 7 `OBJE` records (`MEDI AUDIO`, multi-`FILE`, `TRAN`)\n- model **oral history interviews** as `EVEN` acts with `OBJE` + transcription notes\n- geocode event places (OpenStreetMap / Nominatim) and group similar city names\n- generate a **genealogy booklet** as PDF (`gedcom-ts/booklet`, 11 locales including RTL Arabic/Hebrew)\n\n## Live demo\n\nA graphical demo showcasing the public API (import a `.ged` / `.zip`, browse the typed model, export back) is available at **[https://gedcomts.com](https://gedcomts.com)**\n\n## Contents\n\n- [Installation](#installation)\n- [Quick start](#quick-start)\n- [Geocoding places](#geocoding-places)\n- [Genealogy booklet (PDF)](#genealogy-booklet-pdf)\n- [Audio and oral history (GEDCOM 7)](#audio-and-oral-history-gedcom-7)\n- [API reference](#api-reference)\n- [Error handling](#error-handling)\n\n## Package\n\n- NPM: [gedcom-ts](https://www.npmjs.com/package/gedcom-ts)\n- Current release **`2026.9.0`** — dépendances à jour (TypeScript 5.9, eslint 10.11, …). Version format **CalVer** `AAAA.M.micro` (e.g. `2026.9.0` = September 2026). See [CHANGELOG.md](CHANGELOG.md).\n- Entry points:\n  - **`gedcom-ts`** — import, model, edit layer, export, geocoding\n  - **`gedcom-ts/booklet`** — PDF livret (`pdf-lib` en peerDependency, chargé depuis `node_modules`)\n\n## Installation\n\n```bash\nnpm install gedcom-ts\n```\n\nBoth entry points come from the same package. For the PDF booklet, **`pdf-lib` is a peer dependency** — install it in your app if you use `gedcom-ts/booklet`:\n\n```bash\nnpm install pdf-lib\n```\n\nFor `zh` / `ar` / `he` PDF output, your bundler should also be able to resolve `@pdf-lib/fontkit` (included in `gedcom-ts` dependencies; the host app typically preloads it — see [Bundle layout](#bundle-layout) below).\n\n## Runtime Requirements\n\n- modern browser runtime (`File`, `Blob`, `XMLHttpRequest`, `URL.createObjectURL`)\n- for pure Node.js usage, DOM polyfills are required (the library targets browsers)\n\n## Quick start\n\n```ts\nimport { importGedFile, ExportGedzipFile } from \"gedcom-ts\";\n\nasync function roundTrip(file: File) {\n  const readGed = await importGedFile(file);\n  const persons = readGed.persons;\n\n  if (persons.length > 0) {\n    persons[0].lastname = persons[0].lastname.toUpperCase();\n  }\n\n  await new ExportGedzipFile(\"updated-tree\", persons).download();\n}\n```\n\nTypical workflow:\n\n1. import a file with `importGedFile` (or start from `createEmptyReadGed()`)\n2. read / mutate the typed `Person`, `Act`, `Place`, `Note`, `MultimediaFile` objects (directly or through `editPerson` / `editAct` / `editPlace` / …)\n3. export as `.ged` (`ExportGedcomFile`) or `.zip` (`ExportGedzipFile`)\n\n## Geocoding places\n\nUse this section when your app needs **GPS coordinates** on event places, a **list of cities still without coordinates**, **map markers**, or a **data-quality** view for inconsistent place names.\n\nYou work with a `ReadGed` (after import) and a flat `Act[]` built from every person’s events (see [Prepare act list](#prepare-act-list)).\n\n### How city names are matched\n\nThe library groups variants of the same place with **`citiesAreSimilar`**, not exact string equality.\n\n| Label A     | Label B                              | Same place?                 |\n| ----------- | ------------------------------------ | --------------------------- |\n| `Pleurtuit` | `Pleurtuit, Ille-et-Vilaine, France` | Yes                         |\n| `Paris`     | `Paris, TX, USA`                     | Depends on similarity rules |\n\nUse the functions in the tables below for grouping, geocoding, and maps. Do **not** compare raw strings yourself, and do **not** use `normalizeCityKey` for grouping (spelling normalization only).\n\n### Prepare act list\n\n```ts\nimport type { ReadGed, Act } from \"gedcom-ts\";\n\nfunction collectAllActs(ged: ReadGed): Act[] {\n  const acts: Act[] = [];\n  for (const person of ged.persons) {\n    for (const act of person.acts.list) acts.push(act);\n  }\n  return acts;\n}\n```\n\n### Geocode one city (typical flow)\n\nWhen the user picks a city and a Nominatim result, update **every similar act that still has no GPS** — not only acts with the exact same label.\n\n| Step                                           | Function                                                    |\n| ---------------------------------------------- | ----------------------------------------------------------- |\n| 1. Context from the tree (countries, centroid) | `inferGeocodeContext(ged)`                                  |\n| 2. Search OpenStreetMap                        | `searchPlacesWithContext(cityName, context)`                |\n| 3. Acts to update                              | `actsNeedingGeocodeForCity(allActs, cityName)`              |\n| 4. Write coordinates                           | `applyGeocodeCandidateToActs(targets, candidate, cityName)` |\n\n```ts\nimport {\n  inferGeocodeContext,\n  searchPlacesWithContext,\n  actsNeedingGeocodeForCity,\n  applyGeocodeCandidateToActs,\n} from \"gedcom-ts\";\nimport type { ReadGed, Act } from \"gedcom-ts\";\n\nasync function geocodeCity(ged: ReadGed, allActs: Act[], cityName: string) {\n  const context = inferGeocodeContext(ged);\n  const candidates = await searchPlacesWithContext(cityName, context);\n  const chosen = candidates[0];\n  if (!chosen) return;\n\n  const targets = actsNeedingGeocodeForCity(allActs, cityName);\n  applyGeocodeCandidateToActs(targets, chosen, cityName);\n}\n```\n\n> **Tip:** Do not pass only acts from a harmonization cluster to `applyGeocodeCandidateToActs`. Longer labels (e.g. `Pleurtuit, Ille-et-Vilaine, France`) would stay without GPS. Always use `actsNeedingGeocodeForCity`.\n\n### List cities missing coordinates\n\nOne row per city; `withoutCoordCount` is how many acts still need GPS.\n\n```ts\nimport { groupActsBySimilarCity } from \"gedcom-ts\";\n\nconst groups = groupActsBySimilarCity(allActs, {\n  onlyWithoutCoordinates: true,\n});\n\nfor (const group of groups) {\n  console.log(group.cityLabel, group.withoutCoordCount);\n  // group.acts — acts in this group without GPS\n}\n```\n\nLargest groups first (`group.acts.length`).\n\n### Map: one marker per city\n\n```ts\nimport { clusterKeyForCity } from \"gedcom-ts\";\n\nconst markerKey = clusterKeyForCity(act.place?.city ?? \"\");\n// merge markers that share the same markerKey\n```\n\n### Harmonization (data quality, optional)\n\nUse when spellings, GPS positions, or “some acts with / without GPS” disagree for the same similar city.\n\n```ts\nimport { findHarmonizationClusters } from \"gedcom-ts\";\n\nfor (const cluster of findHarmonizationClusters(ged)) {\n  console.log(cluster.labels, cluster.coordVariants, cluster.actsWithoutCoord);\n}\n```\n\nAfter a full geocode via `actsNeedingGeocodeForCity`, you should not get a cluster that only reports missing GPS for that city.\n\n### Geocoding API cheat sheet\n\n| Goal                      | Call                                                             |\n| ------------------------- | ---------------------------------------------------------------- |\n| Search                    | `searchPlacesWithContext(city, inferGeocodeContext(ged))`        |\n| Acts to update on confirm | `actsNeedingGeocodeForCity(acts, city)`                          |\n| Apply lat/lng             | `applyGeocodeCandidateToActs(targets, candidate, city)`          |\n| Cities without GPS        | `groupActsBySimilarCity(acts, { onlyWithoutCoordinates: true })` |\n| Map marker id             | `clusterKeyForCity(city)`                                        |\n| Inconsistencies           | `findHarmonizationClusters(ged)`                                 |\n\nNetwork: `GET https://nominatim.openstreetmap.org/search?q=…&format=jsonv2` with a `User-Agent` (`gedcom-ts/<version> (genealogy library)`). For offline or mocked search, pass `fetchFn` in `searchPlaces` / `searchPlacesWithContext` options.\n\nThe legacy callback `getCityCoordinates` is deprecated — use the flow above.\n\n## Genealogy booklet (PDF)\n\nThe **`gedcom-ts/booklet`** subpath builds a printable family booklet: cover page, table of contents, chapters by generation (Sosa), family sheets, and narrative text from GEDCOM acts (birth, marriage, death, …). **English is the default locale** (`DEFAULT_BOOKLET_LOCALE`). Full copy is available for **`en`**, **`fr`**, **`de`**, **`nl`**, **`es`**, **`zh`**, **`it`**, **`pt`**, **`pl`**, **`ar`**, and **`he`** (aligned with [gedcomts.com](https://gedcomts.com) UI languages). Arabic and Hebrew use **RTL layout** in the PDF (`isBookletLocaleRtl`, `bookletTextDirection`).\n\n### Bundle layout\n\nCode is split so the host app only downloads what it uses. Approximate sizes after minify (obfuscation adds ~25–30 KiB on `gedcom-ts/booklet`).\n\n| Artifact                                    | Size (typ.) | When loaded                                  |\n| ------------------------------------------- | ----------: | -------------------------------------------- |\n| `gedcom-ts` (`dist/index.mjs`)              |    ~180 KiB | GEDCOM import / edit / export                |\n| `gedcom-ts/booklet` (`dist/booklet.mjs`)    |    ~100 KiB | livret (collect, estimate, PDF)              |\n| `locale-chunks/booklet-locale-*`            |   14–26 KiB | one UI language                              |\n| `feature-chunks/booklet-logo-draw`          |     ~11 KiB | cover logo (`coverLogo !== false`)           |\n| `feature-chunks/booklet-timeline-raster`    |      ~3 KiB | `timelineStyle: \"canvas\"`                    |\n| `font-chunks/booklet-pdf-font-bytes-ar`     |     ~43 KiB | Arabic PDF                                   |\n| `font-chunks/booklet-pdf-font-bytes-he`     |     ~13 KiB | Hebrew PDF                                   |\n| `font-chunks/booklet-pdf-font-bytes-zh`     |    ~190 KiB | Chinese PDF (base subset)                    |\n| `font-chunks/booklet-pdf-font-bytes-zh-ext` |    ~1.4 MiB | Chinese PDF when GEDCOM names need extra Han |\n| `pdf-lib` (peer, not in gedcom-ts)          |   ~500 KiB+ | any PDF generation                           |\n\n**Not bundled in gedcom-ts:** `fflate` (main entry, external), `pdf-lib` (booklet peer). **`bidi-js`** and **`naqqash`** (Arabic shaping / RTL reordering) ship inside `gedcom-ts/booklet` today.\n\nCall **`await ensureBookletLocale(locale)`** before sync APIs. `generateGenealogyBookletPdf` preloads locale, logo, and timeline when needed.\n\n**Lazy chunk subpaths** (for bundler preload or explicit `import()` — normal apps should use `ensureBookletLocale()` instead):\n\n| Subpath                                                                             | Role                                                |\n| ----------------------------------------------------------------------------------- | --------------------------------------------------- |\n| `gedcom-ts/booklet/locale-chunks/booklet-locale-{en,fr,de,nl,es,zh,it,pt,pl,ar,he}` | Messages, narratives, date/place helpers per locale |\n| `gedcom-ts/booklet/font-chunks/booklet-pdf-font-bytes-{ar,he,zh,zh-ext}`            | Subset Noto font bytes                              |\n| `gedcom-ts/booklet/feature-chunks/booklet-logo-draw`                                | Cover logo SVG paths                                |\n| `gedcom-ts/booklet/feature-chunks/booklet-timeline-raster`                          | Canvas timeline PNG rasterizer                      |\n\nEach subpath is listed in `package.json` **`exports`** with matching **`types`** (`.d.ts` under `dist/booklet/…`) and runtime (`.mjs` / `.cjs` under `dist/…`). TypeScript resolves them via `exports.types` (`moduleResolution: bundler` / `node16`). Adding a locale updates `scripts/booklet-chunk-manifest.mjs`; `npm run build:js` regenerates chunk files and syncs `exports`.\n\n### Vite / Angular integration\n\n1. **Lazy-load the booklet entry** — `import('gedcom-ts/booklet')` only when the user opens export / download (not on every tree page).\n2. **Preload the UI locale** — `import('gedcom-ts/booklet/locale-chunks/booklet-locale-fr')` (or your loader) before sync APIs; then `ensureBookletLocale('fr')`.\n3. **Unicode PDF (`zh` / `ar` / `he`)** — the host app should import font chunks explicitly and call `registerBookletPdfFontBytes` + `registerPdfFontkit` before `generateGenealogyBookletPdf` (see [gedcomts.com](https://gedcomts.com) `booklet-pdf-deps.loader.ts` for a reference pattern).\n4. **Dev server** — exclude the main booklet bundle from Vite pre-bundling so lazy subpaths resolve via `node_modules`:\n\n```ts\n// vite.config.ts / angular.json (esbuild optimizeDeps)\noptimizeDeps: {\n  exclude: [\"gedcom-ts/booklet\"],\n},\n```\n\nPublished `dist/booklet.mjs` keeps **literal** dynamic `import('gedcom-ts/booklet/…')` strings (rewrite before obfuscation, paths reserved from string encoding) so Vite can statically analyze chunk loads.\n\n### Workflow\n\n1. Import with `importGedFile` (`gedcom-ts`).\n2. **`await ensureBookletLocale(locale)`** — load messages/narratives for the chosen language.\n3. Collect persons with `collectBookletPersons` (`gedcom-ts/booklet`).\n4. Optionally preview size with `estimateBookletSize` + `groupBookletIntoChapters`.\n5. Build bytes with `generateGenealogyBookletPdf`, then `downloadBookletPdf` (browser).\n\n```ts\nimport { importGedFile } from \"gedcom-ts\";\nimport {\n  collectBookletPersons,\n  ensureBookletLocale,\n  groupBookletIntoChapters,\n  estimateBookletSize,\n  generateGenealogyBookletPdf,\n  downloadBookletPdf,\n  personDisplayName,\n} from \"gedcom-ts/booklet\";\n\nasync function exportBooklet(file: File) {\n  const ged = await importGedFile(file);\n  const root = ged.persons[0] ?? null;\n\n  const locale = \"en\" as const; // BookletLocale — align with your UI language (en, fr, de, nl, es, zh, it, pt, pl, ar, he)\n  await ensureBookletLocale(locale);\n\n  const entries = collectBookletPersons({\n    ged,\n    scope: \"from-reference\",\n    referencePerson: root,\n    maxGeneration: 6,\n    locale,\n  });\n\n  const chapters = groupBookletIntoChapters(entries, locale);\n  const families = chapters.reduce((n, ch) => n + ch.families.length, 0);\n  const size = estimateBookletSize(\n    chapters,\n    entries.length,\n    families,\n    \"summary\",\n    \"canvas\",\n    locale,\n  );\n  console.log(size.label);\n\n  const pdf = await generateGenealogyBookletPdf(\n    entries,\n    {\n      title: \"Family booklet\",\n      scopeLabel: \"Ancestors and descendants\",\n      personCount: entries.length,\n      referenceName: root ? personDisplayName(root) : undefined,\n    },\n    {\n      detailLevel: \"summary\",\n      timelineStyle: \"canvas\",\n      coverLogo: true,\n      locale,\n    },\n  );\n\n  downloadBookletPdf(pdf, \"family-booklet.pdf\");\n}\n```\n\nUse `scope: \"all\"` and `referencePerson: null` to include every individual in the file.\n\n### `collectBookletPersons` options\n\n| Option            | Role                                                                                                |\n| ----------------- | --------------------------------------------------------------------------------------------------- |\n| `ged`             | `ReadGed` after import                                                                              |\n| `scope`           | `\"all\"` or `\"from-reference\"` (Sosa from `referencePerson`)                                         |\n| `referencePerson` | Root person for `\"from-reference\"`; `null` if scope is `\"all\"`                                      |\n| `maxGeneration`   | Max Sosa generation (e.g. `6`); ignored when `scope === \"all\"`                                      |\n| `locale`          | `BookletLocale` (default `\"en\"`) — `en`, `fr`, `de`, `nl`, `es`, `zh`, `it`, `pt`, `pl`, `ar`, `he` |\n\nHelpers: `personDisplayName`, `buildBookletPersonEntry`, `sortBookletEntries`, `bookletSexFromPerson`, `DEFAULT_BOOKLET_LOCALE`, `BOOKLET_LOCALES`, `isBookletLocaleRtl`.\n\n### `generateGenealogyBookletPdf` options\n\n| Option          | Values                                                  | Effect                                                 |\n| --------------- | ------------------------------------------------------- | ------------------------------------------------------ |\n| `detailLevel`   | `\"summary\"` \\| `\"detailed\"`                             | Short prose per person vs longer biographies           |\n| `timelineStyle` | `\"off\"` \\| `\"canvas\"`                                   | Generation timeline pages per chapter                  |\n| `coverLogo`     | `true` (default), `false`, or `DrawGedcomTsLogoOptions` | gedcom-ts vector logo on the cover                     |\n| `locale`        | `BookletLocale` (default `\"en\"`)                        | Narrative, chapter titles, PDF chrome, timeline legend |\n| `unicodeFont`   | `Uint8Array` (optional)                                 | Replace bundled Noto font for `zh` / `ar` / `he`       |\n\n`BookletPdfMeta`: `title`, `scopeLabel`, `personCount`, optional `referenceName` (usually translated in the host app).\n\n### Cover logo\n\nThe cover draws the **gedcom-ts logo** from lazy-loaded SVG paths (`ensureBookletLogo`, `getGedcomTsLogoPaths`, `getGedcomTsLogoViewbox`). Reuse on custom PDF pages:\n\n```ts\nimport { PDFDocument } from \"pdf-lib\";\nimport {\n  drawGedcomTsLogoOnPage,\n  defaultCoverLogoOptions,\n  ensureBookletLogo,\n} from \"gedcom-ts/booklet\";\n\nconst doc = await PDFDocument.create();\nconst page = doc.addPage();\nawait ensureBookletLogo();\nawait drawGedcomTsLogoOnPage(page, defaultCoverLogoOptions());\n```\n\n### Booklet API cheat sheet\n\n| Goal                             | Export                                                                                                               |\n| -------------------------------- | -------------------------------------------------------------------------------------------------------------------- |\n| Persons for the booklet          | `collectBookletPersons`                                                                                              |\n| Chapters / families              | `groupBookletIntoChapters`, `partnerNamesLabel`                                                                      |\n| Localized narratives (custom UI) | `buildPersonSummaryNarrative`, `buildPersonDetailedNarratives`, `buildFamilyNarrative`, `buildChapterIntroNarrative` |\n| Page estimate                    | `estimateBookletSize`, `bookletSizeAdvice`                                                                           |\n| Timeline data / PNG              | `buildGenerationTimeline`, `rasterizeGenerationTimelinePng`                                                          |\n| PDF output                       | `generateGenealogyBookletPdf`, `downloadBookletPdf`, `toPdfText`, `preparePdfText`                                   |\n| Locale helpers                   | `resolveBookletLocale`, `bookletLocaleToBcp47`, `bookletTextDirection`, `BOOKLET_RTL_LOCALES`, `ensureBookletLocale` |\n| Font preload (host)              | `registerBookletPdfFontBytes`, `registerPdfFontkit`, `localeNeedsUnicodePdfFont`                                     |\n| Logo                             | `ensureBookletLogo`, `drawGedcomTsLogoOnPage`, `getGedcomTsLogoPaths`, `defaultCoverLogoOptions`                     |\n\n## Audio and oral history (GEDCOM 7)\n\nSince **`2026.6.0`**, gedcom-ts models audio according to [FamilySearch GEDCOM 7](https://gedcom.io/): external files referenced by **`OBJE`** records (`FILE` + `FORM` + optional `MEDI AUDIO` + `TRAN` for alternate formats or WebVTT). Text transcriptions belong in **`NOTE`** under the event, not inside `OBJE`.\n\n**Oral history pattern:** `1 EVEN` + `2 TYPE Interview` (or `Oral history`) + `2 OBJE @O…@` + `2 NOTE` (transcription).\n\n```ts\nimport {\n  createAudioInterviewAct,\n  editAct,\n  ExportGedzipFile,\n  type Person,\n  type ReadGed,\n} from \"gedcom-ts\";\n\nasync function addInterview(readGed: ReadGed, person: Person, mp3: File) {\n  const objeMap = new Map(readGed.objeRecordsById);\n\n  const { act, objeRecord } = createAudioInterviewAct(\n    {\n      description: \"Entretien avec grand-mère\",\n      participantIndis: [person.INDI],\n      ownerIndi: person.INDI,\n      audioFile: mp3,\n      transcription: \"Bonjour, je m'appelle Marie…\",\n      vttUri: \"media/transcript.vtt\", // optional FILE.TRAN on OBJE\n    },\n    readGed.persons,\n    objeMap,\n  );\n\n  person.acts.add(act);\n  if (objeRecord) {\n    objeMap.set(objeRecord.id, objeRecord);\n  }\n\n  await new ExportGedzipFile(\"my-tree\", readGed.persons, {\n    extraTopLevelRecords: readGed.preservedTopLevelRecords,\n    objeRecordsById: objeMap,\n  }).download();\n}\n\n// enrich an existing act:\neditAct(act)\n  .asAudioInterview(readGed.persons, objeMap)\n  .setTranscription(\"Suite de l'entretien…\")\n  .attachAudio({\n    audioUri: \"https://example.org/rec.mp3\",\n    ownerIndi: person.INDI,\n  });\n```\n\n| Goal                       | API                                                                      |\n| -------------------------- | ------------------------------------------------------------------------ |\n| Create interview act       | `createAudioInterviewAct`                                                |\n| Attach audio to act        | `attachAudioInterviewToAct`, `editAct(act).asAudioInterview()`           |\n| Detect imported interviews | `isAudioInterviewAct`, `isAudioInterviewEvenType`                        |\n| Read transcription / media | `getAudioInterviewTranscription`, `primaryAudioInterviewUri`             |\n| OBJE round-trip            | `readGed.objeRecordsById` → `objeRecordsById` in export options          |\n| Low-level OBJE parse/emit  | `parseStandaloneObjeBlock`, `formatObjeRecordBlock`, `guessMediFromForm` |\n| EVEN type constants        | `GEDCOM_7_EVEN_TYPE_AUDIO_INTERVIEW`, `GEDCOM_7_EVEN_TYPE_ORAL_HISTORY`  |\n\n## API reference\n\nShort description and a minimal snippet for each export of **`gedcom-ts`**. For the PDF booklet, see [Genealogy booklet (PDF)](#genealogy-booklet-pdf) (`gedcom-ts/booklet`).\n\n### Importing a file\n\n#### `importGedFile(file: File): Promise<ReadGed>`\n\nDetects the format from the file MIME / extension and dispatches to the right reader.\n\n- accepts a single `.ged` file\n- accepts a `.zip` / `.gdz` archive containing one `.ged` + optional media files\n- throws `Error(IMPORT_ERR_ZIP_GED_UNREADABLE)` when the embedded `.ged` cannot be decoded (typical cause: password-protected ZIP)\n\n```ts\nimport { importGedFile } from \"gedcom-ts\";\n\nconst readGed = await importGedFile(fileInput.files![0]);\nconsole.log(readGed.persons.length, readGed.datasetVersion);\n```\n\n#### `createEmptyReadGed(options?): ReadGed`\n\nCreates an empty graph with the same runtime shape as a successful import (empty `persons`, initialized `mapPersons` / `partnersMap` / `childsMap` / `placesMap` / `mapFiles`). Use it to start a brand-new tree without parsing a file. `datasetVersion` is set to `\"7.0\"`.\n\n```ts\nimport { createEmptyReadGed } from \"gedcom-ts\";\n\nconst readGed = createEmptyReadGed();\n```\n\n#### `IMPORT_ERR_ZIP_GED_UNREADABLE: string`\n\nSentinel error message thrown by `importGedFile` when a `.ged` inside a ZIP cannot be decoded (typically because the ZIP is password-protected). Compare with `error.message === IMPORT_ERR_ZIP_GED_UNREADABLE` to display a tailored message.\n\n```ts\nimport { importGedFile, IMPORT_ERR_ZIP_GED_UNREADABLE } from \"gedcom-ts\";\n\ntry {\n  await importGedFile(file);\n} catch (error) {\n  if (\n    error instanceof Error &&\n    error.message === IMPORT_ERR_ZIP_GED_UNREADABLE\n  ) {\n    alert(\"Please unzip the archive manually and import the .ged file.\");\n  }\n}\n```\n\n#### `ReadGed`\n\nResult of an import. Standalone `0 @O…@ OBJE` blocks with at least one `FILE` are parsed into **`objeRecordsById`** (multi-file, `MEDI`, `TRAN`). Other top-level records (`REPO`, `SOUR`, `SUBM`, …) stay on `preservedTopLevelRecords` for round-trip export.\n\nNotable members:\n\n| Member                                     | Description                                                                                                                                                |\n| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `persons: Person[]`                        | Imported individuals.                                                                                                                                      |\n| `mapPersons: Map<number, Person>`          | `INDI` (integer) → `Person`.                                                                                                                               |\n| `partnersMap: Map<number, Person[]>`       | Family id → spouses.                                                                                                                                       |\n| `childsMap: Map<number, Person[]>`         | Family id → children.                                                                                                                                      |\n| `placesMap: Map<string, Place>`            | City name → `Place` (first occurrence wins).                                                                                                               |\n| `mapFiles: Map<string, File>`              | Relative path → media `File` (for ZIP imports).                                                                                                            |\n| `datasetVersion: GedcomDatasetVersion`     | `\"7.0\"`, `\"5.5\"` or `\"unknown\"`.                                                                                                                           |\n| `objeRecordsById: Map<number, ObjeRecord>` | Parsed `OBJE` records (audio, images, …) keyed by `@O{n}@`.                                                                                                |\n| `preservedTopLevelRecords: string[]`       | Raw blocks for partial round-trip.                                                                                                                         |\n| `resolveIndividualPointer(raw)`            | Resolves `@I12@`, `I12`, `@Homer_Simpson@`, `Homer_Simpson` to a `Person`.                                                                                 |\n| `getChildrenForParent(parent)`             | All children attached to a parent (via `FAMS`).                                                                                                            |\n| `getChildrenOfFamily(familyId)`            | Children of a single family.                                                                                                                               |\n| `groupPartners()`                          | Rebuilds `partnersMap` / `childsMap` after editing links.                                                                                                  |\n| `generateUniqueIndi()`                     | Next free `INDI` number for new persons.                                                                                                                   |\n| `rehydratePlacesFromActs()`                | Rebuilds `placesMap` from act places (e.g. after manual graph edits). Use `editReadGed(readGed).addPerson(...)` to register persons so maps stay coherent. |\n\n```ts\nimport { ReadGed } from \"gedcom-ts\";\n\nfunction describe(readGed: ReadGed) {\n  return {\n    version: readGed.datasetVersion,\n    persons: readGed.persons.length,\n    places: readGed.placesMap.size,\n  };\n}\n```\n\n### Exporting\n\n#### `ExportGedcomFile`\n\nWrites a GEDCOM 7 (`.ged`) file. Three call signatures are supported:\n\n```ts\nnew ExportGedcomFile(persons);\nnew ExportGedcomFile(title, persons);\nnew ExportGedcomFile(title, persons, options);\n```\n\n`.download()` triggers a browser download. `.toString()` returns the GEDCOM text.\n\n```ts\nimport { ExportGedcomFile, type ReadGed } from \"gedcom-ts\";\n\nfunction exportGed(readGed: ReadGed) {\n  new ExportGedcomFile(\"my-tree\", readGed.persons, {\n    extraTopLevelRecords: readGed.preservedTopLevelRecords,\n    objeRecordsById: readGed.objeRecordsById,\n    headLanguageTag: \"fr-FR\",\n    headCopyright: \"© 2026 Family Archive\",\n    headDestination: \"https://gedcom.io/\",\n    headSchemaTagDefs: [{ tag: \"_FOO\", uri: \"https://example.com/foo\" }],\n  }).download();\n}\n```\n\n#### `ExportGedzipFile`\n\nWrites a `.zip` (GEDZIP) bundling the GEDCOM and all attached `MultimediaFile` payloads. Built with **fflate** (`zip` async, level 9).\n\n```ts\nimport { ExportGedzipFile, Person } from \"gedcom-ts\";\n\nasync function exportZip(persons: Person[]) {\n  await new ExportGedzipFile(\"my-tree\", persons).download();\n}\n\nasync function exportZipBlob(persons: Person[]) {\n  return new ExportGedzipFile(\"my-tree\", persons).gedzipBlob();\n}\n```\n\n#### `GedcomExportOptions`\n\nOptions shared by both exporters:\n\n| Option                 | Effect                                                                                                   |\n| ---------------------- | -------------------------------------------------------------------------------------------------------- |\n| `extraTopLevelRecords` | Raw `0 …` blocks re-emitted before `SUBM` / `TRLR` (round-trip with `readGed.preservedTopLevelRecords`). |\n| `objeRecordsById`      | Full `OBJE` records (multi-`FILE`, `MEDI AUDIO`, `TRAN`) from `readGed.objeRecordsById`.                 |\n| `headLanguageTag`      | BCP 47 tag for `HEAD`.`LANG` (defaults to `en-US`).                                                      |\n| `headCopyright`        | One-line `1 COPR` notice.                                                                                |\n| `headDestination`      | Value of `HEAD`.`DEST` (target app / URI).                                                               |\n| `headSchemaTagDefs`    | Extension tag definitions emitted as `HEAD`.`SCHMA` / `2 TAG …`.                                         |\n\n### Domain model\n\n#### `Person`, `Sex`\n\n```ts\nimport { Person, Sex } from \"gedcom-ts\";\n\nconst person = new Person();\nperson.INDI = 1;\nperson.SEX = Sex.M; // M | F | U | X\nperson.firstnames = [\"Jean\"];\nperson.lastname = \"DUPONT\";\n\nperson.addMultimedia(/* MultimediaFile */);\nperson.deleteMultimedia(\"1/photo.jpg\");\n```\n\nKey fields: `INDI`, `sosa`, `SEX`, `firstnames`, `lastname`, `FAMC`, `FAMS`, `acts`, `notes`, `multimediaFiles`, `nameVariants`, `attributes`.\n\n#### `PersonGedcomImportOptions` (type)\n\nOptional hints consumed by `Person.createPersonJson` when re-parsing a single individual block (label-keyed pointers for `FAMS` / `FAMC` / `NOTE`, and standalone `OBJE` payloads). Useful when assembling a graph manually outside `ReadGed`.\n\n#### `PersonNameVariant`, `PersonNameTranslation`\n\nGEDCOM 7 may quote the preferred given name in `1 NAME` (e.g. `\"Jean\" /Dupont/`). Since **2026.6.4**, `personDisplayName`, `personInitialsFromPerson`, and `formatPersonNameFromVariant` strip those quotes for UI display after import or export round-trip.\n\nLossless representation of every `1 NAME` block of an individual (type, `NPFX`/`GIVN`/`SURN`/… parts, `TRAN` translations). `Person.nameVariants` keeps them in order so alias / translation data survive an import → export round-trip.\n\n```ts\nimport { PersonNameVariant, PersonNameTranslation } from \"gedcom-ts\";\n\nconst variant = new PersonNameVariant(\"Jean /Dupont/\", \"BIRTH\");\nvariant.parts.push({ level: \"2\", tag: \"GIVN\", value: \"Jean\" });\nvariant.translations.push(new PersonNameTranslation(\"ジャン /デュポン/\", \"jp\"));\n```\n\n#### `IndiAttribute`, `IndiGedcomSubLine`\n\nGeneric level-1 individual attributes (`FACT`, `DSCR`, `CAST`, `EDUC`, `OCCU`, `RELI`, `TITL`, `RESN`, …) with their sub-lines preserved (`IndiGedcomSubLine = { level; tag; value }`).\n\n```ts\nimport { IndiAttribute } from \"gedcom-ts\";\n\nconst occ = new IndiAttribute(\"OCCU\", \"Blacksmith\", [\n  { level: \"2\", tag: \"DATE\", value: \"1820\" },\n]);\n```\n\n#### `Act`, `Acts`, `TypeAct`, `ActConstructionOptions`\n\n`Act` models an individual or family event (BIRT, MARR, etc.). `Acts` is the ordered collection on a `Person`. `TypeAct` is the union of every supported GEDCOM 7 event tag (= `Gedcom7EventTag`). Event-level notes live on `act.notes` (`2 NOTE` / `3 CONT` in GEDCOM); they are distinct from `person.notes` (`1 NOTE` on `INDI`) and round-trip through ZIP export/import.\n\n```ts\nimport { Act, Acts, Identifier, type TypeAct } from \"gedcom-ts\";\n\nconst acts = new Acts();\nconst type: TypeAct = Identifier.BIRT;\nacts.add(new Act(type));\nacts.sortByDate();\n```\n\n`ActConstructionOptions` controls the extras when building an `Act` manually:\n\n```ts\nimport { Act, DateAct, Identifier } from \"gedcom-ts\";\n\nconst act = new Act(\n  Identifier.EVEN,\n  new DateAct(\"12 JAN 1901\"),\n  null,\n  null,\n  null,\n  undefined,\n  undefined,\n  {\n    evenDescription: \"Won a medal\",\n    evenTypeLabel: \"Award\",\n    sdateAct: new DateAct(\"13 JAN 1901\"),\n    eventPhrases: [\"family gathering\"],\n    preservedSubrecordPrefix: [],\n    preservedSubrecordSuffix: [],\n  },\n);\n```\n\n#### `GEDCOM_7_ALL_EVENT_TAGS`, `GEDCOM_7_EVENT_SORT_ORDER`, `GEDCOM_7_EVENT_TAG_SET`, `GEDCOM_7_PAIR_UNION_EVENT_TAGS`, `Gedcom7EventTag`, `Gedcom7PairUnionEventTag`\n\nCanonical lists of GEDCOM 7 event tags (`INDIVIDUAL_EVENT_STRUCTURE` ∪ `FAMILY_EVENT_STRUCTURE`, LDS ordinances excluded). Use them to build UI selects or guard custom logic. `GEDCOM_7_PAIR_UNION_EVENT_TAGS` lists tags commonly used when creating a family union via `createMarriageFamily` (`ENGA`, `MARB`, `MARC`, `MARL`, `MARR`, `MARS`).\n\n```ts\nimport {\n  GEDCOM_7_ALL_EVENT_TAGS,\n  GEDCOM_7_EVENT_SORT_ORDER,\n  GEDCOM_7_EVENT_TAG_SET,\n  type Gedcom7EventTag,\n} from \"gedcom-ts\";\n\nconst options: Gedcom7EventTag[] = [...GEDCOM_7_ALL_EVENT_TAGS];\nconst isEvent = GEDCOM_7_EVENT_TAG_SET.has(\"MARR\");\nconst sorted = [...GEDCOM_7_EVENT_SORT_ORDER];\n```\n\n#### `DateAct`, `Day`, `Month`, `dateToDateLine`, `days`, `months`, `TypeDateActSimpleQualifier`\n\nGEDCOM dates with full GEDCOM 7 / 5.5 support, including `INT`, `EST`, `CAL`, `BET … AND …`, `FROM … TO …`, ISO `YYYY-MM-DD`, `3 PHRASE` under `DATE`, `3 TIME`, and a verbatim fallback for unparseable payloads. Month tokens (`JAN`, `may`, …) and simple qualifiers are matched **case-insensitively** (since **2026.6.2**).\n\n```ts\nimport { DateAct, Day, Month, dateToDateLine, days, months } from \"gedcom-ts\";\n\nconst day: Day = 12;\nconst month: Month = months[0]; // JAN\nconst dateLine = dateToDateLine(1901, month, day); // \"12 JAN 1901\"\nconst dateAct = new DateAct(dateLine);\nconst formattedDate = dateAct.date;\nconst knownDaysCount = days.length;\n```\n\n`TypeDateActSimpleQualifier` is the union of single-anchor qualifiers (`BEF | ABT | AFT | INT | EST | CAL`) accepted by `DateAct.updateQualifiedDate` and by `DateActEdit.setQualified`.\n\n#### `Place`, `CoordinateGPS`\n\n```ts\nimport { Place, CoordinateGPS } from \"gedcom-ts\";\n\nconst place = new Place(\"Paris, FR\", new CoordinateGPS(48.8566, 2.3522));\nplace.setFromGedcom7PlacPayload(\"Paris, Île-de-France, France\");\nconst payload = place.toGedcom7PlacPayload(); // \"Paris, , Île-de-France, France\"\n```\n\n`Place` understands the `City, County, State, Country` GEDCOM 7 list (1 to 4+ segments) and exposes `placPhrase` for `3 PHRASE` under `PLAC` (import + export).\n\n#### `MultimediaFile`, `MultimediaFiles`\n\nWraps either a local `File`, an external URI (`sourceUri`) or an OBJE pointer (`objeXrefId`) so the same model can survive a GED / ZIP round-trip. See [Audio and oral history](#audio-and-oral-history-gedcom-7) for interview workflows.\n\n```ts\nimport { MultimediaFile, MultimediaFiles } from \"gedcom-ts\";\n\nconst bucket = new MultimediaFiles();\nbucket.relativePath = \"1/BIRT\";\nbucket.add(new MultimediaFile(new File([\"img\"], \"birth.jpg\")));\n\nconst remote = new MultimediaFile(undefined, \"https://example.com/p.jpg\");\nconst isExportable = remote.hasExportablePayload();\n```\n\n#### `Note`, `Notes`, `TypeNote`\n\n```ts\nimport { Notes, Note, Identifier, type TypeNote } from \"gedcom-ts\";\n\nconst typeNote: TypeNote = Identifier.CONT;\nconst note = new Note();\nnote.updateType(typeNote);\nnote.updateLines([\"first line\", \"second line\"]);\n\nconst notes = new Notes();\nnotes.addNote(note);\nnotes.removeFromIndex(0);\n```\n\n#### `Identifier` (and deprecated `Identificator`)\n\nEnum of every GEDCOM tag the library refers to (`INDI`, `BIRT`, `MARR`, `DATE`, `PLAC`, …). Prefer `Identifier`; `Identificator` is kept as a deprecated alias.\n\n```ts\nimport { Identifier } from \"gedcom-ts\";\n\nconst birthTag = Identifier.BIRT;\n```\n\n#### `EventsByYears`, `ActsByYear`\n\nGroup acts by year, deduplicating per individual. Handy to build chronological timelines.\n\n```ts\nimport { EventsByYears, ActsByYear } from \"gedcom-ts\";\n\nconst grouped = new EventsByYears(person.acts.list);\nfor (const bucket of grouped.events) {\n  console.log(bucket.year, bucket.list.length);\n}\n\nconst yearBucket = new ActsByYear(1901);\n```\n\n### Edit layer (in-place, chainable)\n\nWrap an existing model object to mutate it with a fluent API. Every method returns `this`, so you can chain. `.value` exposes the underlying target.\n\n```ts\nimport { editPerson, editDateAct, DateAct } from \"gedcom-ts\";\n\neditPerson(person)\n  .setLastname(\"Dupont\")\n  .setFirstnames([\"Jean\", \"Marie\"])\n  .acts()\n  .at(0)\n  .setDateAct(new DateAct(\"1 JAN 1900\"));\n\neditDateAct(person.acts.list[0].dateAct!).setExactDate(1900, \"JAN\", 1);\n```\n\n| Helper / class                                         | Purpose                                                                                                                                                                                                                   |\n| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `editPerson(person)` / `PersonEdit`                    | Identity, `FAMS` / `FAMC` / `removeFams*`, `nameVariants()` / `attributes()` / `multimedia()`, bulk `clear*`, entry points to `acts()` and `notes()`.                                                                     |\n| `editActs(acts)` / `ActsEdit`                          | `add`, `addNew`, `insertAt`, `insertNewAt`, `replaceAt`, `removeAt`, `removeAct`, `removeLast`, `clear`, `sortByDate`, `at`, `indexOfAct`.                                                                                |\n| `editAct(act)` / `ActEdit`                             | `setType`, `setIndis`, dates, place, EVEN fields, preserved lines, `notes()`, `multimedia()`, `asAudioInterview()`, `clearNotes`, `clearMultimedia`.                                                                      |\n| `editAudioInterviewAct(act)` / `AudioInterviewActEdit` | Oral-history facade: `attachAudio`, `setTranscription`, `setDescription`, `registerPendingObje`, `isAudioInterview`, …                                                                                                    |\n| `editDateAct(dateAct)` / `DateActEdit`                 | `clear`, `applyGedcomPayload`, `setExactDate`, `setQualified`, `setBetween`, `setFromTo`, `setTime`, `setDatePhrase` / `appendDatePhrase`, `setVerbatimPayload`.                                                          |\n| `editPlace(place)` / `PlaceEdit`                       | `setFromGedcom7Payload`, `setCity`, `setCounty`, `setState`, `setCountry`, `setPlacPhrase` / `appendPlacPhrase` / `clearPlacPhrase`, `setCoordinates` / `clearCoordinates` / `replaceCoordinateModel`, `clearStructured`. |\n| `editNotes(notes)` / `NotesEdit`                       | `add`, `addNew`, `insertAt`, `insertNewAt`, `replaceAt`, `removeAt`, `removeNote`, `removeLast`, `clear`, `at`, `indexOfNote`.                                                                                            |\n\n### Dataset editing: `ReadGed`, graph, clone, export options, validation\n\nHigher-level helpers complement the per-object edit facades:\n\n```ts\nimport type { GedcomExportOptions } from \"gedcom-ts\";\nimport {\n  createEmptyReadGed,\n  createPersonStub,\n  DateAct,\n  Sex,\n  editReadGed,\n  editGedcomExportOptions,\n  clonePerson,\n  cloneAct,\n  createMarriageFamily,\n  linkChildToFamily,\n  removeFamilyReferencesFromDataset,\n  addPersonToReadGed,\n  validateReadGed,\n  Identifier,\n  Act,\n} from \"gedcom-ts\";\n\nconst readGed = createEmptyReadGed();\nconst p = createPersonStub(readGed.generateUniqueIndi(), {\n  sex: Sex.M,\n  firstnames: [\"Jean\"],\n  lastname: \"Dupont\",\n});\neditReadGed(readGed).addPerson(p);\np.acts.add(new Act(Identifier.BIRT, new DateAct(\"1900\")));\n\neditReadGed(readGed).preserved().append(\"0 @S42@ SOUR Custom\");\n\nconst opts: GedcomExportOptions = {};\neditGedcomExportOptions(opts)\n  .setHeadCopyright(\"© 2026\")\n  .setExtraTopLevelRecords([...readGed.preservedTopLevelRecords]);\n\nconst twin = clonePerson(p, readGed.generateUniqueIndi());\nconst birthCopy = cloneAct(p.acts.list[0]!);\n\n// const fam = createMarriageFamily(readGed, spouseA, spouseB, { dateAct: new DateAct(\"1 JAN 2000\") }, { eventTag: Identifier.ENGA });\n// linkChildToFamily(readGed, child, fam);\n// removeFamilyReferencesFromDataset(readGed, fam);\n\nvalidateReadGed(readGed, {\n  checkMarrParticipants: true,\n  checkFamcWithoutSpouses: true,\n  checkFamsWithoutSpouses: true,\n  checkDuplicateFamsEntries: true,\n  checkAncestorCycles: true,\n});\n```\n\n#### Commands (invariants before mutation)\n\n`tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, and `tryCreateMarriageFamily` return a `CommandResult` (`ok` + `issues` or `value` + optional `warnings`). `editReadGed(...).addPerson` uses these checks internally (throws on blocking errors). For UI or transactional flows, prefer the `try*` APIs and inspect `commandBlockingIssues`.\n\n| Export                                                                                                                                                              | Role                                                                                                                                                                                                                                                       |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `editReadGed(readGed)` / `ReadGedEdit`                                                                                                                              | `addPerson`, `removePersonByIndi`, `preserved()` → `PreservedTopLevelEdit` (`append`, `insertAt`, `replaceAt`, `removeAt`, `clear`) on `preservedTopLevelRecords`. Low-level helpers: `addPersonToReadGed`, `removePersonFromReadGedByIndi`.               |\n| `editGedcomExportOptions(opts)` / `GedcomExportOptionsEdit`                                                                                                         | Fluent setters for `extraTopLevelRecords`, `objeRecordsById`, `headLanguageTag`, `headCopyright`, `headDestination`, `headSchemaTagDefs`.                                                                                                                  |\n| `clonePerson(person, newIndi)` / `cloneAct(act)` / `person.clone` / `act.clone`                                                                                     | Deep copies for templates or undo stacks.                                                                                                                                                                                                                  |\n| `nextFamilyId(persons)`                                                                                                                                             | Next internal family id `F`.                                                                                                                                                                                                                               |\n| `createMarriageFamily`, `linkChildToFamily`, `unlinkChildFromFamily`, `removeFamilyReferencesFromDataset`                                                           | Create family `F` and spouse acts; optional `{ eventTag }` (default `MARR`, also `ENGA`, banns, contract, `EVEN` + `CreateActInit`, …). See `GEDCOM_7_PAIR_UNION_EVENT_TAGS`.                                                                              |\n| `validateReadGed`, `assertReadGedConsistent`, `validatePerson`, `assertPersonConsistent`                                                                            | Typed `code` / `severity` (`error` \\| `warn`). Options: `checkMarrParticipants`, `checkDuplicateIndis`, `checkFamcWithoutSpouses`, `checkFamsWithoutSpouses`, `checkDuplicateFamsEntries`, `checkAncestorCycles`. Assertions: `failOn` (default: `error`). |\n| `tryAddPersonToReadGed`, `tryRemovePersonFromReadGedByIndi`, `tryLinkChildToFamily`, `tryUnlinkChildFromFamily`, `tryCreateMarriageFamily`, `commandBlockingIssues` | Command layer with `CommandResult` / `validate*Command` prechecks.                                                                                                                                                                                         |\n\n### Utilities\n\n#### `createSosaMap(root, partnersMap)`\n\nComputes a Sosa numbering (Ahnentafel) starting at `root` (Sosa 1) and recursively walking ancestors via `partnersMap`.\n\n```ts\nimport { createSosaMap, Person } from \"gedcom-ts\";\n\nconst sosaMap = createSosaMap(root, readGed.partnersMap);\n// e.g. sosaMap.get(root.INDI) === 1\n```\n\n#### `remainingTypesAct(acts, actToUpdate?)`\n\nReturns the list of event types still allowed for a person’s `Acts`, enforcing the “unique per individual” rule for `BIRT` / `DEAT` / `BURI` / `CHR` while keeping every other tag selectable. Pass the currently edited act as `actToUpdate` so its own type stays in the list when re-opening a form.\n\n```ts\nimport { remainingTypesAct, Acts } from \"gedcom-ts\";\n\nconst available = remainingTypesAct(new Acts());\n```\n\n#### `getCityCoordinates(cityName, callback)` (deprecated)\n\nLegacy callback API. Use [Geocoding places](#geocoding-places) instead.\n\n#### `resolveDatasetVersion(headerLines)` / `GedcomDatasetVersion`\n\nInspects the lines of a `0 HEAD` block and returns `\"7.0\"`, `\"5.5\"` or `\"unknown\"`. Useful to branch UI behaviour for legacy datasets.\n\n```ts\nimport { resolveDatasetVersion } from \"gedcom-ts\";\n\nconst version = resolveDatasetVersion(headLines); // \"7.0\" | \"5.5\" | \"unknown\"\n```\n\n#### `guessMediaFormFromUri(uri)`\n\nBest-effort media type detection from a path/URI or local `File` (`file.type` when set). Covers images (incl. **tiff**, **heic**, svg), **audio** (mp3, **webm**, ogg, wav, m4a, flac, …), **video** (mp4, mov, mkv, …), subtitles (vtt, srt), and documents (pdf, djvu, docx, odt, xlsx, csv, html). Used to fill `OBJE`.`FILE`.`FORM`. Pair with `guessMediFromForm` for `MEDI` (`AUDIO`, `PHOTO`, `VIDEO`, `ELECTRONIC`, …). `refineGenericObjeForm` upgrades legacy `application/octet-stream` exports using the file extension.\n\n```ts\nimport { guessMediaFormFromUri, guessMediaFormFromFile } from \"gedcom-ts\";\n\nguessMediaFormFromUri(\"media/recording.webm\"); // \"audio/webm\"\nguessMediaFormFromFile(new File([\"x\"], \"take.webm\", { type: \"audio/webm\" })); // \"audio/webm\"\n```\n\n#### `extractPersonNameVariants(personLines)` / `extractIndiAttributes(personLines)`\n\nLow-level parsers used by `Person.createPersonJson`. They turn the raw GEDCOM lines of a single `INDI` record into structured `PersonNameVariant[]` / `IndiAttribute[]`. Reuse them when parsing custom GEDCOM fragments outside `ReadGed`.\n\n```ts\nimport { extractPersonNameVariants, extractIndiAttributes } from \"gedcom-ts\";\n\nconst variants = extractPersonNameVariants(rawIndiLines);\nconst attributes = extractIndiAttributes(rawIndiLines);\n```\n\n#### `selectPrimaryNameVariant(variants)`\n\nPicks the most relevant `1 NAME` block: priority to `2 TYPE BIRTH`, then to a name with a `/surname/` payload, otherwise the first variant.\n\n```ts\nimport { selectPrimaryNameVariant } from \"gedcom-ts\";\n\nconst primary = selectPrimaryNameVariant(person.nameVariants);\n```\n\n#### `GEDCOM_LIBRARY_VERSION`\n\nCalVer string written in exported `HEAD`.`SOUR`.`VERS` (same value as the npm package version, e.g. `2026.9.0`).\n\n```ts\nimport { GEDCOM_LIBRARY_VERSION } from \"gedcom-ts\";\n\nconsole.log(`gedcom-ts ${GEDCOM_LIBRARY_VERSION}`);\n```\n\n## Error handling\n\n```ts\nimport { importGedFile, IMPORT_ERR_ZIP_GED_UNREADABLE } from \"gedcom-ts\";\n\ntry {\n  const readGed = await importGedFile(file);\n  console.log(readGed.persons.length);\n} catch (error) {\n  if (\n    error instanceof Error &&\n    error.message === IMPORT_ERR_ZIP_GED_UNREADABLE\n  ) {\n    console.error(\"Encrypted ZIP: please extract the .ged manually.\");\n  } else {\n    console.error(\"GED import failed:\", error);\n  }\n}\n```\n","readmeFilename":"README.md"}