You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

postiz

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

postiz - npm Package Compare versions

Comparing version
2.0.10
to
2.0.11
+8
-7
dist/index.js

@@ -284,6 +284,7 @@ #!/usr/bin/env node

})) : [];
return __spreadValues({
return {
content,
image: images
}, index > 0 && { delay: args.delay || 5e3 });
image: images,
delay: (args == null ? void 0 : args.delay) || 0
};
});

@@ -514,5 +515,5 @@ let settings = void 0;

alias: "d",
describe: "Delay in milliseconds between comments (default: 5000)",
describe: "Delay in minutes between comments (default: 0)",
type: "number",
default: 5e3
default: 0
}).option("json", {

@@ -556,4 +557,4 @@ alias: "j",

).example(
'$0 posts:create -c "Thread 1/3" -c "Thread 2/3" -c "Thread 3/3" -d 2000 -s "2024-12-31T12:00:00Z" -i "twitter-123"',
"Twitter thread with 2s delay"
'$0 posts:create -c "Thread 1/3" -c "Thread 2/3" -c "Thread 3/3" -d 5 -s "2024-12-31T12:00:00Z" -i "twitter-123"',
"Twitter thread with 5 minute delay"
).example(

@@ -560,0 +561,0 @@ "$0 posts:create --json ./post.json",

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/config.ts","../src/commands/posts.ts","../src/commands/integrations.ts","../src/commands/analytics.ts","../src/commands/upload.ts"],"sourcesContent":["import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { createPost, listPosts, deletePost, getMissingContent, connectPost } from './commands/posts';\nimport { listIntegrations, getIntegrationSettings, triggerIntegrationTool } from './commands/integrations';\nimport { getAnalytics, getPostAnalytics } from './commands/analytics';\nimport { uploadFile } from './commands/upload';\nimport type { Argv } from 'yargs';\n\nyargs(hideBin(process.argv))\n .scriptName('postiz')\n .usage('$0 <command> [options]')\n .command(\n 'posts:create',\n 'Create a new post',\n (yargs: Argv) => {\n return yargs\n .option('content', {\n alias: 'c',\n describe: 'Post/comment content (can be used multiple times)',\n type: 'string',\n })\n .option('media', {\n alias: 'm',\n describe: 'Comma-separated media URLs for the corresponding -c (can be used multiple times)',\n type: 'string',\n })\n .option('integrations', {\n alias: 'i',\n describe: 'Comma-separated list of integration IDs',\n type: 'string',\n })\n .option('date', {\n alias: 's',\n describe: 'Schedule date (ISO 8601 format) - REQUIRED',\n type: 'string',\n })\n .option('type', {\n alias: 't',\n describe: 'Post type: \"schedule\" or \"draft\"',\n type: 'string',\n choices: ['schedule', 'draft'],\n default: 'schedule',\n })\n .option('delay', {\n alias: 'd',\n describe: 'Delay in milliseconds between comments (default: 5000)',\n type: 'number',\n default: 5000,\n })\n .option('json', {\n alias: 'j',\n describe: 'Path to JSON file with full post structure',\n type: 'string',\n })\n .option('shortLink', {\n describe: 'Use short links',\n type: 'boolean',\n default: true,\n })\n .option('settings', {\n describe: 'Platform-specific settings as JSON string',\n type: 'string',\n })\n .check((argv) => {\n if (!argv.json && !argv.content) {\n throw new Error('Either --content or --json is required');\n }\n if (!argv.json && !argv.integrations) {\n throw new Error('--integrations is required when not using --json');\n }\n if (!argv.json && !argv.date) {\n throw new Error('--date is required when not using --json');\n }\n return true;\n })\n .example(\n '$0 posts:create -c \"Hello World!\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Simple scheduled post'\n )\n .example(\n '$0 posts:create -c \"Draft post\" -s \"2024-12-31T12:00:00Z\" -t draft -i \"twitter-123\"',\n 'Create draft post'\n )\n .example(\n '$0 posts:create -c \"Main post\" -m \"img1.jpg,img2.jpg\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Post with multiple images'\n )\n .example(\n '$0 posts:create -c \"Main post\" -m \"img1.jpg\" -c \"First comment\" -m \"img2.jpg\" -c \"Second comment\" -m \"img3.jpg,img4.jpg\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Post with comments, each having their own media'\n )\n .example(\n '$0 posts:create -c \"Main\" -c \"Comment with semicolon; see?\" -c \"Another!\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Comments can contain semicolons'\n )\n .example(\n '$0 posts:create -c \"Thread 1/3\" -c \"Thread 2/3\" -c \"Thread 3/3\" -d 2000 -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Twitter thread with 2s delay'\n )\n .example(\n '$0 posts:create --json ./post.json',\n 'Complex post from JSON file'\n )\n .example(\n '$0 posts:create -c \"Post to subreddit\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"subreddit\":[{\"value\":{\"subreddit\":\"programming\",\"title\":\"My Title\",\"type\":\"text\",\"url\":\"\",\"is_flair_required\":false}}]}\\' -i \"reddit-123\"',\n 'Reddit post with specific subreddit settings'\n )\n .example(\n '$0 posts:create -c \"Video description\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"title\":\"My Video\",\"type\":\"public\",\"tags\":[{\"value\":\"tech\",\"label\":\"Tech\"}]}\\' -i \"youtube-123\"',\n 'YouTube post with title and tags'\n )\n .example(\n '$0 posts:create -c \"Tweet content\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"who_can_reply_post\":\"everyone\"}\\' -i \"twitter-123\"',\n 'X (Twitter) post with reply settings'\n );\n },\n createPost as any\n )\n .command(\n 'posts:list',\n 'List all posts',\n (yargs: Argv) => {\n return yargs\n .option('startDate', {\n describe: 'Start date (ISO 8601 format). Default: 30 days ago',\n type: 'string',\n })\n .option('endDate', {\n describe: 'End date (ISO 8601 format). Default: 30 days from now',\n type: 'string',\n })\n .option('customer', {\n describe: 'Customer ID (optional)',\n type: 'string',\n })\n .example('$0 posts:list', 'List all posts (last 30 days to next 30 days)')\n .example(\n '$0 posts:list --startDate \"2024-01-01T00:00:00Z\" --endDate \"2024-12-31T23:59:59Z\"',\n 'List posts for a specific date range'\n )\n .example(\n '$0 posts:list --customer \"customer-id\"',\n 'List posts for a specific customer'\n );\n },\n listPosts as any\n )\n .command(\n 'posts:delete <id>',\n 'Delete a post',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID to delete',\n type: 'string',\n })\n .example('$0 posts:delete abc123', 'Delete post with ID abc123');\n },\n deletePost as any\n )\n .command(\n 'posts:missing <id>',\n 'List available content from the provider for a post with missing release ID',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .example(\n '$0 posts:missing post-123',\n 'Get available content to connect to a post'\n );\n },\n getMissingContent as any\n )\n .command(\n 'posts:connect <id>',\n 'Connect a post to its published content by updating the release ID',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .option('release-id', {\n describe: 'The platform-specific content ID to connect',\n type: 'string',\n demandOption: true,\n })\n .example(\n '$0 posts:connect post-123 --release-id \"7321456789012345678\"',\n 'Connect a post to its published content'\n );\n },\n connectPost as any\n )\n .command(\n 'integrations:list',\n 'List all connected integrations',\n {},\n listIntegrations as any\n )\n .command(\n 'integrations:settings <id>',\n 'Get settings schema for a specific integration',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .example(\n '$0 integrations:settings reddit-123',\n 'Get settings schema for Reddit integration'\n )\n .example(\n '$0 integrations:settings youtube-456',\n 'Get settings schema for YouTube integration'\n );\n },\n getIntegrationSettings as any\n )\n .command(\n 'integrations:trigger <id> <method>',\n 'Trigger an integration tool to fetch additional data',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .positional('method', {\n describe: 'Method name from the integration tools',\n type: 'string',\n })\n .option('data', {\n alias: 'd',\n describe: 'Data to pass to the tool as JSON string',\n type: 'string',\n })\n .example(\n '$0 integrations:trigger reddit-123 getSubreddits',\n 'Get list of subreddits'\n )\n .example(\n '$0 integrations:trigger reddit-123 searchSubreddits -d \\'{\"query\":\"programming\"}\\'',\n 'Search for subreddits'\n )\n .example(\n '$0 integrations:trigger youtube-123 getPlaylists',\n 'Get YouTube playlists'\n );\n },\n triggerIntegrationTool as any\n )\n .command(\n 'analytics:platform <id>',\n 'Get analytics for a specific integration/channel',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .option('date', {\n alias: 'd',\n describe: 'Number of days to look back (default: 7)',\n type: 'string',\n default: '7',\n })\n .example(\n '$0 analytics:platform integration-123',\n 'Get last 7 days of analytics'\n )\n .example(\n '$0 analytics:platform integration-123 -d 30',\n 'Get last 30 days of analytics'\n );\n },\n getAnalytics as any\n )\n .command(\n 'analytics:post <id>',\n 'Get analytics for a specific post',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .option('date', {\n alias: 'd',\n describe: 'Number of days to look back (default: 7)',\n type: 'string',\n default: '7',\n })\n .example(\n '$0 analytics:post post-123',\n 'Get last 7 days of post analytics'\n )\n .example(\n '$0 analytics:post post-123 -d 30',\n 'Get last 30 days of post analytics'\n );\n },\n getPostAnalytics as any\n )\n .command(\n 'upload <file>',\n 'Upload a file',\n (yargs: Argv) => {\n return yargs\n .positional('file', {\n describe: 'File path to upload',\n type: 'string',\n })\n .example('$0 upload ./image.png', 'Upload an image');\n },\n uploadFile as any\n )\n .demandCommand(1, 'You need at least one command')\n .help()\n .alias('h', 'help')\n .version()\n .alias('v', 'version')\n .epilogue(\n 'For more information, visit: https://postiz.com\\n\\nSet your API key: export POSTIZ_API_KEY=your_api_key'\n )\n .parse();\n","import fetch, { FormData } from 'node-fetch';\n\nexport interface PostizConfig {\n apiKey: string;\n apiUrl?: string;\n}\n\nexport class PostizAPI {\n private apiKey: string;\n private apiUrl: string;\n\n constructor(config: PostizConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl || 'https://api.postiz.com';\n }\n\n private async request(endpoint: string, options: any = {}) {\n const url = `${this.apiUrl}${endpoint}`;\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: this.apiKey,\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API Error (${response.status}): ${error}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Request failed: ${error.message}`);\n }\n }\n\n async createPost(data: any) {\n return this.request('/public/v1/posts', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async listPosts(filters: any = {}) {\n const queryString = new URLSearchParams(\n Object.entries(filters).reduce((acc, [key, value]) => {\n if (value !== undefined && value !== null) {\n acc[key] = String(value);\n }\n return acc;\n }, {} as Record<string, string>)\n ).toString();\n\n const endpoint = queryString\n ? `/public/v1/posts?${queryString}`\n : '/public/v1/posts';\n\n return this.request(endpoint, {\n method: 'GET',\n });\n }\n\n async deletePost(id: string) {\n return this.request(`/public/v1/posts/${id}`, {\n method: 'DELETE',\n });\n }\n\n async upload(file: Buffer, filename: string) {\n const formData = new FormData();\n const extension = filename.split('.').pop()?.toLowerCase() || '';\n\n // Determine MIME type based on file extension\n const mimeTypes: Record<string, string> = {\n // Images\n 'png': 'image/png',\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'bmp': 'image/bmp',\n 'ico': 'image/x-icon',\n\n // Videos\n 'mp4': 'video/mp4',\n 'mov': 'video/quicktime',\n 'avi': 'video/x-msvideo',\n 'mkv': 'video/x-matroska',\n 'webm': 'video/webm',\n 'flv': 'video/x-flv',\n 'wmv': 'video/x-ms-wmv',\n 'm4v': 'video/x-m4v',\n 'mpeg': 'video/mpeg',\n 'mpg': 'video/mpeg',\n '3gp': 'video/3gpp',\n\n // Audio\n 'mp3': 'audio/mpeg',\n 'wav': 'audio/wav',\n 'ogg': 'audio/ogg',\n 'aac': 'audio/aac',\n 'flac': 'audio/flac',\n 'm4a': 'audio/mp4',\n\n // Documents\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n };\n\n const type = mimeTypes[extension] || 'application/octet-stream';\n\n const blob = new Blob([file], { type });\n formData.append('file', blob, filename);\n\n const url = `${this.apiUrl}/public/v1/upload`;\n const response = await fetch(url, {\n method: 'POST',\n // @ts-ignore\n body: formData,\n headers: {\n Authorization: this.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Upload failed (${response.status}): ${error}`);\n }\n\n return await response.json();\n }\n\n async getMissingContent(postId: string) {\n return this.request(`/public/v1/posts/${postId}/missing`, {\n method: 'GET',\n });\n }\n\n async updateReleaseId(postId: string, releaseId: string) {\n return this.request(`/public/v1/posts/${postId}/release-id`, {\n method: 'PUT',\n body: JSON.stringify({ releaseId }),\n });\n }\n\n async getAnalytics(integrationId: string, date: string) {\n return this.request(`/public/v1/analytics/${integrationId}?date=${encodeURIComponent(date)}`, {\n method: 'GET',\n });\n }\n\n async getPostAnalytics(postId: string, date: string) {\n return this.request(`/public/v1/analytics/post/${postId}?date=${encodeURIComponent(date)}`, {\n method: 'GET',\n });\n }\n\n async listIntegrations() {\n return this.request('/public/v1/integrations', {\n method: 'GET',\n });\n }\n\n async getIntegrationSettings(integrationId: string) {\n return this.request(`/public/v1/integration-settings/${integrationId}`, {\n method: 'GET',\n });\n }\n\n async triggerIntegrationTool(\n integrationId: string,\n methodName: string,\n data: Record<string, string>\n ) {\n return this.request(`/public/v1/integration-trigger/${integrationId}`, {\n method: 'POST',\n body: JSON.stringify({ methodName, data }),\n });\n }\n}\n","import { PostizConfig } from './api';\n\nexport function getConfig(): PostizConfig {\n const apiKey = process.env.POSTIZ_API_KEY;\n const apiUrl = process.env.POSTIZ_API_URL;\n\n if (!apiKey) {\n console.error('❌ Error: POSTIZ_API_KEY environment variable is required');\n console.error('Please set it using: export POSTIZ_API_KEY=your_api_key');\n process.exit(1);\n }\n\n return {\n apiKey,\n apiUrl,\n };\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\nimport { readFileSync, existsSync } from 'fs';\n\nexport async function getMissingContent(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n try {\n const result = await api.getMissingContent(args.id);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get missing content:', error.message);\n process.exit(1);\n }\n}\n\nexport async function connectPost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n if (!args.releaseId) {\n console.error('❌ --release-id is required');\n process.exit(1);\n }\n\n try {\n const result = await api.updateReleaseId(args.id, args.releaseId);\n console.log(`✅ Post ${args.id} connected to release ${args.releaseId}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to connect post:', error.message);\n process.exit(1);\n }\n}\n\nexport async function createPost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n // Support both simple and complex post creation\n let postData: any;\n\n if (args.json) {\n // Load from JSON file for complex posts with comments and media\n try {\n const jsonPath = args.json;\n if (!existsSync(jsonPath)) {\n console.error(`❌ JSON file not found: ${jsonPath}`);\n process.exit(1);\n }\n const jsonContent = readFileSync(jsonPath, 'utf-8');\n postData = JSON.parse(jsonContent);\n } catch (error: any) {\n console.error('❌ Failed to parse JSON file:', error.message);\n process.exit(1);\n }\n } else {\n const integrations = args.integrations\n ? args.integrations.split(',').map((id: string) => id.trim())\n : [];\n\n if (integrations.length === 0) {\n console.error('❌ At least one integration ID is required');\n console.error('Use -i or --integrations to specify integration IDs');\n console.error('Run \"postiz integrations:list\" to see available integrations');\n process.exit(1);\n }\n\n // Support multiple -c and -m flags\n // Normalize to arrays\n const contents = Array.isArray(args.content) ? args.content : [args.content];\n const medias = Array.isArray(args.media) ? args.media : (args.media ? [args.media] : []);\n\n if (!contents[0]) {\n console.error('❌ At least one -c/--content is required');\n process.exit(1);\n }\n\n // Build value array by pairing contents with their media\n const values = contents.map((content: string, index: number) => {\n const mediaForThisContent = medias[index];\n const images = mediaForThisContent\n ? mediaForThisContent.split(',').map((img: string) => ({\n id: Math.random().toString(36).substring(7),\n path: img.trim(),\n }))\n : [];\n\n return {\n content: content,\n image: images,\n // Add delay for all items except the first (main post)\n ...(index > 0 && { delay: args.delay || 5000 }),\n };\n });\n\n // Parse provider-specific settings if provided\n // Note: __type is automatically added by the backend based on integration ID\n let settings: any = undefined;\n\n if (args.settings) {\n try {\n settings = typeof args.settings === 'string'\n ? JSON.parse(args.settings)\n : args.settings;\n } catch (error: any) {\n console.error('❌ Failed to parse settings JSON:', error.message);\n process.exit(1);\n }\n }\n\n // Build the proper post structure\n postData = {\n type: args.type || 'schedule', // 'schedule' or 'draft'\n date: args.date, // Required date field\n shortLink: args.shortLink !== false,\n tags: [],\n posts: integrations.map((integrationId: string) => ({\n integration: { id: integrationId },\n value: values,\n settings: settings,\n })),\n };\n }\n\n try {\n const result = await api.createPost(postData);\n console.log('✅ Post created successfully!');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to create post:', error.message);\n process.exit(1);\n }\n}\n\nexport async function listPosts(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n // Set default date range: last 30 days to 30 days in the future\n const defaultStartDate = new Date();\n defaultStartDate.setDate(defaultStartDate.getDate() - 30);\n\n const defaultEndDate = new Date();\n defaultEndDate.setDate(defaultEndDate.getDate() + 30);\n\n // Only send fields that are in GetPostsDto\n const filters: any = {\n startDate: args.startDate || defaultStartDate.toISOString(),\n endDate: args.endDate || defaultEndDate.toISOString(),\n };\n\n // customer is optional in the DTO\n if (args.customer) {\n filters.customer = args.customer;\n }\n\n try {\n const result = await api.listPosts(filters);\n console.log('📋 Posts:');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to list posts:', error.message);\n process.exit(1);\n }\n}\n\nexport async function deletePost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n try {\n await api.deletePost(args.id);\n console.log(`✅ Post ${args.id} deleted successfully!`);\n } catch (error: any) {\n console.error('❌ Failed to delete post:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\n\nexport async function listIntegrations() {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n try {\n const result = await api.listIntegrations();\n console.log('🔌 Connected Integrations:');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to list integrations:', error.message);\n process.exit(1);\n }\n}\n\nexport async function getIntegrationSettings(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n try {\n const result = await api.getIntegrationSettings(args.id);\n console.log(`⚙️ Settings for integration: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get integration settings:', error.message);\n process.exit(1);\n }\n}\n\nexport async function triggerIntegrationTool(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n if (!args.method) {\n console.error('❌ Method name is required');\n process.exit(1);\n }\n\n // Parse data from JSON string or use empty object\n let data: Record<string, string> = {};\n if (args.data) {\n try {\n data = JSON.parse(args.data);\n } catch (error: any) {\n console.error('❌ Failed to parse data JSON:', error.message);\n process.exit(1);\n }\n }\n\n try {\n const result = await api.triggerIntegrationTool(args.id, args.method, data);\n console.log(`🔧 Tool result for ${args.method}:`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to trigger tool:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\n\nexport async function getAnalytics(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n const date = args.date || '7';\n\n try {\n const result = await api.getAnalytics(args.id, date);\n console.log(`📊 Analytics for integration: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get analytics:', error.message);\n process.exit(1);\n }\n}\n\nexport async function getPostAnalytics(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n const date = args.date || '7';\n\n try {\n const result = await api.getPostAnalytics(args.id, date);\n console.log(`📊 Analytics for post: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get post analytics:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\nimport { readFileSync } from 'fs';\n\nexport async function uploadFile(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.file) {\n console.error('❌ File path is required');\n process.exit(1);\n }\n\n try {\n const fileBuffer = readFileSync(args.file);\n const filename = args.file.split('/').pop() || 'file';\n\n const result = await api.upload(fileBuffer, filename);\n console.log('✅ File uploaded successfully!');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to upload file:', error.message);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["fetch","import_fs","yargs"]}
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/config.ts","../src/commands/posts.ts","../src/commands/integrations.ts","../src/commands/analytics.ts","../src/commands/upload.ts"],"sourcesContent":["import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { createPost, listPosts, deletePost, getMissingContent, connectPost } from './commands/posts';\nimport { listIntegrations, getIntegrationSettings, triggerIntegrationTool } from './commands/integrations';\nimport { getAnalytics, getPostAnalytics } from './commands/analytics';\nimport { uploadFile } from './commands/upload';\nimport type { Argv } from 'yargs';\n\nyargs(hideBin(process.argv))\n .scriptName('postiz')\n .usage('$0 <command> [options]')\n .command(\n 'posts:create',\n 'Create a new post',\n (yargs: Argv) => {\n return yargs\n .option('content', {\n alias: 'c',\n describe: 'Post/comment content (can be used multiple times)',\n type: 'string',\n })\n .option('media', {\n alias: 'm',\n describe: 'Comma-separated media URLs for the corresponding -c (can be used multiple times)',\n type: 'string',\n })\n .option('integrations', {\n alias: 'i',\n describe: 'Comma-separated list of integration IDs',\n type: 'string',\n })\n .option('date', {\n alias: 's',\n describe: 'Schedule date (ISO 8601 format) - REQUIRED',\n type: 'string',\n })\n .option('type', {\n alias: 't',\n describe: 'Post type: \"schedule\" or \"draft\"',\n type: 'string',\n choices: ['schedule', 'draft'],\n default: 'schedule',\n })\n .option('delay', {\n alias: 'd',\n describe: 'Delay in minutes between comments (default: 0)',\n type: 'number',\n default: 0,\n })\n .option('json', {\n alias: 'j',\n describe: 'Path to JSON file with full post structure',\n type: 'string',\n })\n .option('shortLink', {\n describe: 'Use short links',\n type: 'boolean',\n default: true,\n })\n .option('settings', {\n describe: 'Platform-specific settings as JSON string',\n type: 'string',\n })\n .check((argv) => {\n if (!argv.json && !argv.content) {\n throw new Error('Either --content or --json is required');\n }\n if (!argv.json && !argv.integrations) {\n throw new Error('--integrations is required when not using --json');\n }\n if (!argv.json && !argv.date) {\n throw new Error('--date is required when not using --json');\n }\n return true;\n })\n .example(\n '$0 posts:create -c \"Hello World!\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Simple scheduled post'\n )\n .example(\n '$0 posts:create -c \"Draft post\" -s \"2024-12-31T12:00:00Z\" -t draft -i \"twitter-123\"',\n 'Create draft post'\n )\n .example(\n '$0 posts:create -c \"Main post\" -m \"img1.jpg,img2.jpg\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Post with multiple images'\n )\n .example(\n '$0 posts:create -c \"Main post\" -m \"img1.jpg\" -c \"First comment\" -m \"img2.jpg\" -c \"Second comment\" -m \"img3.jpg,img4.jpg\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Post with comments, each having their own media'\n )\n .example(\n '$0 posts:create -c \"Main\" -c \"Comment with semicolon; see?\" -c \"Another!\" -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Comments can contain semicolons'\n )\n .example(\n '$0 posts:create -c \"Thread 1/3\" -c \"Thread 2/3\" -c \"Thread 3/3\" -d 5 -s \"2024-12-31T12:00:00Z\" -i \"twitter-123\"',\n 'Twitter thread with 5 minute delay'\n )\n .example(\n '$0 posts:create --json ./post.json',\n 'Complex post from JSON file'\n )\n .example(\n '$0 posts:create -c \"Post to subreddit\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"subreddit\":[{\"value\":{\"subreddit\":\"programming\",\"title\":\"My Title\",\"type\":\"text\",\"url\":\"\",\"is_flair_required\":false}}]}\\' -i \"reddit-123\"',\n 'Reddit post with specific subreddit settings'\n )\n .example(\n '$0 posts:create -c \"Video description\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"title\":\"My Video\",\"type\":\"public\",\"tags\":[{\"value\":\"tech\",\"label\":\"Tech\"}]}\\' -i \"youtube-123\"',\n 'YouTube post with title and tags'\n )\n .example(\n '$0 posts:create -c \"Tweet content\" -s \"2024-12-31T12:00:00Z\" --settings \\'{\"who_can_reply_post\":\"everyone\"}\\' -i \"twitter-123\"',\n 'X (Twitter) post with reply settings'\n );\n },\n createPost as any\n )\n .command(\n 'posts:list',\n 'List all posts',\n (yargs: Argv) => {\n return yargs\n .option('startDate', {\n describe: 'Start date (ISO 8601 format). Default: 30 days ago',\n type: 'string',\n })\n .option('endDate', {\n describe: 'End date (ISO 8601 format). Default: 30 days from now',\n type: 'string',\n })\n .option('customer', {\n describe: 'Customer ID (optional)',\n type: 'string',\n })\n .example('$0 posts:list', 'List all posts (last 30 days to next 30 days)')\n .example(\n '$0 posts:list --startDate \"2024-01-01T00:00:00Z\" --endDate \"2024-12-31T23:59:59Z\"',\n 'List posts for a specific date range'\n )\n .example(\n '$0 posts:list --customer \"customer-id\"',\n 'List posts for a specific customer'\n );\n },\n listPosts as any\n )\n .command(\n 'posts:delete <id>',\n 'Delete a post',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID to delete',\n type: 'string',\n })\n .example('$0 posts:delete abc123', 'Delete post with ID abc123');\n },\n deletePost as any\n )\n .command(\n 'posts:missing <id>',\n 'List available content from the provider for a post with missing release ID',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .example(\n '$0 posts:missing post-123',\n 'Get available content to connect to a post'\n );\n },\n getMissingContent as any\n )\n .command(\n 'posts:connect <id>',\n 'Connect a post to its published content by updating the release ID',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .option('release-id', {\n describe: 'The platform-specific content ID to connect',\n type: 'string',\n demandOption: true,\n })\n .example(\n '$0 posts:connect post-123 --release-id \"7321456789012345678\"',\n 'Connect a post to its published content'\n );\n },\n connectPost as any\n )\n .command(\n 'integrations:list',\n 'List all connected integrations',\n {},\n listIntegrations as any\n )\n .command(\n 'integrations:settings <id>',\n 'Get settings schema for a specific integration',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .example(\n '$0 integrations:settings reddit-123',\n 'Get settings schema for Reddit integration'\n )\n .example(\n '$0 integrations:settings youtube-456',\n 'Get settings schema for YouTube integration'\n );\n },\n getIntegrationSettings as any\n )\n .command(\n 'integrations:trigger <id> <method>',\n 'Trigger an integration tool to fetch additional data',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .positional('method', {\n describe: 'Method name from the integration tools',\n type: 'string',\n })\n .option('data', {\n alias: 'd',\n describe: 'Data to pass to the tool as JSON string',\n type: 'string',\n })\n .example(\n '$0 integrations:trigger reddit-123 getSubreddits',\n 'Get list of subreddits'\n )\n .example(\n '$0 integrations:trigger reddit-123 searchSubreddits -d \\'{\"query\":\"programming\"}\\'',\n 'Search for subreddits'\n )\n .example(\n '$0 integrations:trigger youtube-123 getPlaylists',\n 'Get YouTube playlists'\n );\n },\n triggerIntegrationTool as any\n )\n .command(\n 'analytics:platform <id>',\n 'Get analytics for a specific integration/channel',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Integration ID',\n type: 'string',\n })\n .option('date', {\n alias: 'd',\n describe: 'Number of days to look back (default: 7)',\n type: 'string',\n default: '7',\n })\n .example(\n '$0 analytics:platform integration-123',\n 'Get last 7 days of analytics'\n )\n .example(\n '$0 analytics:platform integration-123 -d 30',\n 'Get last 30 days of analytics'\n );\n },\n getAnalytics as any\n )\n .command(\n 'analytics:post <id>',\n 'Get analytics for a specific post',\n (yargs: Argv) => {\n return yargs\n .positional('id', {\n describe: 'Post ID',\n type: 'string',\n })\n .option('date', {\n alias: 'd',\n describe: 'Number of days to look back (default: 7)',\n type: 'string',\n default: '7',\n })\n .example(\n '$0 analytics:post post-123',\n 'Get last 7 days of post analytics'\n )\n .example(\n '$0 analytics:post post-123 -d 30',\n 'Get last 30 days of post analytics'\n );\n },\n getPostAnalytics as any\n )\n .command(\n 'upload <file>',\n 'Upload a file',\n (yargs: Argv) => {\n return yargs\n .positional('file', {\n describe: 'File path to upload',\n type: 'string',\n })\n .example('$0 upload ./image.png', 'Upload an image');\n },\n uploadFile as any\n )\n .demandCommand(1, 'You need at least one command')\n .help()\n .alias('h', 'help')\n .version()\n .alias('v', 'version')\n .epilogue(\n 'For more information, visit: https://postiz.com\\n\\nSet your API key: export POSTIZ_API_KEY=your_api_key'\n )\n .parse();\n","import fetch, { FormData } from 'node-fetch';\n\nexport interface PostizConfig {\n apiKey: string;\n apiUrl?: string;\n}\n\nexport class PostizAPI {\n private apiKey: string;\n private apiUrl: string;\n\n constructor(config: PostizConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl || 'https://api.postiz.com';\n }\n\n private async request(endpoint: string, options: any = {}) {\n const url = `${this.apiUrl}${endpoint}`;\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: this.apiKey,\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API Error (${response.status}): ${error}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Request failed: ${error.message}`);\n }\n }\n\n async createPost(data: any) {\n return this.request('/public/v1/posts', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async listPosts(filters: any = {}) {\n const queryString = new URLSearchParams(\n Object.entries(filters).reduce((acc, [key, value]) => {\n if (value !== undefined && value !== null) {\n acc[key] = String(value);\n }\n return acc;\n }, {} as Record<string, string>)\n ).toString();\n\n const endpoint = queryString\n ? `/public/v1/posts?${queryString}`\n : '/public/v1/posts';\n\n return this.request(endpoint, {\n method: 'GET',\n });\n }\n\n async deletePost(id: string) {\n return this.request(`/public/v1/posts/${id}`, {\n method: 'DELETE',\n });\n }\n\n async upload(file: Buffer, filename: string) {\n const formData = new FormData();\n const extension = filename.split('.').pop()?.toLowerCase() || '';\n\n // Determine MIME type based on file extension\n const mimeTypes: Record<string, string> = {\n // Images\n 'png': 'image/png',\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'bmp': 'image/bmp',\n 'ico': 'image/x-icon',\n\n // Videos\n 'mp4': 'video/mp4',\n 'mov': 'video/quicktime',\n 'avi': 'video/x-msvideo',\n 'mkv': 'video/x-matroska',\n 'webm': 'video/webm',\n 'flv': 'video/x-flv',\n 'wmv': 'video/x-ms-wmv',\n 'm4v': 'video/x-m4v',\n 'mpeg': 'video/mpeg',\n 'mpg': 'video/mpeg',\n '3gp': 'video/3gpp',\n\n // Audio\n 'mp3': 'audio/mpeg',\n 'wav': 'audio/wav',\n 'ogg': 'audio/ogg',\n 'aac': 'audio/aac',\n 'flac': 'audio/flac',\n 'm4a': 'audio/mp4',\n\n // Documents\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n };\n\n const type = mimeTypes[extension] || 'application/octet-stream';\n\n const blob = new Blob([file], { type });\n formData.append('file', blob, filename);\n\n const url = `${this.apiUrl}/public/v1/upload`;\n const response = await fetch(url, {\n method: 'POST',\n // @ts-ignore\n body: formData,\n headers: {\n Authorization: this.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Upload failed (${response.status}): ${error}`);\n }\n\n return await response.json();\n }\n\n async getMissingContent(postId: string) {\n return this.request(`/public/v1/posts/${postId}/missing`, {\n method: 'GET',\n });\n }\n\n async updateReleaseId(postId: string, releaseId: string) {\n return this.request(`/public/v1/posts/${postId}/release-id`, {\n method: 'PUT',\n body: JSON.stringify({ releaseId }),\n });\n }\n\n async getAnalytics(integrationId: string, date: string) {\n return this.request(`/public/v1/analytics/${integrationId}?date=${encodeURIComponent(date)}`, {\n method: 'GET',\n });\n }\n\n async getPostAnalytics(postId: string, date: string) {\n return this.request(`/public/v1/analytics/post/${postId}?date=${encodeURIComponent(date)}`, {\n method: 'GET',\n });\n }\n\n async listIntegrations() {\n return this.request('/public/v1/integrations', {\n method: 'GET',\n });\n }\n\n async getIntegrationSettings(integrationId: string) {\n return this.request(`/public/v1/integration-settings/${integrationId}`, {\n method: 'GET',\n });\n }\n\n async triggerIntegrationTool(\n integrationId: string,\n methodName: string,\n data: Record<string, string>\n ) {\n return this.request(`/public/v1/integration-trigger/${integrationId}`, {\n method: 'POST',\n body: JSON.stringify({ methodName, data }),\n });\n }\n}\n","import { PostizConfig } from './api';\n\nexport function getConfig(): PostizConfig {\n const apiKey = process.env.POSTIZ_API_KEY;\n const apiUrl = process.env.POSTIZ_API_URL;\n\n if (!apiKey) {\n console.error('❌ Error: POSTIZ_API_KEY environment variable is required');\n console.error('Please set it using: export POSTIZ_API_KEY=your_api_key');\n process.exit(1);\n }\n\n return {\n apiKey,\n apiUrl,\n };\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\nimport { readFileSync, existsSync } from 'fs';\n\nexport async function getMissingContent(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n try {\n const result = await api.getMissingContent(args.id);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get missing content:', error.message);\n process.exit(1);\n }\n}\n\nexport async function connectPost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n if (!args.releaseId) {\n console.error('❌ --release-id is required');\n process.exit(1);\n }\n\n try {\n const result = await api.updateReleaseId(args.id, args.releaseId);\n console.log(`✅ Post ${args.id} connected to release ${args.releaseId}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to connect post:', error.message);\n process.exit(1);\n }\n}\n\nexport async function createPost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n // Support both simple and complex post creation\n let postData: any;\n\n if (args.json) {\n // Load from JSON file for complex posts with comments and media\n try {\n const jsonPath = args.json;\n if (!existsSync(jsonPath)) {\n console.error(`❌ JSON file not found: ${jsonPath}`);\n process.exit(1);\n }\n const jsonContent = readFileSync(jsonPath, 'utf-8');\n postData = JSON.parse(jsonContent);\n } catch (error: any) {\n console.error('❌ Failed to parse JSON file:', error.message);\n process.exit(1);\n }\n } else {\n const integrations = args.integrations\n ? args.integrations.split(',').map((id: string) => id.trim())\n : [];\n\n if (integrations.length === 0) {\n console.error('❌ At least one integration ID is required');\n console.error('Use -i or --integrations to specify integration IDs');\n console.error('Run \"postiz integrations:list\" to see available integrations');\n process.exit(1);\n }\n\n // Support multiple -c and -m flags\n // Normalize to arrays\n const contents = Array.isArray(args.content) ? args.content : [args.content];\n const medias = Array.isArray(args.media) ? args.media : (args.media ? [args.media] : []);\n\n if (!contents[0]) {\n console.error('❌ At least one -c/--content is required');\n process.exit(1);\n }\n\n // Build value array by pairing contents with their media\n const values = contents.map((content: string, index: number) => {\n const mediaForThisContent = medias[index];\n const images = mediaForThisContent\n ? mediaForThisContent.split(',').map((img: string) => ({\n id: Math.random().toString(36).substring(7),\n path: img.trim(),\n }))\n : [];\n\n return {\n content: content,\n image: images,\n delay: args?.delay || 0,\n };\n });\n\n // Parse provider-specific settings if provided\n // Note: __type is automatically added by the backend based on integration ID\n let settings: any = undefined;\n\n if (args.settings) {\n try {\n settings = typeof args.settings === 'string'\n ? JSON.parse(args.settings)\n : args.settings;\n } catch (error: any) {\n console.error('❌ Failed to parse settings JSON:', error.message);\n process.exit(1);\n }\n }\n\n // Build the proper post structure\n postData = {\n type: args.type || 'schedule', // 'schedule' or 'draft'\n date: args.date, // Required date field\n shortLink: args.shortLink !== false,\n tags: [],\n posts: integrations.map((integrationId: string) => ({\n integration: { id: integrationId },\n value: values,\n settings: settings,\n })),\n };\n }\n\n try {\n const result = await api.createPost(postData);\n console.log('✅ Post created successfully!');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to create post:', error.message);\n process.exit(1);\n }\n}\n\nexport async function listPosts(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n // Set default date range: last 30 days to 30 days in the future\n const defaultStartDate = new Date();\n defaultStartDate.setDate(defaultStartDate.getDate() - 30);\n\n const defaultEndDate = new Date();\n defaultEndDate.setDate(defaultEndDate.getDate() + 30);\n\n // Only send fields that are in GetPostsDto\n const filters: any = {\n startDate: args.startDate || defaultStartDate.toISOString(),\n endDate: args.endDate || defaultEndDate.toISOString(),\n };\n\n // customer is optional in the DTO\n if (args.customer) {\n filters.customer = args.customer;\n }\n\n try {\n const result = await api.listPosts(filters);\n console.log('📋 Posts:');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to list posts:', error.message);\n process.exit(1);\n }\n}\n\nexport async function deletePost(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n try {\n await api.deletePost(args.id);\n console.log(`✅ Post ${args.id} deleted successfully!`);\n } catch (error: any) {\n console.error('❌ Failed to delete post:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\n\nexport async function listIntegrations() {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n try {\n const result = await api.listIntegrations();\n console.log('🔌 Connected Integrations:');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to list integrations:', error.message);\n process.exit(1);\n }\n}\n\nexport async function getIntegrationSettings(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n try {\n const result = await api.getIntegrationSettings(args.id);\n console.log(`⚙️ Settings for integration: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get integration settings:', error.message);\n process.exit(1);\n }\n}\n\nexport async function triggerIntegrationTool(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n if (!args.method) {\n console.error('❌ Method name is required');\n process.exit(1);\n }\n\n // Parse data from JSON string or use empty object\n let data: Record<string, string> = {};\n if (args.data) {\n try {\n data = JSON.parse(args.data);\n } catch (error: any) {\n console.error('❌ Failed to parse data JSON:', error.message);\n process.exit(1);\n }\n }\n\n try {\n const result = await api.triggerIntegrationTool(args.id, args.method, data);\n console.log(`🔧 Tool result for ${args.method}:`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to trigger tool:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\n\nexport async function getAnalytics(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Integration ID is required');\n process.exit(1);\n }\n\n const date = args.date || '7';\n\n try {\n const result = await api.getAnalytics(args.id, date);\n console.log(`📊 Analytics for integration: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get analytics:', error.message);\n process.exit(1);\n }\n}\n\nexport async function getPostAnalytics(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.id) {\n console.error('❌ Post ID is required');\n process.exit(1);\n }\n\n const date = args.date || '7';\n\n try {\n const result = await api.getPostAnalytics(args.id, date);\n console.log(`📊 Analytics for post: ${args.id}`);\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to get post analytics:', error.message);\n process.exit(1);\n }\n}\n","import { PostizAPI } from '../api';\nimport { getConfig } from '../config';\nimport { readFileSync } from 'fs';\n\nexport async function uploadFile(args: any) {\n const config = getConfig();\n const api = new PostizAPI(config);\n\n if (!args.file) {\n console.error('❌ File path is required');\n process.exit(1);\n }\n\n try {\n const fileBuffer = readFileSync(args.file);\n const filename = args.file.split('/').pop() || 'file';\n\n const result = await api.upload(fileBuffer, filename);\n console.log('✅ File uploaded successfully!');\n console.log(JSON.stringify(result, null, 2));\n return result;\n } catch (error: any) {\n console.error('❌ Failed to upload file:', error.message);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["fetch","import_fs","yargs"]}
{
"name": "postiz",
"version": "2.0.10",
"version": "2.0.11",
"description": "Postiz CLI - Command line interface for the Postiz social media scheduling API",

@@ -5,0 +5,0 @@ "main": "dist/index.js",

@@ -19,23 +19,2 @@ # Postiz CLI

### From Source
```bash
git clone https://github.com/gitroomhq/postiz-app.git
cd postiz-app/apps/cli
pnpm install
pnpm run build
pnpm link --global
```
### For Development
```bash
pnpm install
pnpm run build
pnpm link --global
# Or run directly without linking
pnpm run start -- posts:list
```
---

@@ -151,3 +130,3 @@

- `-i, --integrations` - Comma-separated integration IDs (required)
- `-d, --delay` - Delay between comments in milliseconds (default: 5000)
- `-d, --delay` - Delay between comments in minutes (default: 0)
- `--settings` - Platform-specific settings as JSON string

@@ -154,0 +133,0 @@ - `-j, --json` - Path to JSON file with full post structure

+55
-48

@@ -8,2 +8,14 @@ ---

## Install Postiz if it doesn't exist
```bash
npm install -g postiz
# or
pnpm install -g postiz
```
npm release: https://www.npmjs.com/package/postiz
---
| Property | Value |

@@ -310,27 +322,24 @@ |----------|-------|

```javascript
const { execSync } = require('child_process');
```bash
#!/bin/bash
function validateAndPost(content, integrationId, settings) {
// Get integration settings
const settingsResult = execSync(
`postiz integrations:settings ${integrationId}`,
{ encoding: 'utf-8' }
);
const schema = JSON.parse(settingsResult);
INTEGRATION_ID="twitter-123"
CONTENT="Your post content here"
// Check character limit
if (content.length > schema.output.maxLength) {
console.warn(`Content exceeds ${schema.output.maxLength} chars, truncating...`);
content = content.substring(0, schema.output.maxLength - 3) + '...';
}
# Get integration settings and extract max length
SETTINGS_JSON=$(postiz integrations:settings "$INTEGRATION_ID")
MAX_LENGTH=$(echo "$SETTINGS_JSON" | jq '.output.maxLength')
// Create post
const result = execSync(
`postiz posts:create -c "${content}" -s "2024-12-31T12:00:00Z" --settings '${JSON.stringify(settings)}' -i "${integrationId}"`,
{ encoding: 'utf-8' }
);
# Check character limit and truncate if needed
if [ ${#CONTENT} -gt "$MAX_LENGTH" ]; then
echo "Content exceeds $MAX_LENGTH chars, truncating..."
CONTENT="${CONTENT:0:$((MAX_LENGTH - 3))}..."
fi
return JSON.parse(result);
}
# Create post with settings
postiz posts:create \
-c "$CONTENT" \
-s "2024-12-31T12:00:00Z" \
--settings '{"key": "value"}' \
-i "$INTEGRATION_ID"
```

@@ -368,27 +377,26 @@

```javascript
const { execSync } = require('child_process');
```bash
#!/bin/bash
async function postWithRetry(content, integrationId, date, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const result = execSync(
`postiz posts:create -c "${content}" -s "${date}" -i "${integrationId}"`,
{ encoding: 'utf-8', stdio: 'pipe' }
);
console.log('✅ Post created successfully');
return JSON.parse(result);
} catch (error) {
console.error(`❌ Attempt ${attempt} failed: ${error.message}`);
CONTENT="Your post content"
INTEGRATION_ID="twitter-123"
DATE="2024-12-31T12:00:00Z"
MAX_RETRIES=3
if (attempt < maxRetries) {
const delay = Math.pow(2, attempt) * 1000; // Exponential backoff
console.log(`⏳ Retrying in ${delay}ms...`);
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw new Error(`Failed after ${maxRetries} attempts`);
}
}
}
}
for attempt in $(seq 1 $MAX_RETRIES); do
if postiz posts:create -c "$CONTENT" -s "$DATE" -i "$INTEGRATION_ID"; then
echo "Post created successfully"
break
else
echo "Attempt $attempt failed"
if [ "$attempt" -lt "$MAX_RETRIES" ]; then
DELAY=$((2 ** attempt))
echo "Retrying in ${DELAY}s..."
sleep "$DELAY"
else
echo "Failed after $MAX_RETRIES attempts"
exit 1
fi
fi
done
```

@@ -460,3 +468,3 @@

-s "2024-12-31T12:00:00Z" \
-d 5000 \ # Delay between comments in ms
-d 5 \ # Delay between comments in minutes
-i "integration-id"

@@ -471,4 +479,4 @@ ```

{ "content": "Main post", "image": ["image1.jpg", "image2.jpg"] },
{ "content": "Comment 1", "image": ["comment-img.jpg"], "delay": 5000 },
{ "content": "Comment 2", "image": ["another.jpg", "more.jpg"], "delay": 5000 }
{ "content": "Comment 1", "image": ["comment-img.jpg"], "delay": 5 },
{ "content": "Comment 2", "image": ["another.jpg", "more.jpg"], "delay": 5 }
]

@@ -629,3 +637,2 @@ }]

- [examples/basic-usage.sh](./examples/basic-usage.sh) - Shell script basics
- [examples/ai-agent-example.js](./examples/ai-agent-example.js) - Node.js agent
- [examples/post-with-comments.json](./examples/post-with-comments.json) - Threading example

@@ -632,0 +639,0 @@ - [examples/multi-platform-with-settings.json](./examples/multi-platform-with-settings.json) - Campaign example