{"_id":"@bernierllc/social-media-twitter","_rev":"9-36a01391dab949749dbde81346c56479","name":"@bernierllc/social-media-twitter","dist-tags":{"latest":"2.0.1"},"versions":{"1.0.0":{"name":"@bernierllc/social-media-twitter","version":"1.0.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-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":"ef0f770a8204cc834e0f26e15fd585224ceddad1","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.0.0.tgz","fileCount":14,"integrity":"sha512-SrYCH23atOuE/Z0OIUAd0YxPnS24SEu8RYx2ire6Oll2kvnNyTnyI+qJnUzwB9UpAFEV3kewiIMGZ5nlqyelXw==","signatures":[{"sig":"MEQCICvBhB9xcj6oJSHKCICvVjP37nrzE1iH2ftQi+shwfi8AiACHQ9WTZ2kbkwuj+7to52/ooXUETaCA5ztldeGzzMOLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99594},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"3b67f1c8ff8183fd193c02188e8729c84d6ec900","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:coverage":"jest --coverage --passWithNoTests","prepublishOnly":"npm run build"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.6.2","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"25.2.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.0.0_1764199239986_0.9116466753522761","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/social-media-twitter","version":"1.2.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@1.2.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":"9339899db857f963e45f46c5fef53d8b65421826","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.2.0.tgz","fileCount":14,"integrity":"sha512-s8E/pmOlghWOwv2o6xsbfUmoXeMBiGBceOr3HfgI8yrY+q7yy9aA87D0TjSR1QIJUyaheOGxoyxhuwrafd49Ig==","signatures":[{"sig":"MEYCIQDo0XiqaJYGXMNieVdQm7N4upVT3zpAcAig9fQ6ir2WZAIhAKrqnn/fc7z53UycvRxp1mBAOLNWYeHS5nNM6m2l0mDf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99700},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.2.0_1767642346949_0.4703878016691494","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/social-media-twitter","version":"1.2.1","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@1.2.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":"5c6782ac6dd199ce890f39959e13f2bc290e08b0","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.2.1.tgz","fileCount":14,"integrity":"sha512-X104fGV/3db/h1Ua4s6YwUb5K2nycevPNly8siP+51MDQ4erhiAPHWhI0KoPl9/aRsoaxcysndGq8vWgyFTJrg==","signatures":[{"sig":"MEQCIGm+9YyresBK9ChQQEATtpaNeGvf6G4zlKgpvaylct//AiAMg/baUIhIsxlRRyJ5/vHKUxGrLgR+tjex3/R9QWrM5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99603},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-1.2.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/tmp/a623e8701de20bcb3bd9e2f799340fef/bernierllc-social-media-twitter-1.2.1.tgz","_integrity":"sha512-X104fGV/3db/h1Ua4s6YwUb5K2nycevPNly8siP+51MDQ4erhiAPHWhI0KoPl9/aRsoaxcysndGq8vWgyFTJrg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.11.0","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.2.1_1773078131614_0.5599127651105449","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/social-media-twitter","version":"1.2.2","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@1.2.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":"ebdeb4ec66777b8a16e87f6b2be88dd563579862","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.2.2.tgz","fileCount":14,"integrity":"sha512-7Bg6Oq8fLTwZcdd8u8MwBzgp5xkmw1J8RSil/Ymls0aHnV54yrEIMX/lbHALXizjAYSAa77hlqSpLtBZJ2QtQw==","signatures":[{"sig":"MEQCIFPC7ySChfMe9/HRWENmQnz5w0yzA4vOU/8Zv7tgzNv6AiAZpz3BK15FxQBykCxharFJRZyRGnsDm6ygfCf3UbwoeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99603},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-1.2.2.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-1.2.2.tgz","_integrity":"sha512-7Bg6Oq8fLTwZcdd8u8MwBzgp5xkmw1J8RSil/Ymls0aHnV54yrEIMX/lbHALXizjAYSAa77hlqSpLtBZJ2QtQw==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.11.0","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.2.2_1773163674414_0.5611058586011648","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/social-media-twitter","version":"1.3.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-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":"05e8c132314efba16de972ee348097c177476780","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.3.0.tgz","fileCount":14,"integrity":"sha512-xUIcw8qaBGww7VnWotZTA3xrF2TuRKXymp7xd0PCyPtBwHQRLt3G/jAOwmIFZeV1vkevjSB1iwdYH6rQD6K0mg==","signatures":[{"sig":"MEUCICHtE8D05NcHgWD7EsjTYjuF6+c2hJRmN7fz8aGTVEHzAiEAmiWSBPgU+l7jC6G3VKop1rvCWugnmOL9INIoYwPvX5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99603},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-1.3.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-1.3.0.tgz","_integrity":"sha512-xUIcw8qaBGww7VnWotZTA3xrF2TuRKXymp7xd0PCyPtBwHQRLt3G/jAOwmIFZeV1vkevjSB1iwdYH6rQD6K0mg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.14.1","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.3.0_1779241853650_0.3879898342503716","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/social-media-twitter","version":"1.4.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@1.4.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":"9ef8305bce0f6d7208c85355818ca3c5a8cc8084","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.4.0.tgz","fileCount":18,"integrity":"sha512-qciMSw4MzLG0/lC9CYcJpVOnajUSPiYRBVoRqvAXuJC6y3Mo1/XiAldx432l8/1QV/rr8LClQ4nHLMrl8rRQnQ==","signatures":[{"sig":"MEYCIQDOLq3i7zomqk6LRfpX/ZO2LL+gpTdLg1+R1YAVQi0JxgIhAM/KCvWuzfheT33lxPi3jSBN36rux1iz4gg87ZphDXvx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102392},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-1.4.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-1.4.0.tgz","_integrity":"sha512-qciMSw4MzLG0/lC9CYcJpVOnajUSPiYRBVoRqvAXuJC6y3Mo1/XiAldx432l8/1QV/rr8LClQ4nHLMrl8rRQnQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.14.1","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.4.0_1779248459119_0.24581173393525813","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/social-media-twitter","version":"1.5.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@1.5.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":"fd83869004b961233f715f5c24293f8020521e45","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-1.5.0.tgz","fileCount":18,"integrity":"sha512-Wd1fBl3kgjgV00S4axK8X++VWGDgZR2utVe6DnBOmmItub9PIPR4BR9wGvrjqEmCtpVmWXj4t529etzfZuI6yQ==","signatures":[{"sig":"MEUCIGmouj6xEgXK4jZ0PyrSMX05NeX8/4JUImmUPPkMV+BiAiEA+v7AYpt/icUnnpONTpdVFM95m3d6z/brRDz8LBJL0rg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102392},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-1.5.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"jest --passWithNoTests --forceExit","test:coverage":"jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-1.5.0.tgz","_integrity":"sha512-Wd1fBl3kgjgV00S4axK8X++VWGDgZR2utVe6DnBOmmItub9PIPR4BR9wGvrjqEmCtpVmWXj4t529etzfZuI6yQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"11.14.1","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_1.5.0_1779250606848_0.5177413187843474","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bernierllc/social-media-twitter","version":"2.0.0","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/social-media-twitter@2.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":"27cd61cd1d2f881fa7649da91967d6f35dcce5f5","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-2.0.0.tgz","fileCount":18,"integrity":"sha512-+OOWJJGRt85I0IJHL2bbqTbEE6ZRQkAktyZv5k98tpFvC7BDTLgLZS0ydTFkyH0gpm1XQxcdqxxoQl3TdzJN5Q==","signatures":[{"sig":"MEUCIQCLYLdq26NpxGTCQAxtlDX1TJc9wcWmClL7imQNkSW++wIgPGQrR9lpKt3dZonJu1Z6g4xDd+TYT5STjbEHq66AI0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105281},"main":"dist/index.js","type":"module","_from":"file:bernierllc-social-media-twitter-2.0.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts","test":"NODE_OPTIONS='--experimental-vm-modules' jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests --forceExit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage --passWithNoTests --forceExit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-2.0.0.tgz","_integrity":"sha512-+OOWJJGRt85I0IJHL2bbqTbEE6ZRQkAktyZv5k98tpFvC7BDTLgLZS0ydTFkyH0gpm1XQxcdqxxoQl3TdzJN5Q==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"12.0.2","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@bernierllc/neverhub-adapter":"0.4.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@jest/globals":"^29.7.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/social-media-twitter_2.0.0_1785901568453_0.16905095273596538","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"_id":"@bernierllc/social-media-twitter@2.0.1","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"963045e52d04eb73ca52c98bf781519f2c858064","tarball":"https://registry.npmjs.org/@bernierllc/social-media-twitter/-/social-media-twitter-2.0.1.tgz","fileCount":19,"integrity":"sha512-ag2jxBWHnjPUVM7bN5ZDTHJ07ficcJDz0vY1cdaiKZEfGTCwTLv9Jfi5AcbRv0Gqt7b6ACd3u9cf782+T//oCw==","signatures":[{"sig":"MEYCIQC9+A+J8FgrrkGkA9AZdEEaZWhjwa2pUlcu+AoXoGUpugIhALjPf+y6EU8TFtRGnCWOLMY0h9QltAfeKQkhqzp9LrgA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDmTiTAGODPDXXOGotFNPC/kDpwWe4iDXKiuQ/AunGWTAiAukGdcmRmZaTmExJKvdRH2ud7hcPi69IIRWbnPbm2jNQ=="}],"unpackedSize":105603},"main":"dist/index.js","name":"@bernierllc/social-media-twitter","type":"module","_from":"file:bernierllc-social-media-twitter-2.0.1.tgz","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"license":"SEE LICENSE IN LICENSE","scripts":{"lint":"eslint src --ext .ts","test":"NODE_OPTIONS='--experimental-vm-modules' jest --watch","build":"tsc","clean":"rimraf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:run":"NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests --forceExit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage --passWithNoTests --forceExit"},"version":"2.0.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"d9515543-aa93-46cd-8fd1-2b3ba8a0cf36"}},"homepage":"https://github.com/bernierllc/tools#readme","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"_resolved":"/home/runner/work/tools/tools/packages/service/social-media-twitter/bernierllc-social-media-twitter-2.0.1.tgz","_integrity":"sha512-ag2jxBWHnjPUVM7bN5ZDTHJ07ficcJDz0vY1cdaiKZEfGTCwTLv9Jfi5AcbRv0Gqt7b6ACd3u9cf782+T//oCw==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"_npmVersion":"12.2.0","description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"@bernierllc/neverhub-adapter":"^0.4.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","rimraf":"^5.0.7","ts-jest":"^29.1.4","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.14.0","@jest/globals":"^29.7.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/social-media-twitter_2.0.1_1790884569971_0.8735647859644919"}}},"time":{"created":"2025-11-26T23:20:39.911Z","modified":"2026-10-01T19:56:10.432Z","1.0.0":"2025-11-26T23:20:40.202Z","1.2.0":"2026-01-05T19:45:47.085Z","1.2.1":"2026-03-09T17:42:11.770Z","1.2.2":"2026-03-10T17:27:54.623Z","1.3.0":"2026-05-20T01:50:53.791Z","1.4.0":"2026-05-20T03:40:59.273Z","1.5.0":"2026-05-20T04:16:47.011Z","2.0.0":"2026-08-05T03:46:08.593Z","2.0.1":"2026-10-01T19:56:10.074Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/bernierllc/tools#readme","keywords":["twitter","x","social-media","api","oauth2","posting","scheduling","bernierllc"],"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/service/social-media-twitter"},"description":"Twitter/X API v2 integration service with OAuth 2.0, content posting, scheduling, and rate limiting","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/social-media-twitter\n\nTwitter/X API v2 integration service with OAuth 2.0 authentication, content posting, scheduling, and rate limit management.\n\n## Installation\n\n```bash\nnpm install @bernierllc/social-media-twitter\n```\n\n## Features\n\n- **OAuth 2.0 Authentication**: Complete OAuth flow with PKCE support\n- **Tweet Posting**: Post tweets with text, media, polls, and geo\n- **Thread Creation**: Post multi-tweet threads automatically linked\n- **Media Upload**: Support for images, GIFs, and videos with chunked upload\n- **Tweet Scheduling**: Schedule tweets for future posting\n- **Interactions**: Like, unlike, retweet, quote tweet, and reply\n- **Rate Limit Management**: Automatic rate limit tracking and handling\n- **Token Management**: Optional token storage with refresh support\n\n## Usage\n\n### Basic Setup\n\n```typescript\nimport { TwitterService } from '@bernierllc/social-media-twitter';\n\nconst twitter = new TwitterService({\n  clientId: process.env.TWITTER_CLIENT_ID!,\n  clientSecret: process.env.TWITTER_CLIENT_SECRET!,\n  callbackUrl: 'https://yourapp.com/auth/twitter/callback',\n  scopes: ['tweet.read', 'tweet.write', 'users.read', 'offline.access'],\n});\n```\n\n### OAuth 2.0 Authentication\n\n```typescript\n// 1. Generate authorization URL\nconst authUrl = await twitter.getAuthorizationUrl();\n// Redirect user to authUrl\n\n// 2. Handle callback\nconst result = await twitter.handleCallback(code, state);\nif (result.success) {\n  console.log(`Authenticated as @${result.user?.username}`);\n}\n\n// 3. Refresh token when needed\nconst refreshed = await twitter.refreshAccessToken(credentials.refreshToken!);\n```\n\n### Posting Tweets\n\n```typescript\n// Simple tweet\nconst result = await twitter.postTweet({\n  text: 'Hello from @bernierllc/social-media-twitter!',\n});\n\nconsole.log(`Tweet posted: ${result.url}`);\n\n// Tweet with media\nconst mediaResult = await twitter.uploadMedia({\n  data: imageBuffer,\n  mimeType: 'image/jpeg',\n  category: 'tweet_image',\n  altText: 'A beautiful sunset',\n});\n\nconst tweetWithMedia = await twitter.postTweet({\n  text: 'Check out this photo!',\n  media: [{ mediaId: mediaResult.mediaId! }],\n});\n\n// Tweet with poll\nconst pollTweet = await twitter.postTweet({\n  text: 'What do you prefer?',\n  poll: {\n    options: ['Option A', 'Option B', 'Option C'],\n    durationMinutes: 1440, // 24 hours\n  },\n});\n```\n\n### Posting Threads\n\n```typescript\nconst thread = await twitter.postThread([\n  { text: '1/3 This is the first tweet in a thread...' },\n  { text: '2/3 This is the continuation...' },\n  { text: '3/3 And this is the conclusion!' },\n]);\n\nconsole.log(`Thread posted with ${thread.tweets?.length} tweets`);\nconsole.log(`Thread ID: ${thread.threadId}`);\n```\n\n### Scheduling Tweets\n\n```typescript\n// Schedule for 1 hour from now\nconst scheduled = await twitter.scheduleTweet(\n  { text: 'This is a scheduled tweet!' },\n  new Date(Date.now() + 60 * 60 * 1000)\n);\n\nconsole.log(`Tweet scheduled for ${scheduled.scheduledFor}`);\nconsole.log(`Schedule ID: ${scheduled.scheduleId}`);\n\n// List scheduled tweets\nconst pending = await twitter.listScheduledTweets();\n\n// Cancel scheduled tweet\nawait twitter.cancelScheduledTweet(scheduled.scheduleId!);\n```\n\n### Interactions\n\n```typescript\n// Reply to a tweet\nconst reply = await twitter.replyToTweet('original_tweet_id', {\n  text: 'Great point!',\n});\n\n// Quote tweet\nconst quote = await twitter.quoteTweet('original_tweet_id', {\n  text: 'This is an interesting take:',\n});\n\n// Retweet\nawait twitter.retweet('tweet_id');\n\n// Like/Unlike\nawait twitter.likeTweet('tweet_id');\nawait twitter.unlikeTweet('tweet_id');\n\n// Delete tweet\nawait twitter.deleteTweet('tweet_id');\n```\n\n### User Information\n\n```typescript\n// Get current authenticated user\nconst me = await twitter.getCurrentUser();\nconsole.log(`@${me.username} - ${me.followersCount} followers`);\n\n// Get user by username\nconst user = await twitter.getUserInfo('elonmusk');\n```\n\n### Rate Limit Handling\n\n```typescript\n// Configure rate limit strategy\nconst twitter = new TwitterService({\n  // ... other config\n  rateLimitConfig: {\n    enabled: true,\n    strategy: 'wait', // 'wait' | 'queue' | 'fail'\n    maxRetries: 3,\n  },\n});\n\n// Check rate limit status\nconst status = twitter.getRateLimitStatus('POST /2/tweets');\nconsole.log(`${status.remaining}/${status.limit} requests remaining`);\nconsole.log(`Resets at: ${status.reset}`);\n\n// Manually wait for rate limit\nawait twitter.waitForRateLimit('POST /2/tweets');\n```\n\n### Token Storage\n\n```typescript\nimport { TokenStorage } from '@bernierllc/social-media-twitter';\n\n// Implement custom token storage\nconst tokenStorage: TokenStorage = {\n  async store(key, credentials) {\n    await myDatabase.set(key, JSON.stringify(credentials));\n  },\n  async retrieve(key) {\n    const data = await myDatabase.get(key);\n    return data ? JSON.parse(data) : null;\n  },\n  async delete(key) {\n    await myDatabase.delete(key);\n  },\n};\n\nconst twitter = new TwitterService({\n  // ... other config\n  tokenStorage,\n});\n\n// Or set later\ntwitter.setTokenStorage(tokenStorage);\n```\n\n### Connection Testing\n\n```typescript\n// Verify credentials are valid\nconst isValid = await twitter.verifyCredentials();\n\n// Full connection test\nconst test = await twitter.testConnection();\nif (test.success) {\n  console.log(`Connected as @${test.user?.username}`);\n  console.log('Rate limits:', test.rateLimits);\n}\n```\n\n### NeverHub Service Discovery\n\n`initialize()` registers the service with NeverHub. It is entirely optional —\nevery method below works without calling it — and it is safe to call when\nNeverHub is not running: registration silently no-ops in degraded mode.\n\n```typescript\nawait twitter.initialize();\n```\n\n## API Reference\n\n### TwitterServiceConfig\n\n| Property | Type | Description |\n|----------|------|-------------|\n| clientId | string | Twitter API client ID |\n| clientSecret | string | Twitter API client secret |\n| callbackUrl | string | OAuth callback URL |\n| scopes | string[] | OAuth scopes (default: tweet.read, tweet.write, users.read, offline.access) |\n| rateLimitConfig | RateLimitConfig | Rate limit handling configuration |\n| mediaConfig | MediaConfig | Media upload configuration |\n| tokenStorage | TokenStorage | Token persistence adapter |\n| debug | boolean | Enable debug logging |\n\n### RateLimitConfig\n\n| Property | Type | Description |\n|----------|------|-------------|\n| enabled | boolean | Enable rate limit handling |\n| strategy | 'wait' \\| 'queue' \\| 'fail' | Strategy when rate limit is hit |\n| maxRetries | number | Maximum retries before failing |\n\n### MediaConfig\n\n| Property | Type | Description |\n|----------|------|-------------|\n| chunkSize | number | Chunk size for chunked uploads (default: 5MB) |\n| maxConcurrentUploads | number | Maximum concurrent uploads (default: 3) |\n\n## Media Upload Limits\n\n| Type | Max Size | Formats |\n|------|----------|---------|\n| Image | 5MB | JPEG, PNG, GIF, WebP |\n| GIF | 15MB | GIF |\n| Video | 512MB | MP4, QuickTime |\n\n## Rate Limits (Twitter API v2)\n\n| Endpoint | User Context | App Context |\n|----------|--------------|-------------|\n| POST /2/tweets | 200/15min | 50/15min |\n| DELETE /2/tweets/:id | 50/15min | 50/15min |\n| POST /2/users/:id/retweets | 50/15min | 50/15min |\n| POST /2/users/:id/likes | 50/15min | 50/15min |\n| GET /2/users/me | 75/15min | 75/15min |\n\n## Security\n\n### API Credentials\n- **Never hardcode** client ID/secret - use environment variables\n- **Store tokens securely** using encrypted storage\n- **Implement token refresh** to avoid re-authentication\n\n### OAuth Security\n- **PKCE support** built-in for authorization code flow\n- **State verification** prevents CSRF attacks\n- **Automatic state cleanup** for expired auth attempts\n\n## Integration Status\n\n- **Logger**: Planned for v1.1.0\n- **NeverHub**: Planned for v1.2.0\n- **Docs-Suite**: Ready (TypeDoc format)\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n","readmeFilename":"README.md"}