Skip to content

social() ​

Post release announcements to social media platforms programmatically.

Signature ​

ts
function social(options?: SocialOptions): Promise<void>

Description ​

The social() function posts release announcements to configured social media platforms (Twitter, Slack). It automatically:

  1. Loads your Relizy configuration
  2. Determines which releases to announce (from bumpResult or postedReleases)
  3. Generates appropriate messages for each platform
  4. Posts to enabled platforms
  5. Handles errors gracefully with proper logging

Options ​

ts
interface SocialOptions {
  /**
   * Start tag/commit reference for changelog generation
   * @default undefined
   */
  from?: string

  /**
   * End tag/commit reference for changelog generation
   * @default undefined
   */
  to?: string

  /**
   * Pre-loaded Relizy configuration
   * If not provided, will load from config file
   * @default undefined
   */
  config?: ResolvedRelizyConfig

  /**
   * Custom config file name (without .config extension)
   * @example 'relizy.standalone' for 'relizy.standalone.config.ts'
   * @default 'relizy'
   */
  configName?: string

  /**
   * Bump result from bump command
   * Contains version and package information
   * @default undefined
   */
  bumpResult?: BumpResult

  /**
   * Posted releases from provider-release command
   * Contains release URLs from GitHub/GitLab
   * @default undefined
   */
  postedReleases?: PostedRelease[]

  /**
   * Log level for output
   * @default 'info'
   */
  logLevel?: LogLevel

  /**
   * Run in dry-run mode (no actual posting)
   * @default false
   */
  dryRun?: boolean

  /**
   * Skip safety checks
   * @default false
   */
  safetyCheck?: boolean
}

Return Value ​

Returns a Promise<void> that resolves when all configured social media posts have been made successfully, or rejects if an error occurs.

Error Handling ​

The function will throw an error if:

  • Required peer dependencies are missing (twitter-api-v2 or @slack/web-api)
  • Credentials are not configured or invalid
  • Social media API requests fail
  • No releases are found to announce

Errors are logged with detailed messages to help troubleshoot configuration issues.

Examples ​

Basic Usage ​

Post about releases between two git tags:

ts
import { social } from 'relizy'

await social({
  from: 'v1.0.0',
  to: 'v1.1.0',
})

With Bump Result ​

Use after bumping versions:

ts
import { bump, social } from 'relizy'

// Bump version first
const bumpResult = await bump({
  type: 'patch',
})

// Then post to social media
await social({
  bumpResult,
})

With Posted Releases ​

Use after creating provider releases:

ts
import { bump, providerRelease, social } from 'relizy'

// Bump and create GitHub release
const bumpResult = await bump({ type: 'minor' })
const postedReleases = await providerRelease({ bumpResult })

// Post to social media with release URLs
await social({
  bumpResult,
  postedReleases,
})

Dry Run ​

Test social media posting without actually posting:

ts
import { social } from 'relizy'

await social({
  from: 'v1.0.0',
  to: 'v1.1.0',
  dryRun: true, // Will log what would be posted
})

Custom Configuration ​

Use a different config file:

ts
import { social } from 'relizy'

await social({
  configName: 'relizy.production',
  from: 'v1.0.0',
  to: 'v1.1.0',
})

With Pre-loaded Config ​

Pass configuration directly:

ts
import { loadRelizyConfig, social } from 'relizy'

const config = await loadRelizyConfig({
  configName: 'relizy.custom',
})

await social({
  config,
  from: 'v1.0.0',
  to: 'v1.1.0',
})

Custom Log Level ​

Control logging verbosity:

ts
import { social } from 'relizy'

await social({
  from: 'v1.0.0',
  to: 'v1.1.0',
  logLevel: 'debug', // Show detailed logs
})

Integration in Workflows ​

Full Release Workflow ​

ts
import { bump, changelog, createCommitAndTags, providerRelease, publish, social } from 'relizy'

async function completeRelease() {
  // 1. Bump versions
  const bumpResult = await bump({ type: 'minor' })

  // 2. Generate changelogs
  await changelog({ bumpResult })

  // 3. Create git commit and tags
  await createCommitAndTags({ bumpResult })

  // 4. Publish to npm
  await publish({ bumpResult })

  // 5. Create GitHub/GitLab release
  const postedReleases = await providerRelease({ bumpResult })

  // 6. Post to social media
  await social({
    bumpResult,
    postedReleases,
  })
}

completeRelease().catch(console.error)

Monorepo - Independent Mode ​

In independent mode, social() will create separate posts for each package:

ts
import { bump, social } from 'relizy'

// Configuration with independent mode
// monorepo: { versionMode: 'independent' }

const bumpResult = await bump({ type: 'patch' })

// Posts separate announcements for each bumped package
await social({ bumpResult })

Conditional Posting ​

Only post for stable releases:

ts
import { bump, isPrerelease, social } from 'relizy'

const bumpResult = await bump({ type: 'patch' })

// Only post if not a prerelease
if (!isPrerelease(bumpResult.newVersion)) {
  await social({ bumpResult })
}

Configuration Requirements ​

For social() to work, you need to configure social media platforms in your relizy.config.ts:

ts
import { defineConfig } from 'relizy'

export default defineConfig({
  social: {
    twitter: {
      enabled: true,
      credentials: {
        apiKey: process.env.TWITTER_API_KEY,
        apiKeySecret: process.env.TWITTER_API_KEY_SECRET,
        accessToken: process.env.TWITTER_ACCESS_TOKEN,
        accessTokenSecret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
      },
    },
    slack: {
      enabled: true,
      channel: '#releases',
      credentials: {
        token: process.env.SLACK_TOKEN,
      },
    },
  },
})

Hooks ​

The social() function executes the following hooks:

  • before:social - Before posting to social media
  • success:social - After successful posting
  • error:social - If posting fails

Example:

ts
import { defineConfig } from 'relizy'

export default defineConfig({
  hooks: {
    'before:social': (config, dryRun) => {
      console.log('About to post to social media...')
    },
    'success:social': (config, dryRun, result) => {
      console.log('Successfully posted to social media!')
    },
    'error:social': (config, dryRun, error) => {
      console.error('Failed to post:', error)
    },
  },
})

Platform-Specific Behavior ​

Twitter ​

  • Tweets are automatically truncated to fit Twitter's 280-character limit
  • URLs are shortened automatically by Twitter
  • Changelog is summarized to fit the limit
  • Prerelease versions are skipped by default (configurable with onlyStable)

Slack ​

  • Messages use Slack's mrkdwn formatting
  • Links are formatted as <url|text>
  • Rich formatting with bold, italic, and code blocks
  • Channel must exist and bot must have access

Type Definitions ​

ts
interface BumpResult {
  newVersion: string
  bumpedPackages: PackageInfo[]
  rootPackage?: PackageInfo
}

interface PostedRelease {
  name: string
  tag: string
  version: string
  url?: string
  prerelease: boolean
}

interface PackageInfo {
  name: string
  version: string
  newVersion?: string
  path: string
  private: boolean
}

type LogLevel = 'silent' | 'error' | 'warn' | 'log' | 'info' | 'debug' | 'verbose'

See Also ​

Released under the MIT License.