html-image-generator
Advanced tools
Comparing version
@@ -12,4 +12,5 @@ /// <reference types="node" /> | ||
generateOptions: GenerateImageOptions; | ||
concurrency?: number; | ||
log?: boolean; | ||
}; | ||
export declare const generate: ({ template, data, baseDir, assetsDir, generateOptions, log, }: CoreOptions) => Promise<(Buffer | string | undefined)[]>; | ||
export declare const generate: ({ template, data, baseDir, assetsDir, generateOptions, concurrency, log, }: CoreOptions) => Promise<(Buffer | string | undefined)[]>; |
@@ -1,2 +0,1 @@ | ||
import { promises as fs } from 'fs'; | ||
import path from 'path'; | ||
@@ -7,13 +6,16 @@ import pLimit from 'p-limit'; | ||
import { closeServer, listenServer } from './modules/server.js'; | ||
const limit = pLimit(3); | ||
export const generate = async ({ template, data, baseDir, assetsDir, generateOptions, log = false, }) => { | ||
export const generate = async ({ template, data, baseDir, assetsDir, generateOptions, concurrency = 3, log = false, }) => { | ||
const limit = pLimit(concurrency); | ||
const port = await listenServer(assetsDir); | ||
const images = await Promise.all(data.map((d) => limit(async () => { | ||
const filePath = 'dist' in d && d.dist ? path.resolve(baseDir, d.dist) : undefined; | ||
const html = generateHtml(template, { ...d, assetsDir: `http://localhost:${port}` }); | ||
const image = await generateImage(html, generateOptions); | ||
if ('dist' in d && d.dist) { | ||
const file = path.resolve(baseDir, d.dist); | ||
const dir = path.dirname(file); | ||
await fs.mkdir(dir, { recursive: true }); | ||
await fs.writeFile(file, image); | ||
const image = await generateImage(html, { | ||
viewport: generateOptions.viewport, | ||
screenshotOptions: { | ||
...generateOptions.screenshotOptions, | ||
path: filePath, | ||
}, | ||
}); | ||
if (filePath) { | ||
log && console.log(`✔︎ Generated: ${d.dist}`); | ||
@@ -20,0 +22,0 @@ return; |
@@ -35,2 +35,3 @@ import { promises as fs } from 'fs'; | ||
}, | ||
concurrency: options.concurrency, | ||
}; | ||
@@ -48,6 +49,6 @@ }; | ||
const baseDir = path.resolve(rootDir, dir); | ||
const callback = async (...args) => { | ||
const callback = async () => { | ||
const options = await buildOptions(dir); | ||
const data = options.data.slice(0, 1); | ||
const distFile = path.resolve(baseDir, `_dev.${options.generateOptions.screenshotOptions?.type || 'png'}`); | ||
const distFile = path.resolve(baseDir, `_dev.${options.generateOptions.screenshotOptions?.type ?? 'png'}`); | ||
data[0].dist = distFile; | ||
@@ -54,0 +55,0 @@ await core.generate({ |
/// <reference types="node" /> | ||
import { ScreenshotOptions, Viewport } from 'puppeteer'; | ||
import { PageScreenshotOptions, ViewportSize } from 'playwright-core'; | ||
export declare type GenerateOptions = { | ||
viewport: Viewport; | ||
screenshotOptions?: ScreenshotOptions; | ||
viewport: ViewportSize; | ||
screenshotOptions?: PageScreenshotOptions; | ||
}; | ||
export declare const generate: (html: string, options: GenerateOptions) => Promise<string | Buffer>; | ||
export declare const generate: (html: string, options: GenerateOptions) => Promise<Buffer>; |
@@ -1,6 +0,6 @@ | ||
import puppeteer from 'puppeteer'; | ||
import { chromium } from 'playwright-core'; | ||
let launch = null; | ||
const launchBrowser = () => { | ||
if (launch === null) { | ||
launch = puppeteer.launch({ | ||
launch = chromium.launch({ | ||
headless: true, | ||
@@ -15,6 +15,7 @@ args: ['--no-sandbox', '--font-render-hinting=none'], | ||
const page = await browser.newPage(); | ||
await page.setViewport(options.viewport); | ||
await page.setContent(html, { waitUntil: 'networkidle0' }); | ||
await page.setViewportSize(options.viewport); | ||
await page.setContent(html, { waitUntil: 'networkidle' }); | ||
const image = await page.screenshot(options.screenshotOptions); | ||
await page.close(); | ||
return image; | ||
}; |
{ | ||
"name": "html-image-generator", | ||
"version": "1.1.0", | ||
"version": "2.0.0", | ||
"repository": "git@github.com:amotarao/html-image-generator.git", | ||
@@ -41,5 +41,5 @@ "author": "Amon Sawamura <amotarao@gmail.com>", | ||
"p-limit": "^4.0.0", | ||
"puppeteer": "^14.3.0", | ||
"playwright-core": "^1.22.2", | ||
"yargs": "^17.5.1" | ||
} | ||
} |
@@ -140,5 +140,6 @@ # HTML Image Generator | ||
height: 630 # required | ||
type: png # optional: png, jpeg or webp. NOT jpg. | ||
type: png # optional: png (default), jpeg or webp. NOT jpg. | ||
quality: 70 # optional: valid with jpeg and webp | ||
omitBackground: true # optional: transparent background | ||
concurrency: 3 # optional | ||
``` | ||
@@ -145,0 +146,0 @@ |
10898
2.02%194
2.65%153
0.66%2
-33.33%+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed