{"_id":"@bernierllc/social-media-content-type-bluesky","_rev":"9-399423fb6de6e6b489e6b50b339231cf","name":"@bernierllc/social-media-content-type-bluesky","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.0","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"c92d4748a4ad208ce16fff2e2fbaa9b1bd13e810","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.0.tgz","fileCount":49,"integrity":"sha512-FOZ1EdPAi+hqrjLNoouz6gEzzV2YoHJtKYGS2eeg5ffr7rLugzVI3viV+Nhh3w7E+XGCThi6Qa2coft/daLmkw==","signatures":[{"sig":"MEUCIEFM1mv/OmHgrymNMvv+6rShBPQ6RqOlDRiTc5WhGApaAiEAv0n5Hm2ebUrIJsyKuJVhPCvrailiwuAOmjpfRB0tZb4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229579},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"053ec23b31c8dfa46ae1f0e0585a26af2b389d61","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.4.2","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"24.4.1","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"^1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.0_1760334449488_0.43710984350257287","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.1","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"76117b8f4b5b8be10e2e1a7f29ca061d60b32ee9","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.1.tgz","fileCount":50,"integrity":"sha512-/g0A4YoAEcVOQeLclxv94ONp76UijN2wHxCUbvwz07lKUvKR+btl58RNhNzm0PsX4wUS6P7aaLt0PUrvxsQ8jQ==","signatures":[{"sig":"MEYCIQDpPZK1KfyB12la3fAvsQdGrIvo7Mwgh+N7YJKuorvWvwIhAMLBJDKChtH5UN3fnztj4kDJZCJxlDwuve60hwW+yQ5f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232033},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/d0188683e63414fe5f0d70fca4f515db/bernierllc-social-media-content-type-bluesky-1.0.1.tgz","_integrity":"sha512-/g0A4YoAEcVOQeLclxv94ONp76UijN2wHxCUbvwz07lKUvKR+btl58RNhNzm0PsX4wUS6P7aaLt0PUrvxsQ8jQ==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.7.0","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.19.6","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.1_1766276716629_0.29865673204331267","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.2","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"3051d2cdd1b8fd8b50103117bcb1a6ae5c8c87db","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.2.tgz","fileCount":50,"integrity":"sha512-cNyZT//m9oMKrDzm7itPnqeJH1rhIZL+MlAICVPFrRomhw5JJ70630i5beIDILBMzJmZ8dL8R7lNAdz1FX1rOw==","signatures":[{"sig":"MEQCICmSR0yuS0rS9XXkUp6dGSK91XSPBd7cC6TDQj9IfzaZAiAwqE0FUOQUuMef6bsBOugrrUoDGXrz+ZhxdBiJxxpBjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232221},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.0.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/cb4b18a8bbcb50fa15703af6f59db816/bernierllc-social-media-content-type-bluesky-1.0.2.tgz","_integrity":"sha512-cNyZT//m9oMKrDzm7itPnqeJH1rhIZL+MlAICVPFrRomhw5JJ70630i5beIDILBMzJmZ8dL8R7lNAdz1FX1rOw==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.7.0","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.19.6","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.2_1766283497128_0.7608476597136453","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.4","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"930941fff1699b8dce15e13e79c950fd19e9ec1f","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.4.tgz","fileCount":50,"integrity":"sha512-lLkIuqKGM9QFEOgsOyw66QMveyznTNrHSgFr1HyErqR8QmIt3oXdhBfoDwozd+oyRKaRbpNz8XjjApoSwvP0bQ==","signatures":[{"sig":"MEUCIDHkLSXZ6mpz1ykpVJ9MQ5xX3a4ujq0x2szrif5W5FjEAiEAiatqz/PNEc+YIhbstnlt6t1Vp4WPPrn4j2rPYOAvt4Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234275},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.19.6","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.4_1767642385576_0.5656118589420591","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.5","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"6c13bbb9fe9e59d7b08ec07b9565180a4326f7ac","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.5.tgz","fileCount":50,"integrity":"sha512-yZ+aIRoV1oWqsB+5Alw8mjD2kc+dbpRF/wzdCDU6nb8WmRLotyFKiQQiE9+1VmYwB0D0hpdzjwTnh2THD2Yxpg==","signatures":[{"sig":"MEYCIQDti0bOkev/XKoi+wI0BrGnXWs6rgwzccHuTdsA+7FufgIhAIgrgCh9W32RAvI9Q1HgeC7GZ549/gaypuiWkEkgEL61","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234484},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.0.5.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"_resolved":"/tmp/02fe4aa6c68ede22e8ac099981b2242a/bernierllc-social-media-content-type-bluesky-1.0.5.tgz","_integrity":"sha512-yZ+aIRoV1oWqsB+5Alw8mjD2kc+dbpRF/wzdCDU6nb8WmRLotyFKiQQiE9+1VmYwB0D0hpdzjwTnh2THD2Yxpg==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.11.0","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.20.0","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.0.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.5_1773078194084_0.7072042316849305","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.0.6","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.0.6","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"dd9fe0eeb578492715104d8944e5fcfb5303bb43","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.0.6.tgz","fileCount":50,"integrity":"sha512-vPvpftaXqaHjIsQTqxKLXIDFgmGAjGXi25I68WVPd1HX1aL/zzT5sHjDKvSaemigxkskId3r3+OXWWxd696Taw==","signatures":[{"sig":"MEQCIEfMVW5sCUbjaEUSn/rAIjW3ofWbMYizXvjxvA3RHhGCAiAeCNkldxKZJMzh/DQNSGMUk3zBnYctg17Mc1XHcfS/AQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234751},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.0.6.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-bluesky/bernierllc-social-media-content-type-bluesky-1.0.6.tgz","_integrity":"sha512-vPvpftaXqaHjIsQTqxKLXIDFgmGAjGXi25I68WVPd1HX1aL/zzT5sHjDKvSaemigxkskId3r3+OXWWxd696Taw==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.11.0","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.20.0","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.0.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.0.6_1773163297618_0.330095005744675","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.1.0","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"c838961515a0c4c50591bc8915682c8032c0e5c8","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.1.0.tgz","fileCount":50,"integrity":"sha512-baE9Ur0KqBwVSsSGLzTPxpXU+p1WF4PbZ/0BMvZ7WlutCK+xxbd93LIxagc5620F6RNNTP6uoGc/cISgZprIvA==","signatures":[{"sig":"MEUCIQCKfa6Bfmj0ASLucxk8AHxrubQzwkloi072t7hVT+D+nwIgDuyzeBbWEiEwe+VbGC1ptDa6Zxsb7dm3yhRAPQLZEiw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234966},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.1.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-bluesky/bernierllc-social-media-content-type-bluesky-1.1.0.tgz","_integrity":"sha512-baE9Ur0KqBwVSsSGLzTPxpXU+p1WF4PbZ/0BMvZ7WlutCK+xxbd93LIxagc5620F6RNNTP6uoGc/cISgZprIvA==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.14.1","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.20.2","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.1.0_1779221429518_0.1860095052899089","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.3.0","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-content-type-bluesky@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"963043b0ac2e0859101cfe83030877714e40fc4d","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.3.0.tgz","fileCount":30,"integrity":"sha512-y4tFdHa8VaQgu30hWaGg46RoS12JTerCAoETy2m6kIRxHrGPqnUDV2lN3N+VNOC7RDUBRv3EwDRhcyimnmhlLA==","signatures":[{"sig":"MEQCIBKl2pbE9XeVkooLJ1Vvp9jPpsqJPBsgKLxzmrpdo6h4AiB5aig4Vk5ZZ5FlK7vDBZqDfxvyWHDhi0wYCAxBBhhF5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127317},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-bluesky-1.3.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-bluesky/bernierllc-social-media-content-type-bluesky-1.3.0.tgz","_integrity":"sha512-y4tFdHa8VaQgu30hWaGg46RoS12JTerCAoETy2m6kIRxHrGPqnUDV2lN3N+VNOC7RDUBRv3EwDRhcyimnmhlLA==","bernierllc":{"integration":{"neverhub":"optional"}},"_npmVersion":"11.14.1","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","directories":{},"_nodeVersion":"20.20.2","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/parser":"^7.1.0","@typescript-eslint/eslint-plugin":"^7.1.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-bluesky_1.3.0_1779241417720_0.39963628366785975","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/social-media-content-type-bluesky","version":"1.4.0","description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","main":"dist/index.js","types":"dist/index.d.ts","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.4.0"},"devDependencies":{"@types/jest":"^29.5.12","@types/node":"^20.11.24","@types/validator":"^13.11.9","@typescript-eslint/eslint-plugin":"^7.1.0","@typescript-eslint/parser":"^7.1.0","eslint":"^8.57.0","jest":"^29.7.0","ts-jest":"^29.1.2","typescript":"^5.3.3"},"bernierllc":{"integration":{"neverhub":"optional"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src/**/*.ts","clean":"rm -rf dist"},"_id":"@bernierllc/social-media-content-type-bluesky@1.4.0","_integrity":"sha512-3Y9zLr55yLJdfrKbLp0cKy9ZXtQh1kj4GDbBmgTQRQSab5vH1FL0+xstIMabRNVduPP2jyFA6IeCxVWRnFadQg==","_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-bluesky/bernierllc-social-media-content-type-bluesky-1.4.0.tgz","_from":"file:bernierllc-social-media-content-type-bluesky-1.4.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-3Y9zLr55yLJdfrKbLp0cKy9ZXtQh1kj4GDbBmgTQRQSab5vH1FL0+xstIMabRNVduPP2jyFA6IeCxVWRnFadQg==","shasum":"100e8e2a7813670c530a38cd00e375cbb33ae449","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-bluesky/-/social-media-content-type-bluesky-1.4.0.tgz","fileCount":30,"unpackedSize":127317,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICrR/qudJPkBnj7vjqmWUUbiT2OA63kIB3YZtkMk/qPXAiEAmDWW8YO40+cgDcvdW2anccEGCdUyzxv783wBN/qRP50="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:385da2db-f8a5-4440-a76e-765dfc275249"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/social-media-content-type-bluesky_1.4.0_1779250164701_0.45630485500105045"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-13T05:47:29.403Z","modified":"2026-05-20T04:09:25.147Z","1.0.0":"2025-10-13T05:47:29.686Z","1.0.1":"2025-12-21T00:25:16.755Z","1.0.2":"2025-12-21T02:18:17.268Z","1.0.4":"2026-01-05T19:46:25.693Z","1.0.5":"2026-03-09T17:43:14.229Z","1.0.6":"2026-03-10T17:21:37.770Z","1.1.0":"2026-05-19T20:10:29.662Z","1.3.0":"2026-05-20T01:43:37.860Z","1.4.0":"2026-05-20T04:09:24.971Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["bluesky","at-protocol","social-media","content-type","did","facets","validation","accessibility","rich-text"],"description":"BlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/social-media-content-type-bluesky\n\nBlueSky-specific content type definition and validation supporting AT Protocol (Authenticated Transfer Protocol) federation.\n\n## Installation\n\n```bash\nnpm install @bernierllc/social-media-content-type-bluesky\n```\n\n## Key Features\n\n- **AT Protocol Support**: Full support for decentralized AT Protocol with DIDs, AT URIs, and CIDs\n- **Rich Text Facets**: Automatic extraction and validation of mentions, links, and hashtags with correct UTF-8 byte positioning\n- **Accessibility-First**: Required alt text for all images (BlueSky platform requirement)\n- **Unicode/GraphemeHandling**: Proper grapheme cluster counting for text limits (300 graphemes max)\n- **Content Transformation**: Convert from generic social media, Twitter, and blog post formats to BlueSky\n- **Builder Pattern**: Fluent API for constructing valid BlueSky content\n- **Thread Generation**: Auto-split long content into properly formatted threads\n\n## Installation\n\n```bash\nnpm install @bernierllc/social-media-content-type-bluesky\n```\n\n## Usage\n\nThe package provides three main classes for working with BlueSky content:\n\n1. **BlueSkyContentBuilder** - Fluent API for building BlueSky posts\n2. **BlueSkyContentValidator** - Validate content against BlueSky's rules\n3. **BlueSkyContentTransformer** - Convert content from other formats\n\n## Quick Start\n\n```typescript\nimport { BlueSkyContentBuilder, BlueSkyContentValidator } from '@bernierllc/social-media-content-type-bluesky';\n\n// Build a simple post\nconst builder = new BlueSkyContentBuilder();\nconst content = await builder\n  .setText('Hello @alice.bsky.social! Check out https://example.com #bluesky')\n  .setLanguages(['en'])\n  .autoExtractFacets() // Automatically extracts mentions, links, hashtags\n  .build();\n\n// Validate content\nconst validator = new BlueSkyContentValidator();\nconst result = validator.validate(content);\n\nif (result.valid) {\n  console.log('Content is valid!');\n  console.log(`Text: ${result.graphemeCount} graphemes, ${result.textBytes} bytes`);\n  console.log(`Facets: ${result.facetCount}`);\n  console.log(`Alt Text Status: ${result.altTextStatus}`);\n} else {\n  console.error('Validation errors:', result.errors);\n}\n```\n\n## Core API\n\n### BlueSkyContentValidator\n\nValidates BlueSky content against platform constraints:\n\n```typescript\nconst validator = new BlueSkyContentValidator();\n\n// Validate complete content\nconst result = validator.validate(content);\n\n// Validate specific aspects\nvalidator.validateText(text); // Check text length (max 300 graphemes)\nvalidator.validateFacets(facets, text); // Check facet byte positions\nvalidator.validateAltText(embed); // Ensure images have alt text\nvalidator.validateImages(images); // Check image count and sizes\n```\n\n### BlueSkyContentBuilder\n\nFluent API for building BlueSky content:\n\n```typescript\nconst content = await new BlueSkyContentBuilder()\n  .setText('Your post text here')\n  .addImage({\n    alt: 'Description of the image', // Required!\n    image: blobRef\n  })\n  .addMention('did:plc:abc123', '@alice')\n  .addLink('https://example.com', 'https://example.com')\n  .addHashtag('bluesky')\n  .setLanguages(['en'])\n  .buildAndValidate(); // Validates before returning\n```\n\n### BlueSkyContentTransformer\n\nTransform content from other platforms to BlueSky:\n\n```typescript\nconst transformer = new BlueSkyContentTransformer();\n\n// From generic social content\nconst bluesky = await transformer.fromGeneric({\n  text: 'Hello world!',\n  images: [{ url: 'https://...', alt: 'Image description' }],\n  hashtags: ['#test']\n});\n\n// From Twitter\nconst bluesky = await transformer.fromTwitter(twitterContent);\n\n// From blog post\nconst bluesky = await transformer.fromBlogPost(blogContent);\n\n// To generic format\nconst generic = transformer.toGeneric(blueskyContent);\n```\n\n### ThreadGenerator\n\nSplit long content into threads:\n\n```typescript\nimport { ThreadGenerator } from '@bernierllc/social-media-content-type-bluesky';\n\nconst generator = new ThreadGenerator();\nconst thread = generator.splitIntoThread(longText, {\n  maxGraphemes: 290, // Leave room for thread numbers\n  addThreadNumbers: true,\n  splitAtSentences: true,\n  preserveHashtags: true\n});\n\n// Returns array of BlueSkyContent objects\nconsole.log(`Split into ${thread.length} posts`);\n```\n\n### BlueSkyDIDUtils\n\nWork with Decentralized Identifiers:\n\n```typescript\nimport { BlueSkyDIDUtils } from '@bernierllc/social-media-content-type-bluesky';\n\n// Parse DID\nconst { method, identifier } = BlueSkyDIDUtils.parseDID('did:plc:abc123');\n\n// Validate DID\nconst isValid = BlueSkyDIDUtils.validateDID('did:plc:abc123');\n\n// Resolve handle to DID\nconst did = await BlueSkyDIDUtils.resolveHandle('alice.bsky.social');\n\n// Format AT URI\nconst uri = BlueSkyDIDUtils.formatATUri(did, 'app.bsky.feed.post', 'rkey');\n// Returns: at://did:plc:abc123/app.bsky.feed.post/rkey\n\n// Parse AT URI\nconst { did, collection, rkey } = BlueSkyDIDUtils.parseATUri(uri);\n```\n\n### BlueSkyFacetExtractor\n\nExtract rich text annotations:\n\n```typescript\nimport { BlueSkyFacetExtractor } from '@bernierllc/social-media-content-type-bluesky';\n\nconst extractor = new BlueSkyFacetExtractor();\n\n// Extract all facets (mentions, links, hashtags)\nconst facets = await extractor.extractAll('Hello @alice check https://example.com #test');\n\n// Extract specific types\nconst mentions = await extractor.extractMentions(text);\nconst links = extractor.extractLinks(text);\nconst hashtags = extractor.extractHashtags(text);\n```\n\n## Platform Constraints\n\n```typescript\nimport { BLUESKY_CONSTRAINTS } from '@bernierllc/social-media-content-type-bluesky';\n\nconsole.log(BLUESKY_CONSTRAINTS);\n// {\n//   maxTextLength: 300,        // Grapheme count, not bytes!\n//   maxTextBytes: 3000,        // Max UTF-8 bytes\n//   maxImages: 4,\n//   maxFacets: 100,\n//   maxImageSize: 1048576,     // 1MB\n//   maxVideoSize: 52428800,    // 50MB\n//   altTextRequired: true,     // BlueSky requirement\n//   maxAltTextLength: 1000,\n//   ...\n// }\n```\n\n## Important: UTF-8 Byte Positioning\n\n**CRITICAL**: BlueSky facets use UTF-8 byte positions, NOT character positions. This package handles this automatically, but if you're working with facets directly, be aware:\n\n```typescript\nconst text = \"Hello 👋 @alice\";\n// Character positions: H=0, e=1, l=2, l=3, o=4, space=5, emoji=6, space=7, @=8...\n// BUT byte positions: H=0, e=1, l=2, l=3, o=4, space=5, emoji=6-9 (4 bytes!), space=10, @=11...\n\n// The mention \"@alice\" starts at byte 11, not character 8!\n```\n\nUse `countBytes()` and `findBytePosition()` utilities to work with byte positions correctly.\n\n## Examples\n\n### Post with Image and Alt Text\n\n```typescript\nconst content = await new BlueSkyContentBuilder()\n  .setText('Beautiful sunset over the ocean')\n  .addImage({\n    alt: 'A vibrant orange and pink sunset reflecting on calm ocean waters',\n    image: {\n      $type: 'blob',\n      ref: { $link: 'bafyreiabc123...' }, // CID from BlueSky blob storage\n      mimeType: 'image/jpeg',\n      size: 524288\n    },\n    aspectRatio: { width: 1920, height: 1080 }\n  })\n  .buildAndValidate();\n```\n\n### Quote Post\n\n```typescript\nconst content = await new BlueSkyContentBuilder()\n  .setText('Great point!')\n  .setQuotePost({\n    uri: 'at://did:plc:abc123/app.bsky.feed.post/xyz789',\n    cid: 'bafyreiabc...'\n  })\n  .build();\n```\n\n### Reply with Threadgate\n\n```typescript\nconst content = await new BlueSkyContentBuilder()\n  .setText('Thanks for sharing!')\n  .setReply({\n    root: { uri: 'at://...', cid: '...' },\n    parent: { uri: 'at://...', cid: '...' }\n  })\n  .setThreadgate({\n    $type: 'app.bsky.feed.threadgate',\n    allow: [\n      { $type: 'app.bsky.feed.threadgate#mentionRule' },\n      { $type: 'app.bsky.feed.threadgate#followingRule' }\n    ]\n  })\n  .build();\n```\n\n## Integration Status\n\n### Logger Integration\n**Status**: Not applicable\n\n**Justification**: This is a pure content type definition package with no runtime operations, side effects, or error conditions that require logging. The BlueSkyContentValidator, BlueSkyContentBuilder, and BlueSkyContentTransformer classes are stateless utility classes that perform validation, building, and transformation operations. All errors are thrown as exceptions that calling code can handle, and there are no background operations, network calls, or state changes that would benefit from structured logging.\n\n**Pattern**: Pure functional utility - no logger integration needed. Logging is handled by consuming packages that use this content type.\n\n### NeverHub Integration\n**Status**: Optional\n\n**Justification**: This package can optionally register itself with NeverHub for service discovery. Content type packages can register themselves with NeverHub so that services can discover available content types at runtime. This enables dynamic content type discovery and allows services to adapt to available content types without hard-coded dependencies. The registration schema is available via `BLUESKY_CONTENT_TYPE_REGISTRATION`.\n\n**Pattern**: Optional service discovery integration - package can register content type with NeverHub for runtime discovery.\n\n**Example Integration**:\n```typescript\nimport { BLUESKY_CONTENT_TYPE_REGISTRATION } from '@bernierllc/social-media-content-type-bluesky';\n\n// Register with NeverHub (if available)\nif (typeof detectNeverHub === 'function') {\n  neverhub.registerContentType(BLUESKY_CONTENT_TYPE_REGISTRATION);\n}\n```\n\n### Docs-Suite Integration\n**Status**: Ready\n\n**Format**: TypeDoc-compatible JSDoc comments are included throughout the source code. All public APIs are documented with examples and type information.\n\n## NeverHub Content Type Registration\n\n```typescript\nimport { BLUESKY_CONTENT_TYPE_REGISTRATION } from '@bernierllc/social-media-content-type-bluesky';\n\n// Register with NeverHub for content type discovery\nneverhub.registerContentType(BLUESKY_CONTENT_TYPE_REGISTRATION);\n// Enables:\n// - Content type validation\n// - Automatic transformation routing\n// - Schema-based validation\n// - Platform capability discovery\n```\n\n## TypeScript Types\n\nAll interfaces and types are fully exported for TypeScript users:\n\n```typescript\nimport type {\n  BlueSkyContent,\n  BlueSkyFacet,\n  BlueSkyEmbed,\n  BlueSkyImage,\n  BlueSkyVideo,\n  BlueSkyExternal,\n  BlueSkyRecord,\n  BlueSkyReply,\n  BlueSkyMetadata,\n  BlueSkyLabel,\n  BlueSkyThreadgate,\n  BlueSkyValidationResult,\n  BlueSkyValidationError,\n  BlueSkyValidationWarning\n} from '@bernierllc/social-media-content-type-bluesky';\n```\n\n## See Also\n\n- [@bernierllc/social-media-content-type-twitter](../social-media-content-type-twitter) - Similar post structure\n- [@bernierllc/social-media-content-type-mastodon](../social-media-content-type-mastodon) - Similar federated model\n- [@bernierllc/social-media-bluesky](../../service/social-media-bluesky) - Service layer for publishing to BlueSky\n- [@bernierllc/crypto-utils](../crypto-utils) - Used for DID and hash generation\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n","readmeFilename":"README.md"}