{"_id":"@apiclient.xyz/ghost","_rev":"8-7890ea6d9a5b9ae5d1b8ec161cb71987","name":"@apiclient.xyz/ghost","dist-tags":{"latest":"2.2.1"},"versions":{"1.0.2":{"name":"@apiclient.xyz/ghost","version":"1.0.2","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@1.0.2","homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"06d0f3dd2970d26dcbabd9647b9fc03fe55eca26","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-1.0.2.tgz","fileCount":21,"integrity":"sha512-Rlr4O/S/J7l6jHzXE6zeHvzeMwihVuYr6nP1mz1YiWxqyQtowiCZQHKQAJV+aGj7YyuirYCZZ71hUkutMHwJRw==","signatures":[{"sig":"MEQCIEUq0fkXWdNYO5HCtIyIn7M8zJFaxW7XGI1ptWJwLh3nAiBIKM8OqweJ5jAKm8iLq9VXjiFr4dtXJbL9zoUH9PsA4g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":18771},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-1.0.2.tgz","private":false,"scripts":{"test":"(tstest test/ --web)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/4e3b8018cc6f604931d129dacaa32326/apiclient.xyz-ghost-1.0.2.tgz","_integrity":"sha512-Rlr4O/S/J7l6jHzXE6zeHvzeMwihVuYr6nP1mz1YiWxqyQtowiCZQHKQAJV+aGj7YyuirYCZZ71hUkutMHwJRw==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"10.2.3","description":"an unofficial ghost api package","directories":{},"_nodeVersion":"21.2.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.13.12","@tryghost/content-api":"^1.11.21"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.14.9","@git.zone/tsrun":"^1.2.49","@git.zone/tstest":"^1.0.44","@push.rocks/qenv":"^6.0.5","@git.zone/tsbuild":"^2.1.82","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^5.0.15"},"_npmOperationalInternal":{"tmp":"tmp/ghost_1.0.2_1719844366549_0.2169446640443511","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@apiclient.xyz/ghost","version":"1.0.3","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@1.0.3","homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"1bff3755b47c0f1e4219aa8392771fe220f4d911","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-1.0.3.tgz","fileCount":21,"integrity":"sha512-d9T44Tqe22f6ji8cHOyz1aB/4NP2TCWphJw75krKAvz32BNtjK+Saxb0OeX4/d+oCZoKHI5fIL0JJjsTVeh2hg==","signatures":[{"sig":"MEQCIEusykoKR49xPRlkHvuAOghVO+LGZmbSOnnldKYG8ro4AiBgqT+amvGAXhcXM7npRYbd3tNw5JavBnHCrcY1FjiqLg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":23849},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-1.0.3.tgz","private":false,"scripts":{"test":"(tstest test/ --web)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/031dfcd9ff1a92bdf98507eb9cd7f881/apiclient.xyz-ghost-1.0.3.tgz","_integrity":"sha512-d9T44Tqe22f6ji8cHOyz1aB/4NP2TCWphJw75krKAvz32BNtjK+Saxb0OeX4/d+oCZoKHI5fIL0JJjsTVeh2hg==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"10.2.3","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"21.2.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.13.12","@tryghost/content-api":"^1.11.21"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.14.9","@git.zone/tsrun":"^1.2.49","@git.zone/tstest":"^1.0.44","@push.rocks/qenv":"^6.0.5","@git.zone/tsbuild":"^2.1.82","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^5.0.15"},"_npmOperationalInternal":{"tmp":"tmp/ghost_1.0.3_1719844474260_0.9113816698291555","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@apiclient.xyz/ghost","version":"1.3.0","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@1.3.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"2e785cec3cbed1393bcf10558dca90b8561eb812","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-1.3.0.tgz","fileCount":30,"integrity":"sha512-1UvoM0zss/mGFSTnB3AnHTmXRgdOpF7/64InVTK6p6eaZvRTDQialwoiz3aO2PqZBY75OOTiim9QC198MJXbVw==","signatures":[{"sig":"MEYCIQDeMc02aV9S8xqOReBQjQRqWtRqXGqpMzAUdSQOr2ReIwIhAILB24Wpoq/q0JuGIX6+yl9PA37s4116xrOBXdQoC2fE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74539},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-1.3.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/09d4d1a60eb2e31e6920b8b6ef4bc61b/apiclient.xyz-ghost-1.3.0.tgz","_integrity":"sha512-1UvoM0zss/mGFSTnB3AnHTmXRgdOpF7/64InVTK6p6eaZvRTDQialwoiz3aO2PqZBY75OOTiim9QC198MJXbVw==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"11.3.0","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"23.8.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.14.0","@tryghost/content-api":"^1.12.0","@push.rocks/smartmatch":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.12.0","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.3.8","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ghost_1.3.0_1759845310826_0.34044767568941103","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@apiclient.xyz/ghost","version":"1.4.1","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@1.4.1","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"75c2a3a617a9a9b87f8a8ea4b54808a26cf31b07","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-1.4.1.tgz","fileCount":33,"integrity":"sha512-7E2AmGghQ5zQzmCou5L2N31w07oJm0levLMwmoRs9ZB/OyaaAEYSvFo76FUE3oISGRyYxd7uxW6f+TMz7GUmCA==","signatures":[{"sig":"MEUCIF9NXeDNiw4sYelxCCLe438SRzkXJOPph1cS95fWh56EAiEAv2r3SkCKiy4AHMpAKJBgT+xBpIpI34ZvC23g8l/QB00=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95123},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-1.4.1.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/ffa5a56a381f034af108c795c7793a90/apiclient.xyz-ghost-1.4.1.tgz","_integrity":"sha512-7E2AmGghQ5zQzmCou5L2N31w07oJm0levLMwmoRs9ZB/OyaaAEYSvFo76FUE3oISGRyYxd7uxW6f+TMz7GUmCA==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"11.3.0","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"23.8.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.14.0","@tryghost/content-api":"^1.12.0","@push.rocks/smartmatch":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.12.0","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.3.8","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ghost_1.4.1_1759847524236_0.6015785624736139","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@apiclient.xyz/ghost","version":"2.0.0","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@2.0.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"ff5511eb7e25583553c0269226c3d4f6c8ff0cbc","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-2.0.0.tgz","fileCount":33,"integrity":"sha512-GV8iQTR/c4CW1q6atqDMX1iCaQa6eE5xUp4lklopYJaKn5gF6hQV/sKkISkJ3FvR9Gyn/rOODar02ANTuDe3fg==","signatures":[{"sig":"MEQCIDO6eygxvcu2S+UDXdgn6rqEL/jqG1O2m1lN/NG1/sEZAiBXM7OyEsRAIvQ+pBKVxzEMdLBtlr7RUlGM+cV5MEPnwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84133},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-2.0.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/8e7ae115bda93b5fdd119c374ade6e69/apiclient.xyz-ghost-2.0.0.tgz","_integrity":"sha512-GV8iQTR/c4CW1q6atqDMX1iCaQa6eE5xUp4lklopYJaKn5gF6hQV/sKkISkJ3FvR9Gyn/rOODar02ANTuDe3fg==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"11.3.0","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"23.8.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.14.0","@tryghost/content-api":"^1.12.0","@push.rocks/smartmatch":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.12.0","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.3.8","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ghost_2.0.0_1759914895498_0.43864821857575165","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@apiclient.xyz/ghost","version":"2.1.0","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@2.1.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"03296d9d75a3fc378ea0aacfcc7111b526c50d54","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-2.1.0.tgz","fileCount":36,"integrity":"sha512-TNYml7ljEoeSSCX5kuSbDdPmN1gF6F0RSt9QLSazRtPzcPIclDHsfbdEYYExCZgsZ86yMQg+uthtUCmoDCtUBg==","signatures":[{"sig":"MEUCIQDwDToEzHgVbdDgWeCSk70PB9KbNnSTcDDooy924pCqTwIgIJUuGojq0WeKkYhYQ//tVv/uRJokJB4f4xiLvTbg22E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132749},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-2.1.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/72e6ca3be7d938eb4625d9b7fc523bea/apiclient.xyz-ghost-2.1.0.tgz","_integrity":"sha512-TNYml7ljEoeSSCX5kuSbDdPmN1gF6F0RSt9QLSazRtPzcPIclDHsfbdEYYExCZgsZ86yMQg+uthtUCmoDCtUBg==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"11.3.0","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"23.8.0","browserslist":["last 1 chrome versions"],"dependencies":{"@tryghost/admin-api":"^1.14.0","@tryghost/content-api":"^1.12.0","@push.rocks/smartmatch":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.12.0","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.3.8","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ghost_2.1.0_1759917489054_0.43795521292485873","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@apiclient.xyz/ghost","version":"2.2.0","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@apiclient.xyz/ghost@2.2.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"dist":{"shasum":"68168662a96e2f55bc7fe5e92a863ec5fcb426c0","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-2.2.0.tgz","fileCount":48,"integrity":"sha512-5mn/xl3zrfXUfplMb7k9QYJG/i0QTXC0Ox4pRTHdBKyV/I/KcwtGrdNEgFmG3OGncM864JlwbrAQNlqNtBst7Q==","signatures":[{"sig":"MEQCIEaV2mEeV2DYNI4Ms8IJvlfKZ2ZIssCrCLDfDYZYuzgSAiACWvWWVzsZaUOTFidXoD67lJ8YaB6gnTGH1vi1Qq/JSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208426},"main":"dist_ts/index.js","type":"module","_from":"file:apiclient.xyz-ghost-2.2.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/df2beec1a96f616d2ead41b591ebe938/apiclient.xyz-ghost-2.2.0.tgz","_integrity":"sha512-5mn/xl3zrfXUfplMb7k9QYJG/i0QTXC0Ox4pRTHdBKyV/I/KcwtGrdNEgFmG3OGncM864JlwbrAQNlqNtBst7Q==","repository":{"url":"git+https://code.foss.global/apiclient.xyz/ghost.git","type":"git"},"_npmVersion":"11.3.0","description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","directories":{},"_nodeVersion":"23.8.0","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartmatch":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.12.0","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.3.8","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ghost_2.2.0_1760101061956_0.8342324481483305","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@apiclient.xyz/ghost","version":"2.2.1","private":false,"description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","main":"dist_ts/index.js","typings":"dist_ts/index.d.ts","type":"module","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","devDependencies":{"@git.zone/tsbuild":"^2.6.8","@git.zone/tsbundle":"^2.5.1","@git.zone/tsrun":"^1.3.3","@git.zone/tstest":"^2.4.2","@push.rocks/qenv":"^6.1.3","@push.rocks/tapbundle":"^6.0.3","@types/node":"^22.12.0"},"dependencies":{"@push.rocks/smartmatch":"^2.0.0"},"repository":{"type":"git","url":"git+https://code.foss.global/apiclient.xyz/ghost.git"},"bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","browserslist":["last 1 chrome versions"],"keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"scripts":{"test":"(tstest test/ --verbose)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"_id":"@apiclient.xyz/ghost@2.2.1","_integrity":"sha512-di49niVrfWkj+aKsGgoxW+4AkruABtNzVN/J4Lm95ABrtedjdgGSwpV5iMemMJvXTjf5TWYbqSpEAzV/PWPSCQ==","_resolved":"/tmp/51a95aab307210d58cad4ecb4bd903b6/apiclient.xyz-ghost-2.2.1.tgz","_from":"file:apiclient.xyz-ghost-2.2.1.tgz","_nodeVersion":"23.8.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-di49niVrfWkj+aKsGgoxW+4AkruABtNzVN/J4Lm95ABrtedjdgGSwpV5iMemMJvXTjf5TWYbqSpEAzV/PWPSCQ==","shasum":"0926e9e1e613a7f15cfa68657f6fcd0ffefeccdb","tarball":"https://registry.npmjs.org/@apiclient.xyz/ghost/-/ghost-2.2.1.tgz","fileCount":48,"unpackedSize":220015,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAepkbdRHJFQ//1Z9JJqX4BZjGX7hBj7Axli6ZHX/Ij/AiAXGkPKsO9DSpJZ5KpKSlhF/7l6h3Csmnamyjem0GHhqA=="}]},"_npmUser":{"name":"lossless","email":"hello@lossless.com"},"directories":{},"maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ghost_2.2.1_1760163415615_0.37055120024487076"},"_hasShrinkwrap":false}},"time":{"created":"2024-07-01T14:32:46.434Z","modified":"2025-10-11T06:16:56.030Z","1.0.2":"2024-07-01T14:32:46.715Z","1.0.3":"2024-07-01T14:34:34.400Z","1.3.0":"2025-10-07T13:55:11.021Z","1.4.1":"2025-10-07T14:32:04.412Z","2.0.0":"2025-10-08T09:14:55.739Z","2.1.0":"2025-10-08T09:58:09.274Z","2.2.0":"2025-10-10T12:57:42.146Z","2.2.1":"2025-10-11T06:16:55.806Z"},"bugs":{"url":"https://code.foss.global/apiclient.xyz/ghost/issues"},"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","homepage":"https://code.foss.global/apiclient.xyz/ghost#readme","keywords":["Ghost CMS","API client","content management","admin API","content API","TypeScript","post management","blog management"],"repository":{"type":"git","url":"git+https://code.foss.global/apiclient.xyz/ghost.git"},"description":"An unofficial Ghost CMS API package enabling content and admin functionality for managing posts.","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"readme":"# @apiclient.xyz/ghost 👻\n\n> The **unofficial** TypeScript-first Ghost CMS API client that actually makes sense\n\nA modern, fully-typed API client for Ghost CMS that wraps both the Content and Admin APIs into an elegant, developer-friendly interface. Built with TypeScript, designed for humans.\n\n## ✨ What Makes This Different?\n\nUnlike the official Ghost SDK, this library gives you:\n\n- **One unified client** instead of juggling separate Content and Admin API instances\n- **Class-based models** with helper methods instead of raw JSON objects\n- **Built-in JWT generation** so you don't need to handle tokens manually\n- **Pattern matching** with minimatch for flexible filtering\n- **Multi-instance sync** for managing content across staging/production environments\n- **Complete tag support** including tags with zero posts (Content API limitation bypassed)\n- **Universal runtime support** - works in Node.js, Deno, Bun, and browsers without different packages\n\n## 🚀 Why This Library?\n\n- **🎯 TypeScript Native** - Full type safety for all Ghost API operations with comprehensive interfaces\n- **🔥 Dual API Support** - Unified interface for both Content and Admin APIs, seamlessly integrated\n- **⚡ Modern Async/Await** - No callback hell, just clean promises and elegant async patterns\n- **🌐 Universal Compatibility** - Native fetch implementation works in Node.js, Deno, Bun, and browsers\n- **🎨 Elegant API** - Intuitive methods that match your mental model, not Ghost's quirks\n- **🔍 Smart Filtering** - Built-in minimatch support for flexible pattern-based queries\n- **🏷️ Complete Tag Support** - Fetch ALL tags (including zero-count), filter by visibility (internal/external)\n- **🔄 Multi-Instance Sync** - Synchronize content across multiple Ghost sites with built-in safety checks\n- **📅 ISO 8601 Dates** - All dates are properly formatted ISO 8601 strings with timezone support\n- **🛡️ Built-in JWT Generation** - Automatic JWT token handling for Admin API authentication\n- **💪 Production Ready** - Battle-tested with 139+ comprehensive tests across Node.js and Deno\n\n## 📖 Table of Contents\n\n- [Installation](#-installation)\n- [Quick Start](#-quick-start)\n- [Core API](#-core-api)\n  - [Posts](#-posts)\n  - [Pages](#-pages)\n  - [Tags](#️-tags)\n  - [Authors](#-authors)\n  - [Members](#-members)\n  - [Webhooks](#-webhooks)\n  - [Image Upload](#️-image-upload)\n- [Multi-Instance Synchronization](#-multi-instance-synchronization)\n- [Complete Example](#-complete-example)\n- [Performance & Best Practices](#-performance--best-practices)\n- [Error Handling](#-error-handling)\n- [API Reference](#-api-reference)\n- [TypeScript Support](#-typescript-support)\n- [Testing](#-testing)\n\n## 📦 Installation\n\n```bash\nnpm install @apiclient.xyz/ghost\n```\n\nOr with pnpm:\n\n```bash\npnpm install @apiclient.xyz/ghost\n```\n\n## 🎯 Quick Start\n\n```typescript\nimport { Ghost } from '@apiclient.xyz/ghost';\n\nconst ghost = new Ghost({\n  baseUrl: 'https://your-ghost-site.com',\n  contentApiKey: 'your_content_api_key',  // Optional: only needed for reading\n  adminApiKey: 'your_admin_api_key'       // Required for write operations\n});\n\n// Read posts\nconst posts = await ghost.getPosts({ limit: 10 });\nposts.forEach(post => console.log(post.getTitle()));\n\n// Create a post\nconst newPost = await ghost.createPost({\n  title: 'Hello World',\n  html: '<p>My first post!</p>',\n  status: 'published'\n});\n\n// Update it\nawait newPost.update({\n  title: 'Hello World - Updated!'\n});\n```\n\nThat's it. No complicated setup, no boilerplate. Just pure Ghost API goodness. 🎉\n\n## 📚 Core API\n\n### 🔑 Authentication & Setup\n\nInitialize the Ghost client with your API credentials:\n\n```typescript\nconst ghost = new Ghost({\n  baseUrl: 'https://your-ghost-site.com',\n  contentApiKey: 'your_content_api_key',  // For reading public content\n  adminApiKey: 'your_admin_api_key'       // For write operations\n});\n```\n\n## 📝 Posts\n\n### Get All Posts\n\n```typescript\nconst posts = await ghost.getPosts();\n\nposts.forEach(post => {\n  console.log(post.getTitle());\n  console.log(post.getExcerpt());\n  console.log(post.getFeatureImage());\n});\n```\n\n### Filter Posts\n\n```typescript\nconst techPosts = await ghost.getPosts({ \n  tag: 'technology',\n  limit: 10 \n});\n\nconst featuredPosts = await ghost.getPosts({ \n  featured: true,\n  limit: 5 \n});\n\nconst authorPosts = await ghost.getPosts({ \n  author: 'john-doe' \n});\n```\n\n### Get Single Post\n\n```typescript\nconst post = await ghost.getPostById('post-id');\nconsole.log(post.getTitle());\nconsole.log(post.getHtml());\nconsole.log(post.getAuthor());\n```\n\n### Create Post\n\n```typescript\nconst newPost = await ghost.createPost({\n  title: 'My Awesome Post',\n  html: '<p>This is the content of my post.</p>',\n  feature_image: 'https://example.com/image.jpg',\n  tags: [{ id: 'tag-id' }],\n  excerpt: 'A brief summary of the post'\n});\n```\n\nOr create from HTML specifically:\n\n```typescript\nconst post = await ghost.createPostFromHtml({\n  title: 'My HTML Post',\n  html: '<p>Content here</p>'\n});\n```\n\n### Update Post\n\n```typescript\nconst post = await ghost.getPostById('post-id');\nawait post.update({\n  ...post.toJson(),\n  title: 'Updated Title',\n  html: '<p>Updated content</p>'\n});\n```\n\n### Delete Post\n\n```typescript\nconst post = await ghost.getPostById('post-id');\nawait post.delete();\n```\n\n### Search Posts\n\nFull-text search across post titles:\n\n```typescript\nconst results = await ghost.searchPosts('typescript tutorial', { limit: 10 });\nresults.forEach(post => console.log(post.getTitle()));\n```\n\n### Related Posts\n\nGet posts with similar tags:\n\n```typescript\nconst post = await ghost.getPostById('post-id');\nconst related = await ghost.getRelatedPosts(post.getId(), 5);\nrelated.forEach(p => console.log(`Related: ${p.getTitle()}`));\n```\n\n### Bulk Operations\n\n```typescript\nawait ghost.bulkUpdatePosts(['id1', 'id2', 'id3'], {\n  featured: true\n});\n\nawait ghost.bulkDeletePosts(['id4', 'id5', 'id6']);\n```\n\n## 📄 Pages\n\nPages work similarly to posts but are for static content:\n\n```typescript\nconst pages = await ghost.getPages();\n\nconst aboutPage = await ghost.getPageBySlug('about');\nconsole.log(aboutPage.getHtml());\n\nconst newPage = await ghost.createPage({\n  title: 'Contact',\n  html: '<p>Contact information...</p>'\n});\n\nawait newPage.update({\n  html: '<p>Updated content</p>'\n});\n\nawait newPage.delete();\n```\n\nFilter pages with minimatch patterns:\n\n```typescript\nconst filteredPages = await ghost.getPages({ \n  filter: 'about*',\n  limit: 10 \n});\n```\n\n## 🏷️ Tags\n\n### Get All Tags\n\n```typescript\n// Get ALL tags (including those with zero posts)\nconst tags = await ghost.getTags();\ntags.forEach(tag => console.log(`${tag.name} (${tag.slug})`));\n```\n\n**Note**: Uses Admin API to fetch ALL tags, including tags with zero posts. Previous versions using Content API would omit tags with no associated content.\n\n### Filter by Visibility\n\nGhost supports two tag types:\n- **Public tags**: Standard tags visible to readers\n- **Internal tags**: Tags prefixed with `#` for internal organization (not visible publicly)\n\n```typescript\n// Get only public tags\nconst publicTags = await ghost.getPublicTags();\n\n// Get only internal tags (e.g., #feature, #urgent)\nconst internalTags = await ghost.getInternalTags();\n\n// Get all tags with explicit visibility filter\nconst publicTags = await ghost.getTags({ visibility: 'public' });\nconst internalTags = await ghost.getTags({ visibility: 'internal' });\nconst allTags = await ghost.getTags({ visibility: 'all' }); // default\n```\n\n### Filter Tags with Minimatch\n\n```typescript\nconst techTags = await ghost.getTags({ filter: 'tech-*' });\nconst blogTags = await ghost.getTags({ filter: '*blog*' });\n\n// Combine visibility and pattern filtering\nconst internalNews = await ghost.getTags({\n  filter: 'news-*',\n  visibility: 'internal'\n});\n```\n\n### Get Single Tag\n\n```typescript\nconst tag = await ghost.getTagBySlug('javascript');\nconsole.log(tag.getName());\nconsole.log(tag.getDescription());\nconsole.log(tag.getVisibility()); // 'public' or 'internal'\n\n// Check visibility\nif (tag.isInternal()) {\n  console.log('This is an internal tag');\n}\n```\n\n### Create, Update, Delete Tags\n\n```typescript\n// Create a public tag\nconst newTag = await ghost.createTag({\n  name: 'TypeScript',\n  slug: 'typescript',\n  description: 'All about TypeScript',\n  visibility: 'public'\n});\n\n// Create an internal tag (note the # prefix)\nconst internalTag = await ghost.createTag({\n  name: '#feature',\n  slug: 'hash-feature',\n  visibility: 'internal'\n});\n\n// Update tag\nawait newTag.update({\n  description: 'Everything TypeScript related'\n});\n\n// Delete tag (now works reliably!)\nawait newTag.delete();\n```\n\n## 👤 Authors\n\n### Get Authors\n\n```typescript\nconst authors = await ghost.getAuthors();\nauthors.forEach(author => {\n  console.log(`${author.getName()} (${author.getSlug()})`);\n});\n```\n\n### Filter Authors\n\n```typescript\nconst filteredAuthors = await ghost.getAuthors({ \n  filter: 'j*',\n  limit: 10 \n});\n```\n\n### Get Single Author\n\n```typescript\nconst author = await ghost.getAuthorBySlug('john-doe');\nconsole.log(author.getBio());\nconsole.log(author.getProfileImage());\n```\n\n### Update Author\n\n```typescript\nawait author.update({\n  bio: 'Updated bio information',\n  website: 'https://johndoe.com'\n});\n```\n\n## 👥 Members\n\nManage your Ghost site members (requires Ghost membership features):\n\n### Get Members\n\n```typescript\nconst members = await ghost.getMembers({ limit: 100 });\nmembers.forEach(member => {\n  console.log(`${member.getName()} - ${member.getEmail()}`);\n  console.log(`Status: ${member.getStatus()}`);\n});\n```\n\n### Filter Members\n\n```typescript\nconst gmailMembers = await ghost.getMembers({ \n  filter: '*@gmail.com' \n});\n```\n\n### Get Single Member\n\n```typescript\nconst member = await ghost.getMemberByEmail('user@example.com');\nconsole.log(member.getStatus());\nconsole.log(member.getLabels());\n```\n\n### Create Member\n\n```typescript\nconst newMember = await ghost.createMember({\n  email: 'newuser@example.com',\n  name: 'New User',\n  note: 'VIP member'\n});\n```\n\n### Update and Delete Members\n\n```typescript\nawait member.update({\n  name: 'Updated Name',\n  note: 'Premium member'\n});\n\nawait member.delete();\n```\n\n## 🪝 Webhooks\n\nManage webhooks for Ghost events:\n\n```typescript\nconst webhook = await ghost.createWebhook({\n  event: 'post.published',\n  target_url: 'https://example.com/webhook',\n  name: 'Post Published Webhook'\n});\n\nawait ghost.updateWebhook(webhook.id, {\n  target_url: 'https://example.com/new-webhook'\n});\n\nawait ghost.deleteWebhook(webhook.id);\n```\n\n**Note:** The Ghost Admin API only supports creating, updating, and deleting webhooks. Browsing and reading individual webhooks are not supported by the underlying SDK.\n\n## 🖼️ Image Upload\n\nUpload images to your Ghost site:\n\n```typescript\nconst imageUrl = await ghost.uploadImage('/path/to/image.jpg');\n\nawait ghost.createPost({\n  title: 'Post with Image',\n  html: '<p>Content here</p>',\n  feature_image: imageUrl\n});\n```\n\n## 🔄 Multi-Instance Synchronization\n\nThe `SyncedInstance` class enables you to synchronize content across multiple Ghost instances - perfect for staging environments, multi-region deployments, or content distribution.\n\n**Key Features:**\n- 🔒 **Same-Instance Protection** - Automatically prevents circular syncs that would cause excessive API calls\n- 🏷️ **Slug Congruence** - Ensures slugs remain consistent across all synced instances\n- 🗺️ **ID Mapping** - Tracks source-to-target ID mappings for efficient updates\n- 📊 **Detailed Reporting** - Get comprehensive sync reports with success/failure counts\n\n### Setup\n\n```typescript\nimport { Ghost, SyncedInstance } from '@apiclient.xyz/ghost';\n\nconst sourceGhost = new Ghost({\n  baseUrl: 'https://source.ghost.com',\n  contentApiKey: 'source_content_key',\n  adminApiKey: 'source_admin_key'\n});\n\nconst targetGhost1 = new Ghost({\n  baseUrl: 'https://target1.ghost.com',\n  contentApiKey: 'target1_content_key',\n  adminApiKey: 'target1_admin_key'\n});\n\nconst targetGhost2 = new Ghost({\n  baseUrl: 'https://target2.ghost.com',\n  contentApiKey: 'target2_content_key',\n  adminApiKey: 'target2_admin_key'\n});\n\n// This will throw an error if you accidentally try to sync an instance to itself\nconst synced = new SyncedInstance(sourceGhost, [targetGhost1, targetGhost2]);\n```\n\n**Safety Note:** SyncedInstance validates that the source and target instances are different. Attempting to sync an instance to itself will throw an error immediately, preventing circular syncs and rate limit issues.\n\n### Sync Content\n\n```typescript\nconst tagReport = await synced.syncTags();\nconsole.log(`Synced ${tagReport.totalItems} tags`);\nconsole.log(`Duration: ${tagReport.duration}ms`);\n\nconst postReport = await synced.syncPosts();\nconsole.log(`Success: ${postReport.targetReports[0].successCount}`);\nconsole.log(`Failed: ${postReport.targetReports[0].failureCount}`);\n\nconst pageReport = await synced.syncPages();\n```\n\n### Sync Options\n\n```typescript\nconst report = await synced.syncPosts({\n  filter: 'featured-*',\n  dryRun: true,\n  incremental: true\n});\n\nreport.targetReports.forEach(targetReport => {\n  console.log(`Target: ${targetReport.targetUrl}`);\n  targetReport.results.forEach(result => {\n    console.log(`  ${result.sourceSlug}: ${result.status}`);\n  });\n});\n```\n\n### Sync Everything\n\n```typescript\nconst reports = await synced.syncAll({\n  types: ['tags', 'posts', 'pages'],\n  syncOptions: {\n    dryRun: false\n  }\n});\n\nreports.forEach(report => {\n  console.log(`${report.contentType}: ${report.totalItems} items`);\n});\n```\n\n### Sync Status & History\n\n```typescript\nconst status = synced.getSyncStatus();\nconsole.log(`Total mappings: ${status.totalMappings}`);\nconsole.log(`Recent syncs: ${status.recentSyncs.length}`);\n\nstatus.mappings.forEach(mapping => {\n  console.log(`Source: ${mapping.sourceSlug}`);\n  mapping.targetMappings.forEach(tm => {\n    console.log(`  -> ${tm.targetUrl} (${tm.targetId})`);\n  });\n});\n\nsynced.clearSyncHistory();\nsynced.clearMappings();\n```\n\n## 🎨 Complete Example\n\nHere's a comprehensive example showing various operations:\n\n```typescript\nimport { Ghost, SyncedInstance } from '@apiclient.xyz/ghost';\n\nconst ghost = new Ghost({\n  baseUrl: 'https://your-ghost-site.com',\n  contentApiKey: 'your_content_key',\n  adminApiKey: 'your_admin_key'\n});\n\nasync function createBlogPost() {\n  // Upload a feature image\n  const imageUrl = await ghost.uploadImage('./banner.jpg');\n\n  // Create a tag for categorization\n  const tag = await ghost.createTag({\n    name: 'Tutorial',\n    slug: 'tutorial',\n    description: 'Step-by-step guides',\n    visibility: 'public'\n  });\n\n  // Create a comprehensive blog post\n  const post = await ghost.createPost({\n    title: 'Getting Started with Ghost CMS',\n    slug: 'getting-started-ghost-cms',\n    html: '<h1>Welcome</h1><p>This is an introduction to Ghost CMS...</p>',\n    feature_image: imageUrl,\n    tags: [{ id: tag.getId() }],\n    featured: true,\n    status: 'published',\n    meta_title: 'Getting Started with Ghost CMS | Tutorial',\n    meta_description: 'Learn how to get started with Ghost CMS in this comprehensive guide',\n    custom_excerpt: 'A beginner-friendly guide to Ghost CMS'\n  });\n\n  console.log(`✅ Created post: ${post.getTitle()}`);\n  console.log(`📅 Published at: ${post.postData.published_at}`);\n\n  // Find related content\n  const related = await ghost.getRelatedPosts(post.getId(), 5);\n  console.log(`🔗 Found ${related.length} related posts`);\n\n  // Search functionality\n  const searchResults = await ghost.searchPosts('getting started', { limit: 10 });\n  console.log(`🔍 Search found ${searchResults.length} posts`);\n\n  // Get all public tags\n  const publicTags = await ghost.getPublicTags();\n  console.log(`🏷️  Public tags: ${publicTags.length}`);\n\n  return post;\n}\n\nasync function syncToStaging() {\n  // Sync content to staging environment\n  const production = new Ghost({\n    baseUrl: 'https://production.ghost.com',\n    adminApiKey: process.env.PROD_ADMIN_KEY,\n    contentApiKey: process.env.PROD_CONTENT_KEY\n  });\n\n  const staging = new Ghost({\n    baseUrl: 'https://staging.ghost.com',\n    adminApiKey: process.env.STAGING_ADMIN_KEY,\n    contentApiKey: process.env.STAGING_CONTENT_KEY\n  });\n\n  const synced = new SyncedInstance(production, [staging]);\n\n  // Sync everything\n  const reports = await synced.syncAll({\n    types: ['tags', 'posts', 'pages']\n  });\n\n  reports.forEach(report => {\n    console.log(`✅ Synced ${report.totalItems} ${report.contentType} in ${report.duration}ms`);\n  });\n}\n\n// Run the examples\ncreateBlogPost().catch(console.error);\n// syncToStaging().catch(console.error);\n```\n\n## ⚡ Performance & Best Practices\n\n### Rate Limiting\n\nGhost enforces rate limits on API requests (~100 requests per IP per hour for Admin API). Keep these tips in mind:\n\n```typescript\n// ✅ Good: Batch operations\nawait ghost.bulkUpdatePosts(['id1', 'id2', 'id3'], { featured: true });\n\n// ❌ Bad: Individual requests in a loop\nfor (const id of postIds) {\n  await ghost.getPostById(id).then(p => p.update({ featured: true }));\n}\n\n// ✅ Good: Use pagination efficiently\nconst posts = await ghost.getPosts({ limit: 15 });\n\n// ✅ Good: Filter on the server side\nconst featuredPosts = await ghost.getPosts({ featured: true, limit: 10 });\n```\n\n### Multi-Instance Sync Safety\n\nThe library automatically prevents common pitfalls:\n\n```typescript\n// ✅ This works - different instances\nconst synced = new SyncedInstance(sourceGhost, [targetGhost]);\n\n// ❌ This throws an error - prevents circular sync!\nconst synced = new SyncedInstance(ghost, [ghost]); // Error: Cannot sync to same instance\n```\n\n### Content API vs Admin API\n\n- **Content API**: Read-only, public content, no authentication required (with Content API key)\n- **Admin API**: Full read/write access, requires Admin API key\n- **Tags**: This library uses Admin API for tags to fetch ALL tags (Content API only returns tags with posts)\n\n### Dry Run Mode\n\nTest your sync operations without making changes:\n\n```typescript\nconst report = await synced.syncAll({\n  types: ['posts', 'pages', 'tags'],\n  syncOptions: {\n    dryRun: true  // Preview changes without applying them\n  }\n});\n\nconsole.log(`Would sync ${report[0].totalItems} items`);\n```\n\n## 🔒 Error Handling\n\nAll methods throw errors that you can catch and handle:\n\n```typescript\ntry {\n  const post = await ghost.getPostById('invalid-id');\n} catch (error) {\n  console.error('Failed to fetch post:', error);\n}\n\ntry {\n  await post.update({ title: 'New Title' });\n} catch (error) {\n  console.error('Failed to update post:', error);\n}\n```\n\n## 📖 API Reference\n\n### Ghost Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getPosts(options?)` | Get all posts with optional filtering | `Promise<Post[]>` |\n| `getPostById(id)` | Get a single post by ID | `Promise<Post>` |\n| `createPost(data)` | Create a new post | `Promise<Post>` |\n| `createPostFromHtml(data)` | Create post from HTML | `Promise<Post>` |\n| `searchPosts(query, options?)` | Search posts by title | `Promise<Post[]>` |\n| `getRelatedPosts(postId, limit)` | Get related posts | `Promise<Post[]>` |\n| `bulkUpdatePosts(ids, updates)` | Update multiple posts | `Promise<Post[]>` |\n| `bulkDeletePosts(ids)` | Delete multiple posts | `Promise<void>` |\n| `getPages(options?)` | Get all pages | `Promise<Page[]>` |\n| `getPageById(id)` | Get page by ID | `Promise<Page>` |\n| `getPageBySlug(slug)` | Get page by slug | `Promise<Page>` |\n| `createPage(data)` | Create a new page | `Promise<Page>` |\n| `getTags(options?)` | Get all tags (including zero-count) | `Promise<ITag[]>` |\n| `getPublicTags(options?)` | Get only public tags | `Promise<ITag[]>` |\n| `getInternalTags(options?)` | Get only internal tags | `Promise<ITag[]>` |\n| `getTagById(id)` | Get tag by ID | `Promise<Tag>` |\n| `getTagBySlug(slug)` | Get tag by slug | `Promise<Tag>` |\n| `createTag(data)` | Create a new tag | `Promise<Tag>` |\n| `getAuthors(options?)` | Get all authors | `Promise<Author[]>` |\n| `getAuthorById(id)` | Get author by ID | `Promise<Author>` |\n| `getAuthorBySlug(slug)` | Get author by slug | `Promise<Author>` |\n| `getMembers(options?)` | Get all members | `Promise<Member[]>` |\n| `getMemberById(id)` | Get member by ID | `Promise<Member>` |\n| `getMemberByEmail(email)` | Get member by email | `Promise<Member>` |\n| `createMember(data)` | Create a new member | `Promise<Member>` |\n| `createWebhook(data)` | Create a webhook | `Promise<any>` |\n| `updateWebhook(id, data)` | Update a webhook | `Promise<any>` |\n| `deleteWebhook(id)` | Delete a webhook | `Promise<void>` |\n| `uploadImage(filePath)` | Upload an image | `Promise<string>` |\n\n### Post Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getId()` | Get post ID | `string` |\n| `getTitle()` | Get post title | `string` |\n| `getHtml()` | Get post HTML content | `string` |\n| `getExcerpt()` | Get post excerpt | `string` |\n| `getFeatureImage()` | Get feature image URL | `string \\| undefined` |\n| `getAuthor()` | Get primary author | `IAuthor` |\n| `toJson()` | Get raw post data | `IPost` |\n| `update(data)` | Update the post | `Promise<Post>` |\n| `delete()` | Delete the post | `Promise<void>` |\n\n### Page Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getId()` | Get page ID | `string` |\n| `getTitle()` | Get page title | `string` |\n| `getHtml()` | Get page HTML content | `string` |\n| `getSlug()` | Get page slug | `string` |\n| `getFeatureImage()` | Get feature image URL | `string \\| undefined` |\n| `getAuthor()` | Get primary author | `IAuthor` |\n| `toJson()` | Get raw page data | `IPage` |\n| `update(data)` | Update the page | `Promise<Page>` |\n| `delete()` | Delete the page | `Promise<void>` |\n\n### Tag Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getId()` | Get tag ID | `string` |\n| `getName()` | Get tag name | `string` |\n| `getSlug()` | Get tag slug | `string` |\n| `getDescription()` | Get tag description | `string \\| undefined` |\n| `getVisibility()` | Get tag visibility | `string` |\n| `isInternal()` | Check if tag is internal | `boolean` |\n| `isPublic()` | Check if tag is public | `boolean` |\n| `toJson()` | Get raw tag data | `ITag` |\n| `update(data)` | Update the tag | `Promise<Tag>` |\n| `delete()` | Delete the tag | `Promise<void>` |\n\n### Author Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getId()` | Get author ID | `string` |\n| `getName()` | Get author name | `string` |\n| `getSlug()` | Get author slug | `string` |\n| `getProfileImage()` | Get profile image URL | `string \\| undefined` |\n| `getBio()` | Get author bio | `string \\| undefined` |\n| `toJson()` | Get raw author data | `IAuthor` |\n| `update(data)` | Update the author | `Promise<Author>` |\n\n### Member Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `getId()` | Get member ID | `string` |\n| `getEmail()` | Get member email | `string` |\n| `getName()` | Get member name | `string \\| undefined` |\n| `getStatus()` | Get member status | `string \\| undefined` |\n| `getLabels()` | Get member labels | `Array \\| undefined` |\n| `toJson()` | Get raw member data | `IMember` |\n| `update(data)` | Update the member | `Promise<Member>` |\n| `delete()` | Delete the member | `Promise<void>` |\n\n### SyncedInstance Class\n\n| Method | Description | Returns |\n|--------|-------------|---------|\n| `syncPosts(options?)` | Sync posts to targets | `Promise<ISyncReport>` |\n| `syncPages(options?)` | Sync pages to targets | `Promise<ISyncReport>` |\n| `syncTags(options?)` | Sync tags to targets | `Promise<ISyncReport>` |\n| `syncAll(options?)` | Sync all content types | `Promise<ISyncReport[]>` |\n| `getSyncStatus()` | Get sync status & mappings | `Object` |\n| `clearSyncHistory()` | Clear sync history | `void` |\n| `clearMappings()` | Clear ID mappings | `void` |\n\n## 🧪 Testing\n\n```bash\npnpm test\n```\n\n## 📝 TypeScript Support\n\nThis library is written in TypeScript and provides full type definitions out of the box. No `@types/*` package needed.\n\n```typescript\nimport type { IPost, ITag, IAuthor, IMember, IPage } from '@apiclient.xyz/ghost';\n```\n\n### Date Handling\n\nAll date fields (`created_at`, `updated_at`, `published_at`) are returned as ISO 8601 formatted strings with timezone information:\n\n```typescript\nconst post = await ghost.getPostById('post-id');\n\n// Date strings are in ISO 8601 format: \"2025-10-10T13:54:44.000-04:00\"\nconsole.log(post.postData.created_at);    // string\nconsole.log(post.postData.updated_at);    // string\nconsole.log(post.postData.published_at);  // string\n\n// Parse them to Date objects if needed\nconst publishedDate = new Date(post.postData.published_at);\nconsole.log(publishedDate.toISOString());\n```\n\n**Note:** Ghost automatically manages `updated_at` timestamps. When you update metadata fields (title, status, tags, etc.), Ghost updates this timestamp. HTML-only updates may not always change `updated_at`.\n\n## 🐛 Issues & Feedback\n\nFound a bug or have a feature request?\n\nRepository: [https://code.foss.global/apiclient.xyz/ghost](https://code.foss.global/apiclient.xyz/ghost)\n\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. **Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH  \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n","readmeFilename":"readme.md"}