{"_id":"@bernierllc/content-type-tweet","_rev":"6-15a7c3d796528eece481f6aedb201659","name":"@bernierllc/content-type-tweet","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@bernierllc/content-type-tweet","version":"1.0.0","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-tweet@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"5f62c6aab78e877a3400dc184e77e58148237e93","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.0.0.tgz","fileCount":34,"integrity":"sha512-e88ysZyg6Y5YFsognc51XsQv70V4yTP1afKJ/qOST/Iohl76FH6Ey/wsl4O+Dcv45H+RakatdDe6QF0svAClCg==","signatures":[{"sig":"MEUCIQDDIpldyHpI5Jr1m4Dh9fgvEKNs3+D++sEtPeWR2oOSzAIgDcwLA4/Mt0/Tkqru9FML/H/nt1qdZJ0cfgGLSshqHnM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220809},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"a2a0a7115181a9a7f7e1649f8003d2bf17c6b8a7","scripts":{"lint":"eslint src __tests__ --ext .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":{"logger":"not-applicable","neverhub":"optional","neveradmin":"not-applicable"}},"_npmVersion":"11.6.0","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","directories":{},"_nodeVersion":"24.10.0","dependencies":{"zod":"^3.22.0","gray-matter":"^4.0.3","twitter-text":"^3.1.0","twitter-api-v2":"^1.15.0","@bernierllc/content-type-text":"^1.0.1","@bernierllc/content-type-registry":"^1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-tweet_1.0.0_1762312373094_0.9147095721484118","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/content-type-tweet","version":"1.0.1","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-tweet@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"79d3883d9b16155cccd8e1e8f6134935515f0766","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.0.1.tgz","fileCount":31,"integrity":"sha512-jFX+PUQ1l/+hE7opL6UJltAJrD3qgTCEZGjXJyGaBPioN2z1k9qocavfYjc2LpKDdRVmCwvqA4HuqH2Yo8QvSw==","signatures":[{"sig":"MEQCIGLAprQ+P89mmKDLZKu1efLfhGiD2dmzZ+8TPdRi2IvSAiAd2XVubOjnLKvONlo4g4hcGU8MhJm8B3yb4stA5Qw12g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171763},"main":"dist/index.js","_from":"file:bernierllc-content-type-tweet-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src __tests__ --ext .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/bf50c7029a9d4e0d703c42c64a2d8c80/bernierllc-content-type-tweet-1.0.1.tgz","_integrity":"sha512-jFX+PUQ1l/+hE7opL6UJltAJrD3qgTCEZGjXJyGaBPioN2z1k9qocavfYjc2LpKDdRVmCwvqA4HuqH2Yo8QvSw==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"optional","neveradmin":"not-applicable"}},"_npmVersion":"11.7.0","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","gray-matter":"^4.0.3","twitter-text":"^3.1.0","twitter-api-v2":"^1.15.0","@bernierllc/content-type-text":"1.0.2","@bernierllc/content-type-registry":"1.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-tweet_1.0.1_1766087444133_0.5488213404798239","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/content-type-tweet","version":"1.2.0","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-tweet@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"369332d6174230ef956f12a5c6da81fc15fc16c7","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.2.0.tgz","fileCount":31,"integrity":"sha512-UfAy3y35eYjwErdoJBCCGvRjRqSfwPlv+p4n+OTM+YDCQ1tN8Gb+RtSwSfhKJPsWiiOC6YAleAi4PDn+LY4dpw==","signatures":[{"sig":"MEUCIQDbscgVevMqGuiFPAptNk5zBA+46B6aWrcQMvHEqxCTZAIgZ+0EZTcoA5wovppD47SxM6/crFi6RGaMcjTwhpiBTEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173853},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src __tests__ --ext .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:0ab0a926-fd61-4e31-9283-f87090d74a37"}},"bernierllc":{"integration":{"logger":"not-applicable","neverhub":"optional","neveradmin":"not-applicable"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","gray-matter":"^4.0.3","twitter-text":"^3.1.0","twitter-api-v2":"^1.15.0","@bernierllc/content-type-text":"1.2.0","@bernierllc/content-type-registry":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-tweet_1.2.0_1767642421896_0.1790016115061741","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/content-type-tweet","version":"1.2.2","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-tweet@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"a05144c6dc29fe7327b0e13cf90d5aa48ee3f884","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.2.2.tgz","fileCount":31,"integrity":"sha512-WUNye8QEl5Z9w2u0sgz9g6z1XuuQxN2dPOASpIrxfdufjVjBB1M7MDZqnS3Ss1j4L+LOnzwU9nN5FQhD8dUHZg==","signatures":[{"sig":"MEQCIDeGzUNygmmoYVJ4aQKkNO7nOHPegaXcupPSPfgjDSyGAiBHEIOPE628m4SAR9PMD/KSdzKUvStTyo3XFt4DJgFEEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174239},"main":"dist/index.js","_from":"file:bernierllc-content-type-tweet-1.2.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src __tests__ --ext .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:0ab0a926-fd61-4e31-9283-f87090d74a37"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-type-tweet/bernierllc-content-type-tweet-1.2.2.tgz","_integrity":"sha512-WUNye8QEl5Z9w2u0sgz9g6z1XuuQxN2dPOASpIrxfdufjVjBB1M7MDZqnS3Ss1j4L+LOnzwU9nN5FQhD8dUHZg==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"optional","neveradmin":"not-applicable"}},"_npmVersion":"11.11.0","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.0","gray-matter":"^4.0.3","twitter-text":"^3.1.0","twitter-api-v2":"^1.15.0","@bernierllc/content-type-text":"1.2.2","@bernierllc/content-type-registry":"1.3.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-tweet_1.2.2_1773163088458_0.45300249406833193","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/content-type-tweet","version":"1.4.0","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-type-tweet@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"487fef5e287a50c77bd0ba06edc7c358eee48038","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.4.0.tgz","fileCount":16,"integrity":"sha512-lKDxS+MZSNGgCan0G7mMBaSA8GSrxpmaCdXAUatlf9TG16/or5TqdXPvZI3gJEKTcv2bqh2HdI+CGplD73pcpg==","signatures":[{"sig":"MEQCIEvPkM2yGwmF7AcNyF76Q8/2eSPfFc/bkVQioiOTdir1AiAJArPHDhiEwY3ExwtglE5OD5R3s8E7CiPpIw9lmsFvvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62213},"main":"dist/index.js","_from":"file:bernierllc-content-type-tweet-1.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src __tests__ --ext .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:0ab0a926-fd61-4e31-9283-f87090d74a37"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-type-tweet/bernierllc-content-type-tweet-1.4.0.tgz","_integrity":"sha512-lKDxS+MZSNGgCan0G7mMBaSA8GSrxpmaCdXAUatlf9TG16/or5TqdXPvZI3gJEKTcv2bqh2HdI+CGplD73pcpg==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"optional","neveradmin":"not-applicable"}},"_npmVersion":"11.14.1","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","gray-matter":"^4.0.3","twitter-text":"^3.1.0","twitter-api-v2":"^1.15.0","@bernierllc/content-type-text":"1.4.0","@bernierllc/content-type-registry":"1.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-type-tweet_1.4.0_1779241023429_0.14137229179438537","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/content-type-tweet","version":"1.5.0","description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","main":"dist/index.js","types":"dist/index.d.ts","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","dependencies":{"gray-matter":"^4.0.3","twitter-api-v2":"^1.15.0","twitter-text":"^3.1.0","zod":"^3.22.0","@bernierllc/content-type-text":"1.5.0","@bernierllc/content-type-registry":"1.6.0"},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/twitter-text":"^3.1.10","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"bernierllc":{"integration":{"neverhub":"optional","neveradmin":"not-applicable","logger":"not-applicable"}},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src __tests__ --ext .ts","clean":"rm -rf dist"},"_id":"@bernierllc/content-type-tweet@1.5.0","_integrity":"sha512-b/ZDvCJV7gddWBVeN47KfLgj15o+nazKKj+ul4Yqabok219iYpCIEVWkTqE7Wwdi9fEmbbWoc6lXlCmgDCWtYA==","_resolved":"/home/runner/work/tools/tools/packages/core/content-type-tweet/bernierllc-content-type-tweet-1.5.0.tgz","_from":"file:bernierllc-content-type-tweet-1.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-b/ZDvCJV7gddWBVeN47KfLgj15o+nazKKj+ul4Yqabok219iYpCIEVWkTqE7Wwdi9fEmbbWoc6lXlCmgDCWtYA==","shasum":"9857e704115dce50749c4c13ff9a222f3fedd3e2","tarball":"https://registry.npmjs.org/@bernierllc/content-type-tweet/-/content-type-tweet-1.5.0.tgz","fileCount":16,"unpackedSize":62213,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICnInM3oIJXIz2p/IIaRK0kBD+sNR3HO7BooWqK6Rgq0AiBVIXHpn2pgTNVXkfKpWSXDqO3s58Fw40AZ51YjkgebFg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0ab0a926-fd61-4e31-9283-f87090d74a37"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/content-type-tweet_1.5.0_1779249762205_0.442187277892762"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-05T03:12:52.980Z","modified":"2026-05-20T04:02:42.491Z","1.0.0":"2025-11-05T03:12:53.327Z","1.0.1":"2025-12-18T19:50:44.278Z","1.2.0":"2026-01-05T19:47:02.052Z","1.2.2":"2026-03-10T17:18:08.605Z","1.4.0":"2026-05-20T01:37:03.601Z","1.5.0":"2026-05-20T04:02:42.347Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["content","tweet","twitter","social-media","api","content-type","280-characters","thread","oauth"],"description":"Tweet content type with 280-character validation, Twitter API publishing, thread support, and media attachments","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/content-type-tweet\n\nTweet content type extending @bernierllc/content-type-text with 280-character validation, Twitter-aware text processing, thread support, media attachments, and Twitter API v2 publishing.\n\n## Installation\n\n```bash\nnpm install @bernierllc/content-type-tweet\n```\n\n## Features\n\n- **280-character validation** using Twitter's official text parsing library\n- **Entity extraction** - Automatic extraction of hashtags, mentions, and URLs\n- **Thread support** - Create and publish multi-tweet threads\n- **Media attachments** - Support for images, GIFs, and videos (up to 4)\n- **Poll support** - Create tweets with polls (2-4 options)\n- **Twitter API v2 integration** - Publish tweets directly to Twitter\n- **Scheduled tweets** - Schedule tweets for future publishing\n- **Quote tweets** - Quote existing tweets\n- **Reply support** - Reply to tweets\n\n## Usage\n\n### Basic Tweet Creation\n\n```typescript\nimport { TweetContentType } from '@bernierllc/content-type-tweet';\n\nconst tweetType = new TweetContentType({\n  storage: {\n    type: 'file',\n    directory: './content/tweets',\n  },\n  twitter: {\n    appKey: process.env.TWITTER_APP_KEY!,\n    appSecret: process.env.TWITTER_APP_SECRET!,\n    accessToken: process.env.TWITTER_ACCESS_TOKEN,\n    accessSecret: process.env.TWITTER_ACCESS_SECRET,\n    authType: 'oauth1',\n  },\n});\n\n// Create a tweet\nconst result = await tweetType.createTweet({\n  content: 'Hello world! #TypeScript @bernierllc',\n});\n\nif (result.success) {\n  console.log(`Tweet created: ${result.data}`);\n}\n```\n\n### Tweet Validation\n\n```typescript\n// Validate tweet content before creating\nconst validation = tweetType.validateTweet('This is a test tweet!');\n\nif (validation.data?.valid) {\n  console.log(`Valid tweet (${validation.data.characterCount}/280 characters)`);\n} else {\n  console.log('Tweet exceeds character limit');\n}\n```\n\n### Publishing Tweets\n\n```typescript\n// Create and publish a tweet\nconst createResult = await tweetType.createTweet({\n  content: 'Hello from @bernierllc/content-type-tweet!',\n});\n\nif (createResult.success) {\n  const publishResult = await tweetType.publishTweet(createResult.data!);\n\n  if (publishResult.success) {\n    console.log(`Published: ${publishResult.tweetUrl}`);\n  }\n}\n```\n\n### Tweet Threads\n\n```typescript\nimport { createThread } from '@bernierllc/content-type-tweet';\n\n// Create a thread from multiple tweets\nconst thread = createThread([\n  'This is the first tweet in a thread.',\n  'This is the second tweet.',\n  'And this is the third tweet!',\n]);\n\nif (thread.success) {\n  // Publish the entire thread\n  const result = await tweetType.publishThread(thread.data!);\n  console.log(`Thread published: ${result.success}`);\n}\n```\n\n### Media Attachments\n\n```typescript\n// Create a tweet with media\nconst result = await tweetType.createTweet({\n  content: 'Check out these amazing photos! 📸',\n  media: [\n    {\n      type: 'image',\n      url: 'https://example.com/photo1.jpg',\n      altText: 'Beautiful sunset',\n    },\n    {\n      type: 'image',\n      url: 'https://example.com/photo2.jpg',\n      altText: 'Mountain landscape',\n    },\n  ],\n});\n```\n\n### Polls\n\n```typescript\n// Create a tweet with a poll\nconst result = await tweetType.createTweet({\n  content: 'What is your favorite programming language?',\n  poll: {\n    options: ['TypeScript', 'JavaScript', 'Python', 'Go'],\n    durationMinutes: 1440, // 24 hours\n  },\n});\n```\n\n### Scheduled Tweets\n\n```typescript\n// Schedule a tweet for later\nconst createResult = await tweetType.createTweet({\n  content: 'This will be posted tomorrow!',\n});\n\nif (createResult.success) {\n  const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000);\n  await tweetType.scheduleTweet(createResult.data!, tomorrow);\n}\n```\n\n## API Reference\n\n### TweetContentType\n\nMain class for managing tweet content.\n\n#### Methods\n\n- `createTweet(data: Partial<TweetContentMetadata>): Promise<TweetContentResult<string>>` - Create a new tweet\n- `readTweet(filePath: string): Promise<TweetContentResult<TweetContentMetadata>>` - Read tweet from file\n- `updateTweet(filePath: string, data: Partial<TweetContentMetadata>): Promise<TweetContentResult<void>>` - Update tweet\n- `deleteTweet(filePath: string): Promise<TweetContentResult<void>>` - Delete tweet\n- `publishTweet(filePath: string): Promise<TweetPublishResult>` - Publish tweet to Twitter\n- `publishThread(thread: TweetThread): Promise<TweetContentResult<TweetPublishResult[]>>` - Publish thread\n- `scheduleTweet(filePath: string, scheduledFor: Date): Promise<TweetContentResult<void>>` - Schedule tweet\n- `validateTweet(content: string): TweetContentResult<{ valid: boolean; characterCount: number }>` - Validate tweet\n- `register(registry: ContentTypeRegistry): Promise<TweetContentResult<void>>` - Register with content type registry\n\n### Validation Functions\n\n- `validateTweetContent(content: string): TweetContentResult<TweetValidationResult>` - Validate tweet using Twitter's parser\n- `extractHashtags(content: string): string[]` - Extract hashtags from content\n- `extractMentions(content: string): string[]` - Extract mentions from content\n- `extractUrls(content: string): string[]` - Extract URLs from content\n- `extractEntities(content: string)` - Extract all entities (hashtags, mentions, URLs)\n- `isTweetValid(content: string): boolean` - Check if tweet is valid\n- `getCharacterCount(content: string): number` - Get weighted character count\n\n### Thread Functions\n\n- `createThread(tweets: string[], threadId?: string): TweetContentResult<TweetThread>` - Create thread from tweet array\n- `validateThread(thread: TweetThread): TweetContentResult<boolean>` - Validate thread\n- `splitIntoThread(text: string, maxLength?: number): TweetContentResult<string[]>` - Split long text into thread\n\n## Configuration\n\n### Environment Variables\n\n```bash\n# Twitter API Configuration (required for publishing)\nTWITTER_APP_KEY=your_app_key\nTWITTER_APP_SECRET=your_app_secret\n\n# OAuth 1.0a (for user authentication)\nTWITTER_ACCESS_TOKEN=your_access_token\nTWITTER_ACCESS_SECRET=your_access_secret\n\n# OAuth 2.0 (alternative)\nTWITTER_CLIENT_ID=your_client_id\nTWITTER_CLIENT_SECRET=your_client_secret\n\n# Bearer Token (for app-only authentication)\nTWITTER_BEARER_TOKEN=your_bearer_token\n\n# Authentication Type\nTWITTER_AUTH_TYPE=oauth1  # oauth1 | oauth2\n\n# Tweet Content Configuration (optional)\nTWEET_STORAGE_DIR=./content/tweets  # Default tweet storage directory\nTWEET_STORAGE_TYPE=file  # file | database\n```\n\n## Integration Status\n\n- **Logger**: not-applicable - Core content type package\n- **Docs-Suite**: ready - TypeDoc format, complete API documentation\n- **NeverHub**: optional - Tweet publishing events\n\n## Dependencies\n\n- [@bernierllc/content-type-registry](../content-type-registry) ^1.0.3 - Content type registration\n- [@bernierllc/content-type-text](../content-type-text) ^1.0.1 - Base text content type\n- [zod](https://www.npmjs.com/package/zod) - Runtime schema validation\n- [twitter-api-v2](https://www.npmjs.com/package/twitter-api-v2) - Twitter API v2 client\n- [twitter-text](https://www.npmjs.com/package/twitter-text) - Official Twitter text parser\n- [gray-matter](https://www.npmjs.com/package/gray-matter) - Frontmatter parsing\n\n## Dependent Packages\n\n- @bernierllc/content-editor-service - Content editing orchestration\n- @bernierllc/social-publisher - Multi-platform social publishing\n- @bernierllc/content-management-suite - Complete content management ecosystem\n\n## License\n\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n\n## See Also\n\n- [@bernierllc/content-type-text](../content-type-text) - Base text content type\n- [@bernierllc/content-type-registry](../content-type-registry) - Content type registration\n- [@bernierllc/content-type-blog-post](../content-type-blog-post) - Blog post content type\n- [@bernierllc/content-management-suite](../../suite/content-management-suite) - Content management suite\n","readmeFilename":"README.md"}