{"_id":"@bernierllc/social-media-content-type-twitter","_rev":"9-50f49f5e123a1720144991641b731087","name":"@bernierllc/social-media-content-type-twitter","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.0","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"3d6b47523c323815a294baf577ce7f547f8f6785","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.0.tgz","fileCount":40,"integrity":"sha512-tEDD2nlhBU/eK9XewTCg/w8ftPgnT9LfjX5nigktkbzsPWwkjgFyyHpVuYxM2mGaDe8htuDBLJtbDYFNGq1yVg==","signatures":[{"sig":"MEYCIQDZsrZLWQBMGSLBejYspr2jxz0B2/eMKbdaU4wCRMdh9QIhAK0OkiLG0+9R8HoA2B466k/sjvRrdmLatj2sT4OwzdoI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169098},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"58d62967c6feabbe9d8d9a19c178e9ce7896f298","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"},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.4.2","description":"Twitter/X-specific content type definition and validation","directories":{},"_nodeVersion":"24.4.1","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"^1.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.0_1760328723834_0.02205650089794342","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.1","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"63f5e7d44ba67e6122d7d195a6286f05a01f4369","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.1.tgz","fileCount":41,"integrity":"sha512-1rDBF/FjojUNvzwR2vfbunVLVaPnn9MfRR8eTFY3x1qPeraKYrn+BPBm2vCow5Bw2Ftv+nBQDGQ911N6mcNiVg==","signatures":[{"sig":"MEUCIBLIKMiP5FjrLVeXVFyc6i5ePyLDpejquKv+ygw4u11gAiEA8CbenlDz5AE6Z2TJJyj4WKno4NiwHA9mv8Xfdx/FTkM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170974},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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/890e7ae7201cfba9df7af6d1bd2ed46a/bernierllc-social-media-content-type-twitter-1.0.1.tgz","_integrity":"sha512-1rDBF/FjojUNvzwR2vfbunVLVaPnn9MfRR8eTFY3x1qPeraKYrn+BPBm2vCow5Bw2Ftv+nBQDGQ911N6mcNiVg==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.7.0","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.1_1766276721962_0.5498541781450506","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.2","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"435192d3c06aaa1c2cad52bf4e5ca6df93e0688f","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.2.tgz","fileCount":41,"integrity":"sha512-su3Z5P2VOufop1kZeQn/NlHz25k2h+hDgittuQHO4jTequ6bSloSpIi3WCvfrpQxeSf46/Gl5mxOFfXVk3jn1g==","signatures":[{"sig":"MEQCICBbp6t4vQ42nx+lm5RGiNtSPBQB/PAilgqmRBWxKApqAiBRZyh7UcjTD8faJxwcBPUGzV6c1imGTLzfrHzjro5gUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171162},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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/916b5b810aaf1ee60c298672420afddc/bernierllc-social-media-content-type-twitter-1.0.2.tgz","_integrity":"sha512-su3Z5P2VOufop1kZeQn/NlHz25k2h+hDgittuQHO4jTequ6bSloSpIi3WCvfrpQxeSf46/Gl5mxOFfXVk3jn1g==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.7.0","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.2_1766283500478_0.6742952306625063","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.4","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"08194a7a226e59f6f9ca5ac22d0ed125dc5bab73","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.4.tgz","fileCount":41,"integrity":"sha512-PtBQRXlq9lsMJjuWmZxQKJmB1s1cewuYBEUWMsoR0hJjLPDFpwid8RgPOzoqHxQG7iE5OZG0+WHRPxenqh12TQ==","signatures":[{"sig":"MEYCIQDmTE18ODyivqL1SxBjHwq26zK1Nb9e8g8WDr2O3X9VXQIhANoL3PM12uVemNpyLZ6oe0qrrIjahbZRl6rjPYB09mU6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172918},"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:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.4_1767642389430_0.5841164593914658","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.5","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"83aa169a2e03a1988c282d1969e307dd1d535182","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.5.tgz","fileCount":41,"integrity":"sha512-hjVebTmuuGJuGb8yHxkJhBwSL00VPD3VKa5/9CSFg5+vhAY1QGytMmvmGXwBWLzCEKCjCHbTfu1r4GCbDb0olw==","signatures":[{"sig":"MEUCIG78pRBhEDwh959lrHhP4XitA/5T/2s/JJMpKUaJF/XGAiEA0qb+kke2Hpa0KEWI4Zi5AXpaaF8XncXTtxsuqYm11Kw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173127},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"_resolved":"/tmp/59ff985fe2dbd0ac0a7df8ec6e536f00/bernierllc-social-media-content-type-twitter-1.0.5.tgz","_integrity":"sha512-hjVebTmuuGJuGb8yHxkJhBwSL00VPD3VKa5/9CSFg5+vhAY1QGytMmvmGXwBWLzCEKCjCHbTfu1r4GCbDb0olw==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.11.0","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.5_1773078206337_0.3961204322477405","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.0.6","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.0.6","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"28337593d2ae633aa1dfc35db9bd075f7a0c34da","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.0.6.tgz","fileCount":41,"integrity":"sha512-TtPCvmbmgm7XSp7vOxa3cyX9ui8YFObRIPCawGV2FVlmvTZqWpGyUyeCJKyklYs9Usxi5kXCz564onjt4TEcfw==","signatures":[{"sig":"MEYCIQDyszjF4kEaMzronD5lhJcNqm0ZswZ527LDx10vZOCLEQIhAMHbFIaVlR5CRGgvvFR3u5cL0nXdfM1tyh6pn7yPVaVz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173394},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-twitter/bernierllc-social-media-content-type-twitter-1.0.6.tgz","_integrity":"sha512-TtPCvmbmgm7XSp7vOxa3cyX9ui8YFObRIPCawGV2FVlmvTZqWpGyUyeCJKyklYs9Usxi5kXCz564onjt4TEcfw==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.11.0","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.0.6_1773163318267_0.07827532115711078","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.1.0","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"943e6831cacd6abced6eec628c5cb85e2b8e95eb","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.1.0.tgz","fileCount":41,"integrity":"sha512-08LnamhQfMKaMyc5PUPqfRAovfzip6lFjQrT22O6O5GWC/y2shKad6e280dIprunOVY+ehQyRnHlGJWmBHXSDQ==","signatures":[{"sig":"MEUCIQDcm8Oz84h2tdof4zk7K3NoPgMhQKQE3uQesCUCth5rGAIgJ+2hMH0HFfcPGWG18Ykq1ixQhta2noVbKTGM1eJrX7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173609},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-twitter/bernierllc-social-media-content-type-twitter-1.1.0.tgz","_integrity":"sha512-08LnamhQfMKaMyc5PUPqfRAovfzip6lFjQrT22O6O5GWC/y2shKad6e280dIprunOVY+ehQyRnHlGJWmBHXSDQ==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.14.1","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.1.0_1779221451027_0.6108724875196432","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.3.0","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/social-media-content-type-twitter@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"bc94bb5a0fdfca9c31783cb7c4538c6ff67ca7bb","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.3.0.tgz","fileCount":22,"integrity":"sha512-vrgYdGApdyLou6D8qmrFlfu/0dddq4cjxdHrrkdBEFyt4sgyfBNBJXlqljlLr+2qA5/DlClXaAIhn/UJzoaRjQ==","signatures":[{"sig":"MEUCIHCOCTdzgnZ/kJrVBA+9a4wUWIHb+QBuIlFgJj6SSkR4AiEA7cCq1J8Xl4zSDB3XhzD3uDV5ZsUW4z4HhdR1Ne48qZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66754},"main":"dist/index.js","_from":"file:bernierllc-social-media-content-type-twitter-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:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-twitter/bernierllc-social-media-content-type-twitter-1.3.0.tgz","_integrity":"sha512-vrgYdGApdyLou6D8qmrFlfu/0dddq4cjxdHrrkdBEFyt4sgyfBNBJXlqljlLr+2qA5/DlClXaAIhn/UJzoaRjQ==","repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/social-media-content-type-twitter"},"_npmVersion":"11.14.1","description":"Twitter/X-specific content type definition and validation","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.56.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-content-type-twitter_1.3.0_1779241439486_0.8033685317662977","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/social-media-content-type-twitter","version":"1.4.0","description":"Twitter/X-specific content type definition and validation","main":"dist/index.js","types":"dist/index.d.ts","keywords":["twitter","social-media","content-type","validation","transformation"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","dependencies":{"validator":"^13.12.0","@bernierllc/crypto-utils":"1.4.0"},"devDependencies":{"@types/jest":"^29.5.12","@types/node":"^20.11.19","@types/validator":"^13.11.8","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","eslint":"^8.56.0","jest":"^29.7.0","ts-jest":"^29.1.2","typescript":"^5.3.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/core/social-media-content-type-twitter"},"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-twitter@1.4.0","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"homepage":"https://github.com/BernierLLC/tools#readme","_integrity":"sha512-Rw9e2OMK4gKKhzBxxF3Shxcw65+1nE9KoW2LfuBg17h5eymwr3M7u/GPTWj4YpiLJiQlXgkI3sKwmJYNunFPPw==","_resolved":"/home/runner/work/tools/tools/packages/core/social-media-content-type-twitter/bernierllc-social-media-content-type-twitter-1.4.0.tgz","_from":"file:bernierllc-social-media-content-type-twitter-1.4.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-Rw9e2OMK4gKKhzBxxF3Shxcw65+1nE9KoW2LfuBg17h5eymwr3M7u/GPTWj4YpiLJiQlXgkI3sKwmJYNunFPPw==","shasum":"68724c47cda31d15b319a03918e5321c57dd8c5b","tarball":"https://registry.npmjs.org/@bernierllc/social-media-content-type-twitter/-/social-media-content-type-twitter-1.4.0.tgz","fileCount":22,"unpackedSize":66754,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFpHasQCc4v0IONMAE7bJGuJdEHZDR5vNunYswFWH215AiEAxamYEQbvUakJEqzpKZvoUd1+oliqNNmENVfYK746qnw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9c9e49a5-d281-4d7a-bb0e-499c419be8eb"}},"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-twitter_1.4.0_1779250185896_0.47677157349634625"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-13T04:12:03.724Z","modified":"2026-05-20T04:09:46.162Z","1.0.0":"2025-10-13T04:12:04.016Z","1.0.1":"2025-12-21T00:25:22.100Z","1.0.2":"2025-12-21T02:18:20.639Z","1.0.4":"2026-01-05T19:46:29.574Z","1.0.5":"2026-03-09T17:43:26.488Z","1.0.6":"2026-03-10T17:21:58.480Z","1.1.0":"2026-05-19T20:10:51.172Z","1.3.0":"2026-05-20T01:43:59.632Z","1.4.0":"2026-05-20T04:09:46.027Z"},"bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","homepage":"https://github.com/BernierLLC/tools#readme","keywords":["twitter","social-media","content-type","validation","transformation"],"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/core/social-media-content-type-twitter"},"description":"Twitter/X-specific content type definition and validation","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/social-media-content-type-twitter\n\nTwitter/X-specific content type definition and validation package for BernierLLC social media management system.\n\n## Installation\n\n```bash\nnpm install @bernierllc/social-media-content-type-twitter\n```\n\n## Features\n\n- **Platform-specific Constraints** - Twitter/X character limits, media rules, poll configuration\n- **Accurate Character Counting** - Handles Twitter's URL shortening (23 chars), emojis, and media\n- **Thread Generation** - Automatically split long content into threaded tweets\n- **Content Validation** - Comprehensive validation against Twitter's platform rules\n- **Content Transformation** - Convert between generic social content and Twitter format\n- **Fluent Builder API** - Easy content creation with method chaining\n- **TypeScript First** - Full type safety with strict mode\n\n## Usage\n\n### Basic Tweet Creation\n\n```typescript\nimport { TwitterContentBuilder } from '@bernierllc/social-media-content-type-twitter';\n\nconst builder = new TwitterContentBuilder();\n\nconst tweet = builder\n  .setText('Hello, Twitter! Check out our new product.')\n  .addImage('https://example.com/product.jpg', 'Product screenshot')\n  .addHashtag('product')\n  .addHashtag('launch')\n  .build();\n\nconsole.log(tweet);\n// {\n//   text: 'Hello, Twitter! Check out our new product.',\n//   media: [{ type: 'image', url: '...', altText: '...' }]\n// }\n```\n\n### Content Validation\n\n```typescript\nimport { TwitterContentValidator } from '@bernierllc/social-media-content-type-twitter';\n\nconst validator = new TwitterContentValidator();\n\nconst result = validator.validate({\n  text: 'My tweet text with https://example.com',\n  media: [\n    { type: 'image', url: 'https://example.com/image.jpg' }\n  ]\n});\n\nif (result.valid) {\n  console.log('Tweet is valid!');\n  console.log('Character count:', result.textLength);\n} else {\n  console.error('Validation errors:', result.errors);\n}\n```\n\n### Character Counting\n\n```typescript\nimport {\n  countCharacters,\n  getCharacterBreakdown\n} from '@bernierllc/social-media-content-type-twitter';\n\n// Simple character count (URLs = 23 chars)\nconst count = countCharacters('Check https://example.com for info');\nconsole.log(count); // \"Check \" (6) + 23 + \" for info\" (9) = 38\n\n// Detailed breakdown\nconst breakdown = getCharacterBreakdown(\n  'Visit https://example.com and https://test.com',\n  true // has media\n);\n\nconsole.log(breakdown);\n// {\n//   total: 61,\n//   text: 15,\n//   urls: 46,  // 2 URLs × 23 chars\n//   urlCount: 2,\n//   media: 23,\n//   remaining: 219\n// }\n```\n\n### Thread Generation\n\n```typescript\nimport { splitIntoThread } from '@bernierllc/social-media-content-type-twitter';\n\nconst longText = `\nThis is a very long blog post that exceeds Twitter's 280 character limit.\nIt will be automatically split into multiple tweets while preserving\nsentence boundaries and hashtags. The thread generator is smart enough\nto handle URLs, emojis, and special characters correctly.\n`;\n\nconst thread = splitIntoThread(longText, {\n  numberTweets: true,           // Add \"1/5\", \"2/5\", etc.\n  preserveHashtags: 'both',     // Add hashtags to first and last\n  maxLength: 280\n});\n\nconsole.log(thread);\n// [\n//   { text: 'This is a very long blog post... 1/3' },\n//   { text: 'It will be automatically split... 2/3' },\n//   { text: 'to handle URLs, emojis... 3/3' }\n// ]\n```\n\n### Content Transformation\n\n```typescript\nimport { TwitterContentTransformer } from '@bernierllc/social-media-content-type-twitter';\n\nconst transformer = new TwitterContentTransformer();\n\n// From generic social content\nconst generic = {\n  text: 'Check out my blog post',\n  links: ['https://blog.example.com/post'],\n  hashtags: ['blog', 'tech'],\n  images: ['https://blog.example.com/image.jpg']\n};\n\nconst twitter = transformer.fromGeneric(generic);\n// {\n//   text: 'Check out my blog post https://blog.example.com/post #blog #tech',\n//   media: [{ type: 'image', url: 'https://blog.example.com/image.jpg' }]\n// }\n\n// From blog post to thread\nconst blog = {\n  title: 'My Awesome Blog Post',\n  excerpt: 'A detailed look at...',\n  url: 'https://blog.example.com/post',\n  featuredImage: 'https://blog.example.com/image.jpg',\n  tags: ['tech', 'tutorial']\n};\n\nconst blogThread = transformer.fromBlogPost(blog);\n// [\n//   {\n//     text: 'My Awesome Blog Post https://blog.example.com/post #tech #tutorial',\n//     media: [{ type: 'image', url: '...' }]\n//   },\n//   { text: 'A detailed look at...' }\n// ]\n```\n\n### Poll Creation\n\n```typescript\nconst builder = new TwitterContentBuilder();\n\nconst pollTweet = builder\n  .setText('What is your favorite programming language?')\n  .createPoll(\n    ['JavaScript', 'TypeScript', 'Python', 'Go'],\n    1440  // Duration in minutes (24 hours)\n  )\n  .build();\n\nconsole.log(pollTweet);\n// {\n//   text: 'What is your favorite programming language?',\n//   poll: {\n//     options: ['JavaScript', 'TypeScript', 'Python', 'Go'],\n//     durationMinutes: 1440\n//   }\n// }\n```\n\n### Reply and Quote Tweets\n\n```typescript\n// Reply to a tweet\nconst reply = builder\n  .setText('Great point! I completely agree.')\n  .setReplyTo('1234567890')  // Tweet ID to reply to\n  .build();\n\n// Quote tweet\nconst quote = builder\n  .setText('This is exactly what I was thinking!')\n  .setQuoteTweet('9876543210')  // Tweet ID to quote\n  .build();\n```\n\n## API Reference\n\n### Types\n\n#### `TwitterContent`\n```typescript\ninterface TwitterContent {\n  text: string;\n  media?: TwitterMedia[];\n  quoteTweet?: string;\n  replyTo?: string;\n  poll?: TwitterPoll;\n}\n```\n\n#### `TwitterMedia`\n```typescript\ninterface TwitterMedia {\n  type: 'image' | 'video' | 'gif';\n  url: string;\n  altText?: string;\n  dimensions?: {\n    width: number;\n    height: number;\n  };\n}\n```\n\n#### `TwitterPoll`\n```typescript\ninterface TwitterPoll {\n  options: string[];        // 2-4 options\n  durationMinutes: number;  // 5-10080 (7 days)\n}\n```\n\n### Classes\n\n#### `TwitterContentBuilder`\nFluent builder for creating Twitter content.\n\n**Methods:**\n- `setText(text: string): this` - Set tweet text\n- `addImage(url: string, altText?: string): this` - Add image\n- `addVideo(url: string, altText?: string): this` - Add video\n- `addGif(url: string, altText?: string): this` - Add GIF\n- `createPoll(options: string[], durationMinutes: number): this` - Add poll\n- `setReplyTo(tweetId: string): this` - Set reply-to tweet\n- `setQuoteTweet(tweetId: string): this` - Set quote tweet\n- `addHashtag(tag: string): this` - Add hashtag to metadata\n- `addMention(username: string): this` - Add mention to metadata\n- `build(): TwitterContent` - Build content\n- `buildWithMetadata()` - Build content with metadata\n- `validate(): TwitterValidationResult` - Validate current content\n- `reset(): this` - Reset builder\n- `clone(): TwitterContentBuilder` - Clone builder state\n\n#### `TwitterContentValidator`\nValidates Twitter content against platform constraints.\n\n**Methods:**\n- `validate(content: TwitterContent): TwitterValidationResult` - Full validation\n- `validateText(text: string, hasMedia?: boolean): TwitterValidationError[]`\n- `validateMedia(media: TwitterMedia[]): TwitterValidationError[]`\n- `validatePoll(poll: TwitterPoll): TwitterValidationError[]`\n- `countCharacters(text: string): number`\n\n#### `TwitterContentTransformer`\nTransforms content between formats.\n\n**Methods:**\n- `fromGeneric(content: GenericSocialContent): TwitterContent`\n- `toGeneric(content: TwitterContent): GenericSocialContent`\n- `fromBlogPost(content: BlogPostContent): TwitterContent[]`\n- `optimizeForTwitter(content: TwitterContent): TwitterContent`\n- `splitIntoThread(longText: string): TwitterContent[]`\n\n### Functions\n\n#### Character Counting\n- `countCharacters(text: string): number` - Count characters with Twitter rules\n- `countCharactersWithMedia(text: string, hasMedia: boolean): number`\n- `extractUrls(text: string): string[]` - Extract URLs from text\n- `getCharacterBreakdown(text, hasMedia, maxLength): CharacterBreakdown`\n- `exceedsLimit(text, hasMedia, maxLength): boolean`\n\n#### Thread Generation\n- `splitIntoThread(longText: string, options?: ThreadOptions): TwitterContent[]`\n- `estimateTweetCount(text: string, options?: ThreadOptions): number`\n- `needsThread(text: string, maxLength?: number): boolean`\n\n### Constants\n\n#### `TWITTER_CONSTRAINTS`\n```typescript\n{\n  maxTextLength: 280,\n  maxTextLengthLongForm: 25000,\n  maxMediaItems: 4,\n  maxPollOptions: 4,\n  minPollOptions: 2,\n  maxPollDuration: 10080,      // 7 days\n  minPollDuration: 5,\n  maxAltTextLength: 1000,\n  maxHashtags: 30,\n  urlLength: 23,                // t.co shortening\n  mediaLength: 23,\n  supportedMediaTypes: ['image/png', 'image/jpeg', 'image/gif', 'video/mp4'],\n  maxImageSize: 5242880,        // 5MB\n  maxVideoSize: 536870912,      // 512MB\n  imageDimensions: {\n    minWidth: 4,\n    minHeight: 4,\n    maxWidth: 8192,\n    maxHeight: 8192\n  }\n}\n```\n\n## Twitter Character Counting Rules\n\nTwitter has specific rules for character counting:\n\n1. **URLs** - Always count as 23 characters (due to t.co shortening)\n2. **Media** - Counts as 23 characters when attached\n3. **Emojis** - Count based on their Unicode encoding (1-4 characters)\n4. **Mentions** - Count full length including @ symbol\n5. **Hashtags** - Count full length including # symbol\n\nExample:\n```typescript\nconst text = 'Check out https://example.com 👋 #awesome';\n// Character count breakdown:\n// \"Check out \" = 10\n// \"https://example.com\" = 23 (not actual length!)\n// \" \" = 1\n// \"👋\" = 2 (emoji)\n// \" \" = 1\n// \"#awesome\" = 8\n// Total = 45 characters\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 TwitterContentValidator, TwitterContentBuilder, and TwitterContentTransformer 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**: Integrated\n\n**Justification**: This package provides NeverHub service discovery integration through the `neverhub-registration.ts` module. Content type packages 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.\n\n**Pattern**: Service discovery integration - package registers content type with NeverHub for runtime discovery.\n\n**Example Integration**:\n```typescript\nimport { registerTwitterContentType } from '@bernierllc/social-media-content-type-twitter/neverhub-registration';\n\n// Register with NeverHub (if available)\nif (typeof detectNeverHub === 'function') {\n  registerTwitterContentType();\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## Dependencies\n\n- `validator` - URL and data validation utilities\n- `@bernierllc/crypto-utils` - For URL shortening hash generation (future use)\n\n## Related Packages\n\n- [@bernierllc/social-media-twitter](../social-media-twitter) - Twitter API service layer\n- [@bernierllc/social-media-manager](../social-media-manager) - Multi-platform orchestration\n- [@bernierllc/content-management-suite](../content-management-suite) - Complete content system\n- [@bernierllc/social-media-content-type-linkedin](../social-media-content-type-linkedin)\n- [@bernierllc/social-media-content-type-facebook](../social-media-content-type-facebook)\n- [@bernierllc/social-media-content-type-instagram](../social-media-content-type-instagram)\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\nThis code is licensed to the client under a limited-use license. The client may use and modify this code only within the scope of the project it was delivered for. Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n","readmeFilename":"README.md"}