pixel-forge
Version:
A comprehensive generator for social media previews, favicons, and visual assets across all platforms
128 lines (127 loc) • 5.25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LinkedInGenerator = void 0;
const path_1 = __importDefault(require("path"));
const image_processor_1 = require("../../core/image-processor");
class LinkedInGenerator {
constructor(sourceImage, config) {
this.config = config;
this.sourceImage = sourceImage;
}
/**
* Generate LinkedIn-optimized images
*/
async generate(options = {}) {
const { includeStandard = true, includeCompany = false, title, description, template = 'basic' } = options;
if (includeStandard) {
await this.generateStandardImage(title, description, template);
}
if (includeCompany) {
await this.generateCompanyImage(title, description, template);
}
}
/**
* Generate standard LinkedIn image (1200x627)
*/
async generateStandardImage(title, description, template) {
const processor = new image_processor_1.ImageProcessor(this.sourceImage);
const outputPath = path_1.default.join(this.config.output.path, 'linkedin-share.png');
const socialFile = await processor.createSocialPreview({
width: image_processor_1.ImageSizes.social.linkedin.width,
height: image_processor_1.ImageSizes.social.linkedin.height,
title,
description,
template,
background: this.config.backgroundColor
});
const finalProcessor = new image_processor_1.ImageProcessor(socialFile);
await finalProcessor.save(outputPath);
await processor.cleanup();
}
/**
* Generate LinkedIn company page image (1104x736)
*/
async generateCompanyImage(title, description, template) {
const processor = new image_processor_1.ImageProcessor(this.sourceImage);
const outputPath = path_1.default.join(this.config.output.path, 'linkedin-company.png');
const socialFile = await processor.createSocialPreview({
width: image_processor_1.ImageSizes.social.linkedinCompany.width,
height: image_processor_1.ImageSizes.social.linkedinCompany.height,
title,
description,
template,
background: this.config.backgroundColor
});
const finalProcessor = new image_processor_1.ImageProcessor(socialFile);
await finalProcessor.save(outputPath);
await processor.cleanup();
}
/**
* Generate square LinkedIn image (1200x1200)
*/
async generateSquareImage(title, description, template) {
const processor = new image_processor_1.ImageProcessor(this.sourceImage);
const outputPath = path_1.default.join(this.config.output.path, 'linkedin-square.png');
const socialFile = await processor.createSocialPreview({
width: 1200,
height: 1200,
title,
description,
template,
background: this.config.backgroundColor
});
const finalProcessor = new image_processor_1.ImageProcessor(socialFile);
await finalProcessor.save(outputPath);
await processor.cleanup();
}
/**
* Get HTML meta tags for LinkedIn
*/
getMetaTags() {
const prefix = this.config.output.prefix || '/';
return [
`<meta property="og:image" content="${prefix}linkedin.png">`,
`<meta property="og:image:width" content="${image_processor_1.ImageSizes.social.linkedin.width}">`,
`<meta property="og:image:height" content="${image_processor_1.ImageSizes.social.linkedin.height}">`,
`<meta property="og:image:type" content="image/png">`,
`<meta property="og:title" content="${this.config.appName}">`,
`<meta property="og:description" content="${this.config.description || ''}">`,
`<meta property="og:type" content="article">`,
// LinkedIn-specific meta tags
`<meta property="article:author" content="">`, // Can be configured later
`<meta property="og:site_name" content="${this.config.appName}">`,
];
}
/**
* Get Next.js metadata configuration for LinkedIn
*/
getNextMetadata() {
const prefix = this.config.output.prefix || '/';
return {
openGraph: {
title: this.config.appName,
description: this.config.description,
images: [
{
url: `${prefix}linkedin.png`,
width: image_processor_1.ImageSizes.social.linkedin.width,
height: image_processor_1.ImageSizes.social.linkedin.height,
alt: this.config.appName,
}
],
type: 'article',
siteName: this.config.appName,
},
};
}
/**
* Get list of generated files
*/
getGeneratedFiles() {
return ['linkedin.png', 'linkedin-company.png'];
}
}
exports.LinkedInGenerator = LinkedInGenerator;