{"_id":"@codesocietyou/contentedge-cms-sdk","_rev":"13-353b0ca7a47014627ec099bc0b0f314a","name":"@codesocietyou/contentedge-cms-sdk","dist-tags":{"latest":"2.0.0"},"versions":{"0.2.2":{"name":"@codesocietyou/contentedge-cms-sdk","version":"0.2.2","keywords":["content","cms","sdk","typescript","keycloak"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@0.2.2","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"64d2190a4e595fc2b63be5e721467d7664de5e6c","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-0.2.2.tgz","fileCount":3,"integrity":"sha512-AdVVHJ8wuEHI3MO2SAYoUELUf/TMt2rk/2FSB40PlXdQ9arjjIHKgojvCSA11BM1FW++sqhl6J3/z+OixJukLw==","signatures":[{"sig":"MEUCIQDa6TkKYj0gVVXMMPZN1A8rOqOCxTmQfzCkl2tbD4flmAIgJS7dffNUzPHUNCyEkP0nPzcydutaQSORJt+3x3OXPgY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10516},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"03c09f61e19bd7aa3656a390630955e0b2cc56e2","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsup","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.6.1","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","vite":"^7.2.2","react":"^19.2.0","eslint":"^9.39.1","vitest":"^4.0.8","globals":"^16.5.0","react-dom":"^19.2.0","@eslint/js":"^9.39.1","typescript":"~5.9.3","@types/node":"^24.10.0","@types/react":"^19.2.2","@changesets/cli":"^2.29.7","@types/react-dom":"^19.2.2","typescript-eslint":"^8.46.4","@vitest/coverage-v8":"^4.0.8","@vitejs/plugin-react":"^5.1.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.24"},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_0.2.2_1762919185607_0.6167667776209151","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.0","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.0","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"ff507ed0d77affd7dbc158db9c409d3ee89448ff","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.0.tgz","fileCount":3,"integrity":"sha512-k7ClWcs8AKvFQJJ+JROWXNLUDVPGf48rQyndaFz7PPCqECTtOiI4JdYOQk+X7/FF3pWROfndQgYSUNGMl1RiPQ==","signatures":[{"sig":"MEYCIQC399jCWb8jhyvyeFNNC+sijFE0oUCbjqn6bDLz81m6JAIhAOf31III+pbccGI9Ggrx1zSb+nvlP4bxHADInmlSQ+pg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14516},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3b686cb6f05f42439a6be6b873f880e31c65abb3","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.4","eslint":"^10.0.0","tsdown":"^0.3.0","vitest":"^4.0.18","globals":"^17.3.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"~5.9.3","@types/node":"^25.2.3","@types/react":"^19.2.14","@changesets/cli":"^2.29.8","@types/react-dom":"^19.2.3","typescript-eslint":"8.55.1-alpha.4","@vitest/coverage-v8":"^4.0.18","@vitejs/plugin-react":"^5.1.4","@tanstack/react-query":"^5.90.21"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.0_1771110017145_0.9131027361722104","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.1","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.1","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"5cd57aabe2c3086dbaed5884bb98c8d44e6eb792","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.1.tgz","fileCount":7,"integrity":"sha512-JM0SwRdCAnghIWfwqOGO2jPIuo0aoQec/h2Xf4QgIT9+Ytf/AspUeY4uqcUvuYgzgFJCHRdgu9aNsYNQkz3BLQ==","signatures":[{"sig":"MEUCIH5C4wfLvFRA4v09SxDtybX4iSTaneme7FkdxXtLxM4iAiEAtc3ATeYGa2fOQpW00drfuehJIg6IS8+XqgUgFj25OZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90605},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"6b5d26d1874a65f6a536ae585ac99b334dce8efd","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.4","eslint":"^10.0.0","tsdown":"^0.3.0","vitest":"^4.0.18","globals":"^17.3.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"~5.9.3","@types/node":"^25.2.3","@types/react":"^19.2.14","@changesets/cli":"^2.29.8","@types/react-dom":"^19.2.3","typescript-eslint":"8.55.1-alpha.4","@vitest/coverage-v8":"^4.0.18","@vitejs/plugin-react":"^5.1.4","@tanstack/react-query":"^5.90.21"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.1_1775127123874_0.19259765056508438","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.3","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.3","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"7f94e6394317a46ff593fd182d6f64fdbbbe530a","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.3.tgz","fileCount":9,"integrity":"sha512-pfOAt8IPhivoJAruiw1YiV7vXyvgBSdtuVTsZDF6tR0GANwWRTc6053QW8NT/mFygcG5JM0bl3BisaHE/RcyWg==","signatures":[{"sig":"MEUCIGjuhD2fUsKpwITnUBOXOdlcRCguZVCjxonObNWFUiADAiEA5eFQV9bjzbVZuXje93G7FKnbkQgON59S8zK5smwBHZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":245873},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"0532a04b2aaea3a1799527e27386b32dd7f585ff","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.15.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.4","eslint":"^10.0.0","tsdown":"^0.21.10","vitest":"^4.0.18","globals":"^17.3.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.2.3","@types/react":"^19.2.14","@changesets/cli":"^2.29.8","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.0.18","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.90.21"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.3_1777591845094_0.8497170769818385","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.4","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.4","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"542f2e69e301efc02a0e02289e565414ecab36d9","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.4.tgz","fileCount":9,"integrity":"sha512-oi+qXg9xpbxEnA6pei4JRk8Z974+ZuRaV5DL9g3HHD2sydExhyuxI6ykNb3wVqXxBUgaCUWX+DKEstK8N3zirg==","signatures":[{"sig":"MEUCIGe44cVcqHXjsOu0G6OsPOzT6mzjm6eohdNUQhDSy/PeAiEApVL7LRluuFU4axA8QIXKaRww2GqtH5/7KRohEFII3g4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":245910},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"23521e93f0f2f3d39d68d1fce72ce25f3528bf7f","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.5","eslint":"^10.2.1","tsdown":"^0.21.10","vitest":"^4.1.5","globals":"^17.5.0","react-dom":"^19.2.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@changesets/cli":"^2.31.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.1.5","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.100.6"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.4_1777593153926_0.7950793417513202","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.5","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.5","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"df87a27ebcf9d99718ca842e4b62ef147341ce32","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.5.tgz","fileCount":9,"integrity":"sha512-NPjfyZWfNFWlWs6Gj4efE7sNz0xELAgEKxStkcEnp84MoxxYC3S8jGP+cvkEyn00VNTw8EtVkJttWa7/w4dwWQ==","signatures":[{"sig":"MEUCIQDfuQelERUB1dsybra5g43YQtmqJH5oct+fFZT1g6raegIgbXEnfQceBGS13eyk08nVAA+kkOGFC30e1TVwRrvZNZ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":246011},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"ea409dac9d97ed53c5e3a742220b2dab23ef1a57","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.5","eslint":"^10.2.1","tsdown":"^0.21.10","vitest":"^4.1.5","globals":"^17.5.0","react-dom":"^19.2.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@changesets/cli":"^2.31.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.1.5","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.100.6"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.5_1777594377217_0.503200838644702","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.6","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.6","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"cdd7ed3195adccf1f751d8715dca5a05db90c6c0","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.6.tgz","fileCount":9,"integrity":"sha512-3E7NNwfsFV3e45jYYO/9g3/tzNmhM+KocCrYn8SW24+mGEU32BzXHJ9jjX7tStnIOkTk0Jo81NS06linOX0leg==","signatures":[{"sig":"MEQCIH+XX8Gn5WGHcc1LfqWgP6Vf9Xez8zN8qX4vLAO/ODJNAiBX/hJABnkKczMYv0BUiqBBvS9ewb2pqK4E9wP1H7NIPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":246013},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"31871a9b2e71f6b39ac2f00d349d3b0c9380962a","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown","preview":"vite preview","release":"changeset publish","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.5","eslint":"^10.2.1","tsdown":"^0.21.10","vitest":"^4.1.5","globals":"^17.5.0","react-dom":"^19.2.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@changesets/cli":"^2.31.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.1.5","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.100.6"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.6_1777595690624_0.38920848144132925","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.7","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.7","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"5899f159f2edce96ed3432fd7406983819e50b53","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.7.tgz","fileCount":10,"integrity":"sha512-DmIJO15D7o8gKSO2PelQ2k3K7+mvQ8HoMZgiWNX5Gh6dsicynFSfyL9/OIx9FFb4dHQpJ9kIobe+eohchqAs3Q==","signatures":[{"sig":"MEUCIFoLnJctVNsexuI33TXAeQHFsShul1GdyOgCWN0tWGU6AiEAtTa50b4JWWKWaLT56OJFi2Fq9NYhQBKGuwYySWtnKP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":246961},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"gitHead":"23dc85be444bdd0d9737d7d420153ebef43276a2","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown && npm run copy-css","preview":"vite preview","release":"changeset publish","copy-css":"node -e \"require('fs').cpSync('src/styles/richText.css','dist/styles.css')\"","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":["./dist/styles.css"],"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.5","eslint":"^10.2.1","tsdown":"^0.21.10","vitest":"^4.1.5","globals":"^17.5.0","react-dom":"^19.2.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@changesets/cli":"^2.31.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.1.5","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.100.6"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.7_1777599569380_0.650098407274748","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@codesocietyou/contentedge-cms-sdk","version":"1.0.8","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"author":{"name":"ContentEdge"},"license":"MIT","_id":"@codesocietyou/contentedge-cms-sdk@1.0.8","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"3309ba3b1bbea7a2a76527ca6515f761eee98bfa","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-1.0.8.tgz","fileCount":10,"integrity":"sha512-7mw5KR3zkRrqiuSja12SyuuyqqBKPQSCPNhrn0BWDalAlxYZpfuIyeLtwXcR3tGH8KpVi7HFZosqyWWtCAM33w==","signatures":[{"sig":"MEYCIQClhWHygAhrKPFLo9nN4MXx4aOeT7Drp2HbJPTCaowVxgIhAIUvddFT4i1zpoWRm041VBzzAdhwh4YdBVKs9O32FFXq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":247251},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"gitHead":"ed88cfcb88852ef1904142e2c343777538b93768","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown && npm run copy-css","preview":"vite preview","release":"changeset publish","copy-css":"node -e \"require('fs').cpSync('src/styles/richText.css','dist/styles.css')\"","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"sideEffects":["./dist/styles.css"],"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.13.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.10","react":"^19.2.5","eslint":"^10.2.1","tsdown":"^0.21.10","vitest":"^4.1.5","globals":"^17.5.0","react-dom":"^19.2.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@changesets/cli":"^2.31.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.59.1","@vitest/coverage-v8":"^4.1.5","@vitejs/plugin-react":"^6.0.1","@tanstack/react-query":"^5.100.6"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentedge-cms-sdk_1.0.8_1777660464741_0.7287324606830874","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"@codesocietyou/contentedge-cms-sdk@2.0.0","bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"dist":{"shasum":"a73f8cf29b90cf85a845992845f2ab300a9a5772","tarball":"https://registry.npmjs.org/@codesocietyou/contentedge-cms-sdk/-/contentedge-cms-sdk-2.0.0.tgz","fileCount":10,"integrity":"sha512-34Mcz1HODfYCMEzTl3rvlI+WGGrBvGPGBoZFYapb93+9Bm81b1d9ETbmLaRjuoGw4LlV4KGdW8UN5elhOwfXzw==","signatures":[{"sig":"MEUCIBIJggISYJFSxhXTM60kF+TPbdiWpa/uFmrdY+OnEnjFAiEA237Lb201WYsJvvllEbwcU4x6WQoYYUY+IGd/rt5UB8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBLdssm+fmbcuPDNMV67WFHZtea+WfG/NrsAEZSAzS+eAiB9Rm1boqTMQfGOR7oM9mb6wE5Ncu0p+jRntF7JyYThCw=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codesocietyou%2fcontentedge-cms-sdk@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":250045},"main":"./dist/index.cjs","name":"@codesocietyou/contentedge-cms-sdk","type":"module","types":"./dist/index.d.cts","author":{"name":"ContentEdge"},"module":"./dist/index.mjs","engines":{"npm":">=10.0.0","node":">=24.13.1"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"gitHead":"85bf4639f6d340460388dfdbf1218e59f7f7d5f7","license":"MIT","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"tsdown && npm run copy-css","preview":"vite preview","release":"changeset publish","copy-css":"node -e \"require('fs').cpSync('src/styles/richText.css','dist/styles.css')\"","changeset":"changeset","test:watch":"vitest","test:coverage":"vitest run --coverage","version:apply":"changeset version","prepublishOnly":"npm run build"},"version":"2.0.0","_npmUser":{"name":"mariosciro","email":"info@paraplu.cloud"},"homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"_npmVersion":"11.8.0","description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","directories":{},"maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"sideEffects":["./dist/styles.css"],"_nodeVersion":"24.13.1","dependencies":{"axios":"^1.20.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.3.0","react":"^19.3.0","eslint":"^10.10.0","tsdown":"^0.23.0","vitest":"^4.1.11","globals":"^17.12.0","react-dom":"^19.3.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.3.0","@changesets/cli":"^2.31.0","@types/react-dom":"^19.3.0","typescript-eslint":"^8.70.0","@vitest/coverage-v8":"^4.1.11","@vitejs/plugin-react":"^6.1.1","@tanstack/react-query":"^5.102.8"},"peerDependencies":{"@tanstack/react-query":">=5.90.0"},"peerDependenciesMeta":{"@tanstack/react-query":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/contentedge-cms-sdk_2.0.0_1789519384620_0.5646449894090693"}}},"time":{"created":"2025-11-12T03:46:25.535Z","modified":"2026-09-16T00:43:05.059Z","0.2.2":"2025-11-12T03:46:25.796Z","1.0.0":"2026-02-14T23:00:17.286Z","1.0.1":"2026-04-02T10:52:04.028Z","1.0.3":"2026-04-30T23:30:45.225Z","1.0.4":"2026-04-30T23:52:34.090Z","1.0.5":"2026-05-01T00:12:57.402Z","1.0.6":"2026-05-01T00:34:50.806Z","1.0.7":"2026-05-01T01:39:29.552Z","1.0.8":"2026-05-01T18:34:24.910Z","2.0.0":"2026-09-16T00:43:04.725Z"},"bugs":{"url":"https://github.com/ParapluOU/contentedge-cms-sdk/issues"},"author":{"name":"ContentEdge"},"license":"MIT","homepage":"https://github.com/ParapluOU/contentedge-cms-sdk#readme","keywords":["content","cms","sdk","typescript","headless-cms","react-query","tanstack"],"repository":{"url":"git+https://github.com/ParapluOU/contentedge-cms-sdk.git","type":"git"},"description":"A lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS with API key authentication and optional React Query integration.","maintainers":[{"name":"mariosciro","email":"info@paraplu.cloud"},{"name":"maxit789","email":"tijanalambic@gmail.com"},{"name":"nikobene","email":"benediktnikolai@gmail.com"},{"name":"loveeykb","email":"karirloveleen@gmail.com"}],"readme":"# ContentEdge SDK (TypeScript)\n\nA lightweight, framework-agnostic TypeScript client for the ContentEdge headless CMS. It provides a clean, typed interface over the HTTP API with public API key authentication, robust pagination helpers, asset/file utilities, and structured errors—without embedding project-specific domain models.\n\nThis SDK models the wire contract via a generic `ContentDto<C>` where `C` represents your custom fields. It does not import or depend on the CMS server code.\n\n> ### Looking for IT services?\n> <img src=\"https://fromulo.com/codesociety.png\" align=\"left\" width=\"80\" alt=\"CodeSociety\">\n>\n> **[CodeSociety](https://codesocietyhub.com/)** is our consulting & contracting arm — specializing in\n> **IT architecture**, **XML authoring systems**, **FontoXML integration**, and **TerminusDB consulting**.\n> We build structured content platforms and data solutions that power digital publishing.\n>\n> **[Let's talk! &#8594;](https://codesocietyhub.com/contact.html)**\n\n## Features\n\n- **Generic content model**: `ContentDto<C>` with consumer-defined custom fields\n- **Public API key authentication**: Simple header-based authentication\n- **Service layer pattern**: Centralized API client with interceptors\n- **React Query integration**: Optional query factory and hooks\n- **Resilient pagination**: `fetchAllContent` aggregates pages with dedupe and safe stop\n- **Asset/file helpers**: `buildAssetUrl` and safe `downloadFile`\n- **Normalization utilities**: Transform API responses to normalized structures\n- **Structured error model**: `CmsError` with status and response data\n- **Framework-agnostic**: Core services work anywhere; React Query layer is optional\n- **TypeScript-first**: Full type safety with generics\n\n## Installation\n\n```bash\nnpm install @codesocietyou/contentedge-cms-sdk\n# or\nyarn add @codesocietyou/contentedge-cms-sdk\n# or\npnpm add @codesocietyou/contentedge-cms-sdk\n```\n\nFor React Query integration, also install:\n\n```bash\nnpm install @tanstack/react-query\n```\n\n## Quick Start\n\n### 1. Initialize the SDK\n\n```typescript\nimport { createApiClient } from '@codesocietyou/contentedge-cms-sdk';\n\n// Initialize once at app startup\ncreateApiClient({\n  baseUrl: 'https://api.contentedge.com',\n  fileBaseUrl: 'https://cdn.contentedge.com', // optional\n  apiKey: 'your-api-key',                      // optional\n  tenant: 'your-tenant',                       // optional\n  timeoutMs: 30_000,                           // optional (default: 30s)\n});\n```\n\n### 2. Fetch Content (Basic)\n\nOmit `sortBy` and `direction` so the list matches the CMS admin display order\n(`sortOrder` ASC; pairwise card swap — dropping A on D exchanges A and D, items\nin between do not shift). Concurrent creates can share a `sortOrder`; the CMS\nuses `id ASC` as a tie-breaker.\n\n```typescript\nimport { fetchContentByType } from '@codesocietyou/contentedge-cms-sdk';\n\nconst response = await fetchContentByType({\n  type: 'NEWS',\n  page: 0,\n  size: 10,\n  filters: { publicationType: 'GAMEHEARTS' }, // arbitrary filters\n});\n\nconst items = response.data.content;\n```\n\nTo ignore admin order and sort by id (legacy):\n\n```typescript\nconst byId = await fetchContentByType({\n  type: 'NEWS',\n  page: 0,\n  size: 10,\n  sortBy: 'id',\n});\n```\n\n### 3. Fetch Content (React Query)\n\n```typescript\nimport { useQuery } from '@tanstack/react-query';\nimport { contentQueries } from '@codesocietyou/contentedge-cms-sdk';\n\nfunction NewsList() {\n  const { data, isLoading, error } = useQuery(\n    contentQueries.list({ type: 'NEWS', page: 0, size: 10 })\n  );\n\n  if (isLoading) return <div>Loading...</div>;\n  if (error) return <div>Error: {error.message}</div>;\n\n  return (\n    <ul>\n      {data.data.content.map(item => (\n        <li key={item.id}>{item.title}</li>\n      ))}\n    </ul>\n  );\n}\n```\n\n### 4. Normalization\n\n```typescript\nimport { \n  normalizeContentItem,\n  fetchContentByType \n} from '@codesocietyou/contentedge-cms-sdk';\n\n// Fetch and normalize\nconst response = await fetchContentByType({ type: 'NEWS' });\nconst normalized = response.data.content.map(normalizeContentItem);\n\n// normalized items have resolved asset URLs and standardized fields\nconsole.log(normalized[0].insideImage); // \"https://cdn.contentedge.com/images/news.jpg\"\nconsole.log(normalized[0].pdfPath);     // \"https://cdn.contentedge.com/files/doc.pdf\"\n```\n\n## API Reference\n\n### Configuration\n\n#### `createApiClient(config: SdkConfig): AxiosInstance`\n\nInitialize the SDK with your CMS configuration. Call this once at app startup.\n\n```typescript\ninterface SdkConfig {\n  baseUrl: string;        // CMS API base URL (required)\n  fileBaseUrl?: string;   // Preferred file/asset base\n  apiKey?: string;        // API key for authentication\n  tenant?: string;        // Tenant identifier (sent as X-Tenant header)\n  timeoutMs?: number;     // Request timeout (default: 30000)\n  logger?: {\n    debug?: (...args: unknown[]) => void;\n    warn?: (...args: unknown[]) => void;\n    error?: (...args: unknown[]) => void;\n  };\n}\n```\n\n### Service Layer\n\n#### `fetchContentByType<C>(params: ContentListParams): Promise<ContentResponse<C>>`\n\nFetch paginated content by type with filters and optional sorting.\n\nOmitting `sortBy` / `direction` follows the CMS admin display order. Pass\n`sortBy: \"id\"` to ignore it. `sortBy: \"sortOrder\"` is also valid if you want to\nsend the field explicitly (the CMS still applies `id ASC` as a tie-breaker).\n\n```typescript\ninterface ContentListParams {\n  type?: string;                    // Content type (default: 'ALL')\n  page?: number;                    // Page number (0-indexed)\n  size?: number;                    // Items per page\n  sortBy?: string;                  // Omit to follow admin order; \"id\" | \"sortOrder\"\n  direction?: 'ASC' | 'DESC';       // Sent only when provided\n  filters?: Record<string, any>;    // Arbitrary query filters\n}\n```\n\nList items (`ContentDto`) include optional `sortOrder?: number` (lower appears first).\n\n#### `fetchContentById<C>(id: number): Promise<ApiResponse<ContentDto<C>>>`\n\nFetch a single content item by ID.\n\n#### `fetchAllContent<C, T>(params, options): Promise<T[]>`\n\nFetch all content items across multiple pages with automatic pagination.\n\n```typescript\ninterface FetchAllOptions<C, T> {\n  mapItem?: (item: ContentDto<C>) => T;        // Transform each item\n  dedupeBy?: (item: T) => string | number;     // Dedupe key extractor\n  hardStopMaxPages?: number;                    // Safety limit (default: 20)\n}\n```\n\n#### `downloadFile(path: string): Promise<Blob>`\n\nDownload a file from a given path (with proper authentication for CMS files).\n\n### React Query Integration\n\n#### `contentQueries`\n\nQuery options factory for use with `useQuery`:\n\n```typescript\n// Paginated list\ncontentQueries.list({ type: 'NEWS', page: 0, size: 10 })\n\n// Single item\ncontentQueries.detail(123)\n\n// Fetch all (across pages)\ncontentQueries.listAll({ type: 'NEWS', size: 100 }, { mapItem: normalizeContentItem })\n```\n\n#### Hooks\n\n```typescript\n// List hook\nconst { data } = useContentList({ type: 'NEWS', page: 0, size: 10 });\n\n// Detail hook\nconst { data } = useContentDetail(123);\n\n// Fetch all hook\nconst { data } = useContentAll({ type: 'NEWS' });\n\n// Prefetch utilities\nconst { prefetchList, prefetchDetail, invalidateLists } = useContentPrefetch();\n```\n\n#### Query Keys\n\nHierarchical query key factory for manual cache manipulation:\n\n```typescript\nimport { contentKeys } from '@codesocietyou/contentedge-cms-sdk';\n\n// Invalidate all lists\nqueryClient.invalidateQueries({ queryKey: contentKeys.lists() });\n\n// Invalidate specific detail\nqueryClient.invalidateQueries({ queryKey: contentKeys.detail(123) });\n```\n\n### Normalization\n\n#### `normalizeContentItem<C>(item: ContentDto<C>): NormalizedContentItem`\n\nTransform a content item to a normalized structure with resolved asset URLs:\n\n```typescript\ninterface NormalizedContentItem {\n  id: number;\n  title: string;\n  text: string;\n  type: string;\n  sortOrder?: number;       // Admin display order (lower first); omitted if the API did not send it\n  insideImage: string;      // Resolved URL\n  outsideImage: string;     // Resolved URL\n  pdfPath: string | null;   // Resolved URL (type-aware)\n  references: string | null;\n  citation: string | null;\n  abstract: string | null;\n  team: string | null;\n  publicationType: string | null;\n  fake: boolean | null;\n}\n```\n\n#### `buildAssetUrlWithConfig(path?: string | null): string`\n\nBuild an asset URL using the SDK's configured base URLs.\n\n### Error Handling\n\n```typescript\nimport { CmsError } from '@codesocietyou/contentedge-cms-sdk';\n\ntry {\n  await fetchContentByType({ type: 'NEWS' });\n} catch (e) {\n  if (e instanceof CmsError) {\n    console.error('CMS error:', e.status, e.data);\n    // e.status: HTTP status code\n    // e.data: Response body (if any)\n  } else {\n    console.error('Unknown error:', e);\n  }\n}\n```\n\n## Advanced Usage\n\n### Custom Fields Type\n\nDefine your own custom fields type for full type safety:\n\n```typescript\ninterface MyCustomFields {\n  title: string;\n  text: string;\n  author?: string;\n  tags?: string[];\n  publishedAt?: string;\n}\n\n// Use with type parameter\nconst response = await fetchContentByType<MyCustomFields>({ type: 'ARTICLE' });\nconst items = response.data.content; // ContentDto<MyCustomFields>[]\n```\n\n### Custom Normalization\n\n```typescript\ninterface MyNormalizedItem {\n  id: number;\n  title: string;\n  author: string;\n  tags: string[];\n}\n\nfunction myNormalize(item: ContentDto<MyCustomFields>): MyNormalizedItem {\n  return {\n    id: item.id,\n    title: item.customFields.title || item.title,\n    author: item.customFields.author || 'Unknown',\n    tags: item.customFields.tags || [],\n  };\n}\n\n// Use with fetchAllContent\nconst items = await fetchAllContent<MyCustomFields, MyNormalizedItem>(\n  { type: 'ARTICLE', size: 100 },\n  { mapItem: myNormalize }\n);\n```\n\n### React Query Configuration\n\n```typescript\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { createApiClient } from '@codesocietyou/contentedge-cms-sdk';\n\n// Initialize SDK\ncreateApiClient({\n  baseUrl: process.env.VITE_API_URL!,\n  apiKey: process.env.VITE_API_KEY,\n  tenant: 'my-tenant',\n});\n\n// Create query client\nconst queryClient = new QueryClient({\n  defaultOptions: {\n    queries: {\n      retry: 2,\n      refetchOnWindowFocus: false,\n    },\n  },\n});\n\n// Wrap app\nfunction App() {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <YourApp />\n    </QueryClientProvider>\n  );\n}\n```\n\n## Migration from v0.2.x\n\nThe v1.0.0 release includes breaking changes:\n\n### Removed\n\n- `CmsClient` class → Use service functions + `createApiClient()`\n- `KeycloakClientCredentialsAuth` → Use API key authentication\n- `AuthProvider` interface → No longer needed\n\n### Migration Steps\n\n**Before (v0.2.x):**\n\n```typescript\nimport { CmsClient, KeycloakClientCredentialsAuth } from '@codesocietyou/contentedge-cms-sdk';\n\nconst auth = new KeycloakClientCredentialsAuth({\n  tokenUrl: 'https://auth.example.com/token',\n  clientId: 'client',\n  clientSecret: 'secret',\n});\n\nconst client = new CmsClient({\n  baseUrl: 'https://api.example.com',\n  auth,\n});\n\nconst list = await client.listContent({ type: 'NEWS' });\nconst detail = await client.getContentById(123);\n```\n\n**After (v1.0.0):**\n\n```typescript\nimport { \n  createApiClient, \n  fetchContentByType, \n  fetchContentById \n} from '@codesocietyou/contentedge-cms-sdk';\n\n// Initialize once\ncreateApiClient({\n  baseUrl: 'https://api.example.com',\n  apiKey: 'your-api-key',\n});\n\n// Use service functions\nconst list = await fetchContentByType({ type: 'NEWS' });\nconst detail = await fetchContentById(123);\n```\n\n## Security\n\n- **API Keys**: Store in environment variables, never commit to source control\n- **Runtime Configuration**: Inject secrets at runtime in production\n- **CORS**: Ensure your CMS API allows requests from your domain\n- **Rate Limiting**: The SDK logs 429 errors; implement retry logic if needed\n\n## ContentEdge CMS Endpoints\n\nThis SDK is designed specifically for the ContentEdge CMS API. The endpoint paths are fixed as part of the CMS API contract:\n\n- `GET /content/type/:type` - List content by type with pagination. Omit `sortBy` to follow admin display order.\n- `GET /content/:id` - Get single content item by ID. Items include optional `sortOrder` (lower appears first).\n\n### Environment Configuration\n\nThe `baseUrl` configuration allows you to connect to different ContentEdge CMS deployments:\n\n**Development:**\n```typescript\ncreateApiClient({ baseUrl: 'http://localhost:8080/api' });\n```\n\n**Staging:**\n```typescript\ncreateApiClient({ baseUrl: 'https://staging-cms.contentedge.com/api' });\n```\n\n**Production:**\n```typescript\ncreateApiClient({ baseUrl: 'https://cms.contentedge.com/api' });\n```\n\nThis deployment flexibility is intentional and does not mean the SDK supports different API contracts. All ContentEdge CMS instances use the same endpoint structure.\n\n## Contributing\n\nContributions are welcome! Please follow the existing code style and add tests for new features.\n\n## Versioning\n\nThis project follows [Semantic Versioning](https://semver.org/). Breaking changes bump MAJOR.\n\n## License\n\nMIT\n\n## Support\n\n- Issues: https://github.com/ParapluOU/contentedge-cms-sdk/issues\n- Docs: https://github.com/ParapluOU/contentedge-cms-sdk#readme\n","readmeFilename":"README.md"}