{"_id":"@bernierllc/content-type-blog-post","_rev":"8-2e2d889b867ec0346d447ee6778f9d95","name":"@bernierllc/content-type-blog-post","dist-tags":{"latest":"3.0.0"},"versions":{"1.0.1":{"name":"@bernierllc/content-type-blog-post","version":"1.0.1","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"a48bcdbffa884d4ba715cf6a22e38fee9557a747","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.0.1.tgz","fileCount":50,"integrity":"sha512-bi31SkWJtKozN4vkbJIgx21ebN2xZHb6uSng9NzMA+6iUpKedN8CL51AaqRsY6OG0VY69Bw6jv6pHqNQ5/o2Hg==","signatures":[{"sig":"MEUCIDhCkCXntHBozhT4SlIXH2Ttfoa8JKpn9hCVc0KSp4dsAiEA3MfGGd70aGhOjKt44bXzuHKoBqzHB8rBeh1AGxov5No=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345319},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/309bdcbdd8731d07d9a372bdec36e2f6/bernierllc-content-type-blog-post-1.0.1.tgz","_integrity":"sha512-bi31SkWJtKozN4vkbJIgx21ebN2xZHb6uSng9NzMA+6iUpKedN8CL51AaqRsY6OG0VY69Bw6jv6pHqNQ5/o2Hg==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.6.0","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"^1.0.1","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"^1.0.3","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.0.1_1762304699676_0.546574058347592","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/content-type-blog-post","version":"1.0.2","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"8d5ebbba970b5a75dfcdf0f06ba3c8edd3cf3906","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.0.2.tgz","fileCount":50,"integrity":"sha512-Gmiz/UpEi14KfMU82lxpe0TVuV/t/dNtmlUoF1/vESJ6XqRsyt5TBTkci7rPkbXJIHYgwKIU1IzYOsiVs1SSiA==","signatures":[{"sig":"MEYCIQC7sgEDzPiYhidgGEBXyMGS7bw2qXNWwZBKycwVeBduggIhAPylGvL6YQR9BwPV15dD9oedpbwjl0QFM4ov6Jhanzz1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345319},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.0.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/ecd13182b3cbf8138c832b4fc8955bdf/bernierllc-content-type-blog-post-1.0.2.tgz","_integrity":"sha512-Gmiz/UpEi14KfMU82lxpe0TVuV/t/dNtmlUoF1/vESJ6XqRsyt5TBTkci7rPkbXJIHYgwKIU1IzYOsiVs1SSiA==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.6.0","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"^1.0.1","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"^1.0.3","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.0.2_1762308765344_0.6948867299159995","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/content-type-blog-post","version":"1.0.3","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"a563260a7920f81aa9ffa44f18b608f734d7e471","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.0.3.tgz","fileCount":34,"integrity":"sha512-3XkeNuqA5yCIDyHjaB5qHNFC9kBPvX8qxXxU3ktZjc1oxCVPhgitESauMebL3cj6IEAAbpPcYWWC7NRtH7dsbw==","signatures":[{"sig":"MEUCIQCrnIbxBxVfdFOtwlmEQ+X6zSWofWTloTlvvKlwatNzmgIgSdahFBKNzAQ7zkpIilhPI4rQ42Cvdr8XM0R+8CY++8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130824},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.0.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/279b9ed26e663ec05b7a536c67180412/bernierllc-content-type-blog-post-1.0.3.tgz","_integrity":"sha512-3XkeNuqA5yCIDyHjaB5qHNFC9kBPvX8qxXxU3ktZjc1oxCVPhgitESauMebL3cj6IEAAbpPcYWWC7NRtH7dsbw==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.7.0","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"1.0.2","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"1.1.0","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.0.3_1766087432440_0.10733845544668719","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/content-type-blog-post","version":"1.0.5","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"e7245a57b71ae74d1db5d452d2f4a0db9c47b877","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.0.5.tgz","fileCount":34,"integrity":"sha512-IHE9s54bbO/hzsramrUiWmOM0zD8+j1jqZS0yD6xRCm8AlZI9YwPJPlrS8Kc4AagfNaljC4GoyKFIAsoCcLsAQ==","signatures":[{"sig":"MEUCIQCA+iK9GGZcJmkIDe1ZSQ38/NnmkpnEb1e/EN1GhJABHQIgGUyBtgJGxZAXkUhl0Fc4ZmEgPrrzcC1zHKhFh3O1pcY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132550},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e0316aab-9dfb-45b2-9899-cd2ca898326e"}},"bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"1.2.0","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"1.3.0","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.0.5_1767642420000_0.4219545992074447","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@bernierllc/content-type-blog-post","version":"1.0.7","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.0.7","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"01755da8f0d9bb42de8bd2830d50e9c01ea0afb6","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.0.7.tgz","fileCount":34,"integrity":"sha512-TXXTfXTsb73XqZ8mGF/DZl2DGhjvQSO4vTm2jNDQrYqfhRv1rfeOGa6LTiM55Jn2vVi8wL/UNO7ALimOC3VCkw==","signatures":[{"sig":"MEUCIHjt/OZIwlTh0oe/i1HcQpODRLjPMjLsTdAXOJLut3PgAiEA3U8hr7wDcEppAbtzcFdTN4/z6Kc9TT0oASNx4g6v/7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132960},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.0.7.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e0316aab-9dfb-45b2-9899-cd2ca898326e"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-type-blog-post/bernierllc-content-type-blog-post-1.0.7.tgz","_integrity":"sha512-TXXTfXTsb73XqZ8mGF/DZl2DGhjvQSO4vTm2jNDQrYqfhRv1rfeOGa6LTiM55Jn2vVi8wL/UNO7ALimOC3VCkw==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.11.0","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"1.2.2","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"1.3.2","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.0.7_1773163068680_0.4126518305501854","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/content-type-blog-post","version":"1.2.0","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"2964a7bf275acd1ef536eb337c4e8e25eb7a71b8","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.2.0.tgz","fileCount":16,"integrity":"sha512-yxJwFpJ7cWgmvIPWidGQk3YY1MgnpJe6FW4TJDMP5aJPS1MFXxXfbcUwZ9a63qAT8nLwwyizhiTGwpkIRCR4gw==","signatures":[{"sig":"MEQCIC02Rq5P3b5KnhnHHlp/eo9/7LnWE2YRRukqmT3Qs/xWAiBEkEttTH89qvfrjiCo2I12bq7+IDLcLR8TuDVk4IQLUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52549},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.2.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e0316aab-9dfb-45b2-9899-cd2ca898326e"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-type-blog-post/bernierllc-content-type-blog-post-1.2.0.tgz","_integrity":"sha512-yxJwFpJ7cWgmvIPWidGQk3YY1MgnpJe6FW4TJDMP5aJPS1MFXxXfbcUwZ9a63qAT8nLwwyizhiTGwpkIRCR4gw==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.14.1","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"1.4.0","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"1.5.0","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.2.0_1779241002863_0.8033596573316979","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/content-type-blog-post","version":"1.3.0","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-blog-post@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"256092f6d23ddb7427fed31f3e61b2029b333f83","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-1.3.0.tgz","fileCount":16,"integrity":"sha512-4J2ftLHF2cNoFj9y/mwh6ZwM1G3N3BwtLccmIbFrsQARLQT4CKoyhJCvGeay5mMMXv3Z7f54vzn0UjzampnNfA==","signatures":[{"sig":"MEUCIQCdKpGMM3O/RVnAEarKtIAVDWdC17yeWwx7GNySW70HfAIgGUpwqhW+tced11PHxouZb4FRKMvjzDyzhRmwLm089Ds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52549},"main":"dist/index.js","_from":"file:bernierllc-content-type-blog-post-1.3.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e0316aab-9dfb-45b2-9899-cd2ca898326e"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-type-blog-post/bernierllc-content-type-blog-post-1.3.0.tgz","_integrity":"sha512-4J2ftLHF2cNoFj9y/mwh6ZwM1G3N3BwtLccmIbFrsQARLQT4CKoyhJCvGeay5mMMXv3Z7f54vzn0UjzampnNfA==","bernierllc":{"integration":{"logger":"planned","neverhub":"planned","neveradmin":"not-applicable"}},"_npmVersion":"11.14.1","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","lowlight":"^3.0.0","@tiptap/core":"^2.1.0","@tiptap/starter-kit":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@bernierllc/content-type-text":"1.5.0","@tiptap/extension-table-header":"^2.1.0","@bernierllc/content-type-registry":"1.6.0","@tiptap/extension-code-block-lowlight":"^2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.11.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","@types/pg":"^8.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"pg":"^8.11.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-blog-post_1.3.0_1779249739144_0.13769781588544516","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@bernierllc/content-type-blog-post","version":"3.0.0","description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","main":"dist/index.js","types":"dist/index.d.ts","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","dependencies":{"@tiptap/core":"^2.1.0","@tiptap/extension-code-block-lowlight":"^2.1.0","@tiptap/extension-image":"^2.1.0","@tiptap/extension-link":"^2.1.0","@tiptap/extension-table":"^2.1.0","@tiptap/extension-table-cell":"^2.1.0","@tiptap/extension-table-header":"^2.1.0","@tiptap/extension-table-row":"^2.1.0","@tiptap/starter-kit":"^2.1.0","lowlight":"^3.0.0","zod":"^3.22.0","@bernierllc/content-type-registry":"1.6.0","@bernierllc/content-type-text":"1.5.0"},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/pg":"^8.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","pg":"^8.11.0","ts-jest":"^29.0.0","typescript":"^5.0.0"},"peerDependencies":{"pg":"^8.11.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"bernierllc":{"integration":{"neverhub":"planned","neveradmin":"not-applicable","logger":"planned"}},"scripts":{"build":"tsc","test":"jest","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","clean":"rm -rf dist"},"_id":"@bernierllc/content-type-blog-post@3.0.0","_integrity":"sha512-Hz9Xo92J0ztbwwgi+wVGxYycfX80gCFSRCCa1eQMB44ws9UOHr57jwEinFXEBrk+ardE0cx7Ph+qhrceaCFinw==","_resolved":"/home/runner/work/tools/tools/packages/core/content-type-blog-post/bernierllc-content-type-blog-post-3.0.0.tgz","_from":"file:bernierllc-content-type-blog-post-3.0.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-Hz9Xo92J0ztbwwgi+wVGxYycfX80gCFSRCCa1eQMB44ws9UOHr57jwEinFXEBrk+ardE0cx7Ph+qhrceaCFinw==","shasum":"07acf5aea79441ce78801b59cc7ac4b52bb5d1af","tarball":"https://registry.npmjs.org/@bernierllc/content-type-blog-post/-/content-type-blog-post-3.0.0.tgz","fileCount":16,"unpackedSize":54025,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBC1BnSJ5Em+zgB5GGU4aapRnezO9LKpKnzttLLXBrvWAiAuAKgyBZQcnG13FMfa2zeliRa/sFurCvqeus7lL0c6dw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e0316aab-9dfb-45b2-9899-cd2ca898326e"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/content-type-blog-post_3.0.0_1779308131741_0.11566841107409465"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-05T01:04:59.613Z","modified":"2026-05-20T20:15:32.025Z","1.0.1":"2025-11-05T01:04:59.869Z","1.0.2":"2025-11-05T02:12:45.594Z","1.0.3":"2025-12-18T19:50:32.604Z","1.0.5":"2026-01-05T19:47:00.135Z","1.0.7":"2026-03-10T17:17:48.889Z","1.2.0":"2026-05-20T01:36:43.018Z","1.3.0":"2026-05-20T04:02:19.349Z","3.0.0":"2026-05-20T20:15:31.885Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["blog","content","tiptap","seo","cms","content-type","wysiwyg","database","publishing"],"description":"Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/content-type-blog-post\n\nBlog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing capabilities for modern content management systems.\n\n## Installation\n\n```bash\nnpm install @bernierllc/content-type-blog-post\n```\n\n### Peer Dependencies\n\nThis package requires PostgreSQL client:\n\n```bash\nnpm install pg\n```\n\n## Usage\n\n### Basic Setup\n\n```typescript\nimport { BlogPostContentType } from '@bernierllc/content-type-blog-post';\nimport { Pool } from 'pg';\n\n// Initialize database client\nconst pool = new Pool({\n  connectionString: process.env.DATABASE_URL\n});\n\n// Create blog post content type\nconst blogPost = new BlogPostContentType({\n  dbClient: pool,\n  tableName: 'blog_posts',\n  baseUrl: 'https://example.com'\n});\n\n// Initialize database schema\nawait blogPost.initializeDatabase();\n```\n\n### Creating a Blog Post\n\n```typescript\nconst result = await blogPost.create({\n  title: 'Getting Started with TypeScript',\n  slug: 'getting-started-with-typescript',\n  content: '<p>TypeScript is a powerful...</p>',\n  excerpt: 'Learn the basics of TypeScript in this comprehensive guide.',\n  seo: {\n    metaTitle: 'Getting Started with TypeScript - Complete Guide',\n    metaDescription: 'Learn TypeScript basics, advanced types, and best practices in this comprehensive guide.',\n    keywords: ['typescript', 'javascript', 'programming'],\n    ogImage: 'https://example.com/images/typescript-guide.jpg'\n  },\n  author: {\n    name: 'John Doe',\n    email: 'john@example.com',\n    avatar: 'https://example.com/avatars/john.jpg'\n  },\n  tags: ['typescript', 'tutorial', 'beginners'],\n  categories: ['Programming', 'Web Development'],\n  status: 'draft'\n});\n\nif (result.success) {\n  console.log('Blog post created:', result.data);\n} else {\n  console.error('Failed to create blog post:', result.error);\n}\n```\n\n### Publishing a Blog Post\n\n```typescript\n// Update status to published\nconst publishResult = await blogPost.update('post-id-here', {\n  status: 'published',\n  publishedAt: new Date()\n});\n\n// Get the publish URL\nconst url = blogPost.getPublishUrl('getting-started-with-typescript');\n// Returns: https://example.com/blog/getting-started-with-typescript\n```\n\n### Retrieving Blog Posts\n\n```typescript\n// Get a single blog post\nconst post = await blogPost.read('post-id-here');\n\n// List all published posts\nconst publishedPosts = await blogPost.list({ status: 'published' });\n\n// List posts by tag\nconst taggedPosts = await blogPost.list({ tags: ['typescript'] });\n\n// List posts by author\nconst authorPosts = await blogPost.list({\n  author: { name: 'John Doe' }\n});\n```\n\n### Updating a Blog Post\n\n```typescript\nconst updateResult = await blogPost.update('post-id-here', {\n  title: 'Updated Title',\n  content: '<p>Updated content...</p>',\n  seo: {\n    metaTitle: 'Updated Meta Title',\n    metaDescription: 'Updated meta description'\n  }\n});\n```\n\n### Deleting a Blog Post\n\n```typescript\nconst deleteResult = await blogPost.delete('post-id-here');\n\nif (deleteResult.success) {\n  console.log('Blog post deleted successfully');\n}\n```\n\n## API Reference\n\n### `BlogPostContentType`\n\nMain class for managing blog post content.\n\n#### Constructor\n\n```typescript\nconstructor(config?: {\n  dbClient?: any;\n  tableName?: string;\n  baseUrl?: string;\n})\n```\n\n**Parameters:**\n- `dbClient` - PostgreSQL client instance (from `pg` package)\n- `tableName` - Database table name (default: `'blog_posts'`)\n- `baseUrl` - Base URL for published posts (default: `''`)\n\n#### Methods\n\n##### `initializeDatabase()`\n\nInitialize database schema with blog posts table.\n\n```typescript\nasync initializeDatabase(): Promise<BlogPostResult<void>>\n```\n\n##### `create(metadata)`\n\nCreate a new blog post.\n\n```typescript\nasync create(metadata: Partial<BlogPostMetadata>): Promise<BlogPostResult<BlogPostMetadata>>\n```\n\n##### `read(id)`\n\nRetrieve a blog post by ID.\n\n```typescript\nasync read(id: string): Promise<BlogPostResult<BlogPostMetadata>>\n```\n\n##### `update(id, updates)`\n\nUpdate an existing blog post.\n\n```typescript\nasync update(id: string, updates: Partial<BlogPostMetadata>): Promise<BlogPostResult<BlogPostMetadata>>\n```\n\n##### `delete(id)`\n\nDelete a blog post by ID.\n\n```typescript\nasync delete(id: string): Promise<BlogPostResult<void>>\n```\n\n##### `list(filters?)`\n\nList blog posts with optional filtering.\n\n```typescript\nasync list(filters?: {\n  status?: BlogPostStatus;\n  tags?: string[];\n  categories?: string[];\n  author?: { name?: string; email?: string };\n}): Promise<BlogPostResult<BlogPostMetadata[]>>\n```\n\n##### `getPublishUrl(slug)`\n\nGet the publish URL for a blog post.\n\n```typescript\ngetPublishUrl(slug: string): string\n```\n\n##### `validate(metadata)`\n\nValidate blog post metadata against schema.\n\n```typescript\nvalidate(metadata: unknown): BlogPostResult<BlogPostMetadata>\n```\n\n### Types\n\n#### `BlogPostMetadata`\n\n```typescript\ninterface BlogPostMetadata {\n  content: string;\n  createdAt: Date;\n  updatedAt: Date;\n  title: string;\n  slug: string;\n  excerpt?: string;\n  seo: BlogPostSEO;\n  author: BlogPostAuthor;\n  tags: string[];\n  categories: string[];\n  status: BlogPostStatus;\n  publishedAt?: Date;\n  scheduledFor?: Date;\n  featuredImage?: string;\n  readingTime?: number;\n  wordCount: number;\n}\n```\n\n#### `BlogPostSEO`\n\n```typescript\ninterface BlogPostSEO {\n  metaTitle: string;\n  metaDescription: string;\n  keywords: string[];\n  ogImage?: string;\n  ogType: 'article';\n  canonicalUrl?: string;\n}\n```\n\n#### `BlogPostAuthor`\n\n```typescript\ninterface BlogPostAuthor {\n  name: string;\n  email?: string;\n  avatar?: string;\n  bio?: string;\n}\n```\n\n#### `BlogPostStatus`\n\n```typescript\ntype BlogPostStatus = 'draft' | 'published' | 'scheduled' | 'archived';\n```\n\n### Utility Functions\n\n#### `calculateWordCount(content)`\n\nCalculate word count from HTML content.\n\n```typescript\nfunction calculateWordCount(content: string): number\n```\n\n#### `calculateReadingTime(wordCount, wordsPerMinute?)`\n\nCalculate reading time in minutes.\n\n```typescript\nfunction calculateReadingTime(wordCount: number, wordsPerMinute?: number): number\n```\n\n#### `validateSEOCompleteness(seo)`\n\nValidate that SEO metadata is complete for publishing.\n\n```typescript\nfunction validateSEOCompleteness(seo: BlogPostSEO): {\n  isComplete: boolean;\n  errors: string[];\n}\n```\n\n#### `generateSlug(title)`\n\nGenerate URL-safe slug from title.\n\n```typescript\nfunction generateSlug(title: string): string\n```\n\n## Configuration\n\n### Database Schema\n\nThe package automatically creates the following PostgreSQL schema:\n\n```sql\nCREATE TABLE blog_posts (\n  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n  title VARCHAR(200) NOT NULL,\n  slug VARCHAR(200) NOT NULL UNIQUE,\n  content TEXT NOT NULL,\n  excerpt VARCHAR(300),\n\n  -- SEO metadata\n  meta_title VARCHAR(60),\n  meta_description VARCHAR(160),\n  keywords TEXT[],\n  og_image TEXT,\n  canonical_url TEXT,\n\n  -- Author information\n  author_name VARCHAR(100) NOT NULL,\n  author_email VARCHAR(100),\n  author_avatar TEXT,\n  author_bio VARCHAR(500),\n\n  -- Taxonomy\n  tags TEXT[] DEFAULT '{}',\n  categories TEXT[] DEFAULT '{}',\n\n  -- Publishing workflow\n  status VARCHAR(20) DEFAULT 'draft',\n  published_at TIMESTAMPTZ,\n  scheduled_for TIMESTAMPTZ,\n\n  -- Additional metadata\n  featured_image TEXT,\n  reading_time INTEGER,\n  word_count INTEGER DEFAULT 0,\n\n  -- Timestamps\n  created_at TIMESTAMPTZ DEFAULT NOW(),\n  updated_at TIMESTAMPTZ DEFAULT NOW()\n);\n\nCREATE INDEX idx_blog_posts_slug ON blog_posts(slug);\nCREATE INDEX idx_blog_posts_status ON blog_posts(status);\nCREATE INDEX idx_blog_posts_published_at ON blog_posts(published_at);\nCREATE INDEX idx_blog_posts_tags ON blog_posts USING GIN(tags);\nCREATE INDEX idx_blog_posts_categories ON blog_posts USING GIN(categories);\n```\n\n### TipTap Editor Configuration\n\nThe content type includes TipTap WYSIWYG editor with the following extensions:\n\n- **starter-kit** - Basic formatting (bold, italic, headings, lists, etc.)\n- **link** - Hyperlink support\n- **image** - Image embedding\n- **code-block-lowlight** - Syntax-highlighted code blocks\n- **table** - Table support with rows, cells, and headers\n\n## Integration Status\n\n### Logger Integration\n\n**Status**: Planned\n\nLogger integration will be added in a future release for:\n- Audit logging of blog post lifecycle events (create, update, publish, delete)\n- Database operation logging\n- Error tracking and debugging\n- Performance monitoring\n\n### NeverHub Integration\n\n**Status**: Planned\n\nNeverHub integration will be added in a future release for:\n- Event publishing for blog post lifecycle (created, updated, published, deleted)\n- Service discovery for author lookup and media management\n- Real-time collaboration features\n- Webhook notifications for publishing events\n\n### Graceful Degradation\n\nThe package is designed to work standalone without any external integrations. Logger and NeverHub integrations will be optional enhancements that provide additional functionality when available.\n\n## Examples\n\n### Complete Blog Publishing Workflow\n\n```typescript\nimport { BlogPostContentType, generateSlug } from '@bernierllc/content-type-blog-post';\n\nconst blogPost = new BlogPostContentType({ dbClient, baseUrl: 'https://blog.example.com' });\n\n// 1. Create draft\nconst draft = await blogPost.create({\n  title: 'My First Blog Post',\n  slug: generateSlug('My First Blog Post'),\n  content: '<h1>Hello World</h1><p>This is my first post...</p>',\n  author: { name: 'Jane Smith', email: 'jane@example.com' },\n  status: 'draft'\n});\n\n// 2. Add SEO metadata\nawait blogPost.update(draft.data.id, {\n  seo: {\n    metaTitle: 'My First Blog Post - Example Blog',\n    metaDescription: 'An introduction to blogging on our new platform.',\n    keywords: ['blogging', 'first post', 'introduction']\n  }\n});\n\n// 3. Schedule for publishing\nawait blogPost.update(draft.data.id, {\n  status: 'scheduled',\n  scheduledFor: new Date('2025-12-01T09:00:00Z')\n});\n\n// 4. Publish immediately\nawait blogPost.update(draft.data.id, {\n  status: 'published',\n  publishedAt: new Date()\n});\n\n// 5. Get publish URL\nconst url = blogPost.getPublishUrl(draft.data.slug);\nconsole.log(`Published at: ${url}`);\n```\n\n### SEO Best Practices\n\n```typescript\nimport { validateSEOCompleteness } from '@bernierllc/content-type-blog-post';\n\n// Validate SEO before publishing\nconst seoValidation = validateSEOCompleteness({\n  metaTitle: 'Complete Guide to TypeScript',\n  metaDescription: 'Learn TypeScript from basics to advanced concepts.',\n  keywords: ['typescript', 'javascript'],\n  ogImage: 'https://example.com/og-image.jpg'\n});\n\nif (!seoValidation.isComplete) {\n  console.error('SEO incomplete:', seoValidation.errors);\n  // ['Meta title should be between 30-60 characters', ...]\n}\n```\n\n### Reading Time Calculation\n\n```typescript\nimport { calculateWordCount, calculateReadingTime } from '@bernierllc/content-type-blog-post';\n\nconst content = '<p>Your blog post content here...</p>';\nconst wordCount = calculateWordCount(content);\nconst readingTime = calculateReadingTime(wordCount); // default: 200 words/minute\n\nawait blogPost.create({\n  title: 'Article Title',\n  content,\n  wordCount,\n  readingTime,\n  // ... other fields\n});\n```\n\n## Error Handling\n\nAll methods return a `BlogPostResult` type for consistent error handling:\n\n```typescript\ninterface BlogPostResult<T> {\n  success: boolean;\n  data?: T;\n  error?: string;\n}\n```\n\nExample usage:\n\n```typescript\nconst result = await blogPost.create({ /* metadata */ });\n\nif (result.success) {\n  console.log('Created:', result.data);\n} else {\n  console.error('Failed:', result.error);\n}\n```\n\n## Testing\n\nThe package includes comprehensive test coverage (91%+ coverage):\n\n```bash\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n\n# Run tests in watch mode\nnpm run test:watch\n```\n\n## License\n\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code only within the scope of the project it was delivered for.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n\n## See Also\n\n- [@bernierllc/content-type-registry](../content-type-registry) - Registry for managing multiple content types\n- [@bernierllc/content-type-text](../content-type-text) - Base text content type\n","readmeFilename":"README.md"}