@resoc/create-img
Advanced tools
Comparing version 0.7.1 to 0.8.1
/// <reference types="node" /> | ||
import { ImageTemplate, ImageResolution, ParamValues } from '@resoc/core'; | ||
import type puppeteer from 'puppeteer'; | ||
import type { Browser } from 'puppeteer'; | ||
import type { Browser, ScreenshotOptions } from 'puppeteer'; | ||
import { ImageResolution, ImageTemplate, ParamValues } from '@resoc/core'; | ||
declare type LocalTemplateOptions = { | ||
@@ -9,15 +8,7 @@ cache?: boolean; | ||
}; | ||
export declare const fileExists: (path: string) => Promise<boolean>; | ||
export declare const cachedImageName: (templateDir: string, values: ParamValues, imagePath: string) => Promise<string>; | ||
export declare const createImage: (templateManifestPath: string, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, options?: LocalTemplateOptions | undefined) => Promise<string>; | ||
export declare const compileLocalTemplate: (templateManifestPath: string, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, options?: LocalTemplateOptions | undefined) => Promise<string>; | ||
export declare const isLocalResource: (url: string) => boolean; | ||
export declare const createImageFromTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined, browser?: puppeteer.Browser | undefined) => Promise<void>; | ||
export declare const createAnyImageFromTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, outputOptions: puppeteer.ScreenshotOptions, resourcePath?: string | undefined, browser?: puppeteer.Browser | undefined) => Promise<string | Buffer | void>; | ||
export declare const compileTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined, browser?: puppeteer.Browser | undefined) => Promise<void>; | ||
/** | ||
* Turn a template and values into a local HTML file. The resources are copied locally, so the HTML can be opened as is by a browser. | ||
* @returns The path to the HTML file | ||
*/ | ||
export declare const renderLocalTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, resourcePath?: string | undefined) => Promise<string>; | ||
export declare const createImageFromTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined, browser?: Browser | undefined) => Promise<void>; | ||
export declare const createAnyImageFromTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, outputOptions: ScreenshotOptions, resourcePath?: string | undefined, browser?: Browser | undefined) => Promise<string | Buffer | void>; | ||
export declare const compileTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined, browser?: Browser | undefined) => Promise<void>; | ||
export {}; |
@@ -1,4 +0,3 @@ | ||
export { createImage, createImageFromTemplate, compileTemplate, compileLocalTemplate, cachedImageName, fileExists, renderLocalTemplate } from "./compile"; | ||
export { loadLocalTemplate } from "./local"; | ||
export { parseParameters } from "./parse-parameters"; | ||
export { createImage, createImageFromTemplate, compileTemplate, compileLocalTemplate, } from "./compile"; | ||
export { convertUrlToImage } from "./puppeteer"; | ||
export { cachedImageName, fileExists, renderLocalTemplate, loadLocalTemplate, parseParameters } from '@resoc/create-img-core'; |
@@ -1,10 +0,4 @@ | ||
import { renderTemplateToHtml, ParamType, paramValueToString, stringToParamValue } from '@resoc/core'; | ||
import { promises } from 'fs'; | ||
import path from 'path'; | ||
import os from 'os'; | ||
import copy from 'recursive-copy'; | ||
import { hashElement } from 'folder-hash'; | ||
import sha256 from 'sha256'; | ||
import Mustache from 'mustache'; | ||
import { v4 } from 'uuid'; | ||
import puppeteer from 'puppeteer'; | ||
import createImgCore from '@resoc/create-img-core'; | ||
export { cachedImageName, fileExists, loadLocalTemplate, parseParameters, renderLocalTemplate } from '@resoc/create-img-core'; | ||
@@ -64,142 +58,23 @@ /*! ***************************************************************************** | ||
function __values(o) { | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) return m.call(o); | ||
if (o && typeof o.length === "number") return { | ||
next: function () { | ||
if (o && i >= o.length) o = void 0; | ||
return { value: o && o[i++], done: !o }; | ||
} | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
} | ||
function __asyncValues(o) { | ||
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | ||
var m = o[Symbol.asyncIterator], i; | ||
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); | ||
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } | ||
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } | ||
} | ||
var resolveRelativePath = function (manifestPath, relativePath) { return (path.resolve(path.dirname(manifestPath), relativePath)); }; | ||
var loadLocalTemplate = function (manifestPath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var manifest, _a, _b, partials, _c, _d, partial, patialpath, _e, _f, e_1_1, parameters; | ||
var e_1, _g; | ||
return __generator(this, function (_h) { | ||
switch (_h.label) { | ||
case 0: | ||
_b = (_a = JSON).parse; | ||
return [4 /*yield*/, promises.readFile(manifestPath)]; | ||
case 1: | ||
manifest = _b.apply(_a, [(_h.sent()).toString()]); | ||
partials = {}; | ||
_h.label = 2; | ||
case 2: | ||
_h.trys.push([2, 8, 9, 14]); | ||
_c = __asyncValues(Object.keys(manifest['partials'])); | ||
_h.label = 3; | ||
case 3: return [4 /*yield*/, _c.next()]; | ||
case 4: | ||
if (!(_d = _h.sent(), !_d.done)) return [3 /*break*/, 7]; | ||
partial = _d.value; | ||
patialpath = resolveRelativePath(manifestPath, manifest['partials'][partial]); | ||
_e = partials; | ||
_f = partial; | ||
return [4 /*yield*/, promises.readFile(patialpath)]; | ||
case 5: | ||
_e[_f] = (_h.sent()).toString(); | ||
_h.label = 6; | ||
case 6: return [3 /*break*/, 3]; | ||
case 7: return [3 /*break*/, 14]; | ||
case 8: | ||
e_1_1 = _h.sent(); | ||
e_1 = { error: e_1_1 }; | ||
return [3 /*break*/, 14]; | ||
case 9: | ||
_h.trys.push([9, , 12, 13]); | ||
if (!(_d && !_d.done && (_g = _c["return"]))) return [3 /*break*/, 11]; | ||
return [4 /*yield*/, _g.call(_c)]; | ||
case 10: | ||
_h.sent(); | ||
_h.label = 11; | ||
case 11: return [3 /*break*/, 13]; | ||
case 12: | ||
if (e_1) throw e_1.error; | ||
return [7 /*endfinally*/]; | ||
case 13: return [7 /*endfinally*/]; | ||
case 14: | ||
parameters = []; | ||
manifest['parameters'].forEach(function (param) { | ||
parameters.push(param); | ||
}); | ||
return [2 /*return*/, { | ||
partials: partials, | ||
parameters: parameters | ||
}]; | ||
} | ||
}); | ||
}); }; | ||
var imageFingerprint = function (templateDir, values) { return __awaiter(void 0, void 0, void 0, function () { | ||
var hash; | ||
var puppeteerBrowser = function () { return __awaiter(void 0, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, hashElement(templateDir)]; | ||
case 1: | ||
hash = _a.sent(); | ||
return [4 /*yield*/, sha256(JSON.stringify(hash) + JSON.stringify(values))]; | ||
case 2: return [2 /*return*/, _a.sent()]; | ||
} | ||
return [2 /*return*/, (puppeteer.launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'] | ||
}))]; | ||
}); | ||
}); }; | ||
var defaultLocalBrowser = function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var puppeteer_1, e_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
puppeteer_1 = require('puppeteer'); | ||
return [4 /*yield*/, puppeteer_1.launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'], | ||
})]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
case 2: | ||
e_1 = _a.sent(); | ||
throw new Error("Cannot run local browser with Puppeteer: " + e_1 + ".\nSee https://www.npmjs.com/package/@resoc/create-img#configure-puppeteer"); | ||
case 3: | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var convertUrlToImage = function (url, outputOptions, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var _a, page, image; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
_a = browser; | ||
if (_a) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, defaultLocalBrowser()]; | ||
_b = (_a = createImgCore).convertUrlToImage; | ||
_c = [url, outputOptions]; | ||
_d = browser; | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
_a = (browser = _b.sent()); | ||
_b.label = 2; | ||
case 2: | ||
return [4 /*yield*/, browser.newPage()]; | ||
case 3: | ||
page = _b.sent(); | ||
// Wait until there are no network connexion for 500ms | ||
return [4 /*yield*/, page.goto(url, { waitUntil: [ | ||
'networkidle0', 'domcontentloaded', 'load' | ||
] })]; | ||
case 4: | ||
// Wait until there are no network connexion for 500ms | ||
_b.sent(); | ||
return [4 /*yield*/, page.screenshot(outputOptions)]; | ||
case 5: | ||
image = _b.sent(); | ||
return [4 /*yield*/, browser.close()]; | ||
case 6: | ||
_b.sent(); | ||
return [2 /*return*/, image]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d])))]; | ||
} | ||
@@ -209,55 +84,19 @@ }); | ||
var fileExists = function (path) { return __awaiter(void 0, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, promises.access(path)]; | ||
case 1: | ||
_a.sent(); | ||
return [2 /*return*/, true]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/, false]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var cachedImageName = function (templateDir, values, imagePath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var hash; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, imageFingerprint(templateDir, values)]; | ||
case 1: | ||
hash = _a.sent(); | ||
return [2 /*return*/, Mustache.render(imagePath, { hash: hash })]; | ||
} | ||
}); | ||
}); }; | ||
var createImage = function (templateManifestPath, paramValues, resolution, imagePath, options) { return __awaiter(void 0, void 0, void 0, function () { | ||
var templateDir, template; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
options = Object.assign({}, { | ||
cache: false | ||
}, options); | ||
templateDir = path.resolve(path.dirname(templateManifestPath)); | ||
if (!options.cache) return [3 /*break*/, 3]; | ||
return [4 /*yield*/, cachedImageName(templateDir, paramValues, imagePath)]; | ||
_b = (_a = createImgCore).createImage; | ||
_c = [templateManifestPath, | ||
paramValues, | ||
resolution, | ||
imagePath]; | ||
_d = (options === null || options === void 0 ? void 0 : options.browser); | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
imagePath = _a.sent(); | ||
return [4 /*yield*/, fileExists(imagePath)]; | ||
case 2: | ||
if (_a.sent()) { | ||
return [2 /*return*/, imagePath]; | ||
} | ||
_a.label = 3; | ||
case 3: return [4 /*yield*/, loadLocalTemplate(templateManifestPath)]; | ||
case 4: | ||
template = _a.sent(); | ||
return [4 /*yield*/, createImageFromTemplate(template, paramValues, resolution, imagePath, templateDir, options === null || options === void 0 ? void 0 : options.browser)]; | ||
case 5: | ||
_a.sent(); | ||
return [2 /*return*/, imagePath]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d, (options === null || options === void 0 ? void 0 : options.cache) || false])))]; | ||
} | ||
@@ -268,108 +107,23 @@ }); | ||
var compileLocalTemplate = createImage; | ||
var isLocalResource = function (url) { | ||
var up = url.toLowerCase(); | ||
return (!up.startsWith('http://') && | ||
!up.startsWith('https://') && | ||
!up.startsWith('//') && | ||
!up.startsWith('data:') // Data URL | ||
); | ||
}; | ||
var copyLocalResources = function (parameters, values, tmpDir) { return __awaiter(void 0, void 0, void 0, function () { | ||
var newValues, _i, parameters_1, param, value, v, dest; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
newValues = Object.assign({}, values); | ||
_i = 0, parameters_1 = parameters; | ||
_a.label = 1; | ||
_b = (_a = createImgCore).createImageFromTemplate; | ||
_c = [template, paramValues, resolution, imagePath, resourcePath]; | ||
_d = browser; | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
if (!(_i < parameters_1.length)) return [3 /*break*/, 4]; | ||
param = parameters_1[_i]; | ||
value = values[param.name]; | ||
if (!(param.type === ParamType.ImageUrl && value)) return [3 /*break*/, 3]; | ||
v = paramValueToString(param, value); | ||
if (!isLocalResource(v)) return [3 /*break*/, 3]; | ||
dest = tmpDir + "/" + v4() + "-" + path.basename(v); | ||
return [4 /*yield*/, promises.copyFile(v, dest)]; | ||
case 2: | ||
_a.sent(); | ||
newValues[param.name] = dest; | ||
_a.label = 3; | ||
case 3: | ||
_i++; | ||
return [3 /*break*/, 1]; | ||
case 4: return [2 /*return*/, newValues]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d])))]; | ||
} | ||
}); | ||
}); }; | ||
var isJpeg = function (imagePath) { return (imagePath && imagePath.toLowerCase().endsWith('.jpg') || imagePath.toLowerCase().endsWith('.jpeg')); }; | ||
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var htmlPath; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, renderLocalTemplate(template, paramValues, resolution, resourcePath)]; | ||
case 1: | ||
htmlPath = _a.sent(); | ||
return [4 /*yield*/, convertUrlToImage("file:///" + htmlPath, { | ||
path: imagePath, | ||
quality: isJpeg(imagePath) ? 80 : undefined, | ||
fullPage: true | ||
}, browser)]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
// Old name | ||
var compileTemplate = createImageFromTemplate; | ||
/** | ||
* Turn a template and values into a local HTML file. The resources are copied locally, so the HTML can be opened as is by a browser. | ||
* @returns The path to the HTML file | ||
*/ | ||
var renderLocalTemplate = function (template, paramValues, resolution, resourcePath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var tmpDir, html, htmlPath; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, promises.mkdtemp(path.join(os.tmpdir(), 'resoc-compile-'))]; | ||
case 1: | ||
tmpDir = _a.sent(); | ||
return [4 /*yield*/, copyLocalResources(template.parameters, paramValues, tmpDir)]; | ||
case 2: | ||
// Copy extenal resources | ||
paramValues = _a.sent(); | ||
html = renderTemplateToHtml(template, paramValues, resolution); | ||
htmlPath = tmpDir + "/content.html"; | ||
return [4 /*yield*/, promises.writeFile(htmlPath, html)]; | ||
case 3: | ||
_a.sent(); | ||
if (!resourcePath) return [3 /*break*/, 5]; | ||
return [4 /*yield*/, copy(resourcePath, tmpDir)]; | ||
case 4: | ||
_a.sent(); | ||
_a.label = 5; | ||
case 5: return [2 /*return*/, htmlPath]; | ||
} | ||
}); | ||
}); }; | ||
var parseParameters = function (specs, args) { | ||
var values = {}; | ||
args.forEach(function (arg) { | ||
var equal = arg.indexOf('='); | ||
if (equal <= 0) { | ||
throw ("Invalid parameter name/value: " + arg + ". Expected format is <name>=<value>"); | ||
} | ||
var name = arg.substr(0, equal); | ||
var value = arg.substr(equal + 1); | ||
var spec = specs.find(function (p) { return p.name === name; }); | ||
if (!spec) { | ||
throw ("Unknown parameter " + name); | ||
} | ||
values[name] = stringToParamValue(spec, value); | ||
}); | ||
return values; | ||
}; | ||
export { cachedImageName, compileLocalTemplate, compileTemplate, convertUrlToImage, createImage, createImageFromTemplate, fileExists, loadLocalTemplate, parseParameters, renderLocalTemplate }; | ||
export { compileLocalTemplate, compileTemplate, convertUrlToImage, createImage, createImageFromTemplate }; | ||
//# sourceMappingURL=index.es.js.map |
@@ -5,19 +5,9 @@ 'use strict'; | ||
var core = require('@resoc/core'); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var os = require('os'); | ||
var copy = require('recursive-copy'); | ||
var folderHash = require('folder-hash'); | ||
var sha256 = require('sha256'); | ||
var Mustache = require('mustache'); | ||
var uuid = require('uuid'); | ||
var puppeteer = require('puppeteer'); | ||
var createImgCore = require('@resoc/create-img-core'); | ||
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } | ||
var path__default = /*#__PURE__*/_interopDefaultLegacy(path); | ||
var os__default = /*#__PURE__*/_interopDefaultLegacy(os); | ||
var copy__default = /*#__PURE__*/_interopDefaultLegacy(copy); | ||
var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256); | ||
var Mustache__default = /*#__PURE__*/_interopDefaultLegacy(Mustache); | ||
var puppeteer__default = /*#__PURE__*/_interopDefaultLegacy(puppeteer); | ||
var createImgCore__default = /*#__PURE__*/_interopDefaultLegacy(createImgCore); | ||
@@ -77,142 +67,23 @@ /*! ***************************************************************************** | ||
function __values(o) { | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) return m.call(o); | ||
if (o && typeof o.length === "number") return { | ||
next: function () { | ||
if (o && i >= o.length) o = void 0; | ||
return { value: o && o[i++], done: !o }; | ||
} | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
} | ||
function __asyncValues(o) { | ||
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | ||
var m = o[Symbol.asyncIterator], i; | ||
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); | ||
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } | ||
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } | ||
} | ||
var resolveRelativePath = function (manifestPath, relativePath) { return (path__default['default'].resolve(path__default['default'].dirname(manifestPath), relativePath)); }; | ||
var loadLocalTemplate = function (manifestPath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var manifest, _a, _b, partials, _c, _d, partial, patialpath, _e, _f, e_1_1, parameters; | ||
var e_1, _g; | ||
return __generator(this, function (_h) { | ||
switch (_h.label) { | ||
case 0: | ||
_b = (_a = JSON).parse; | ||
return [4 /*yield*/, fs.promises.readFile(manifestPath)]; | ||
case 1: | ||
manifest = _b.apply(_a, [(_h.sent()).toString()]); | ||
partials = {}; | ||
_h.label = 2; | ||
case 2: | ||
_h.trys.push([2, 8, 9, 14]); | ||
_c = __asyncValues(Object.keys(manifest['partials'])); | ||
_h.label = 3; | ||
case 3: return [4 /*yield*/, _c.next()]; | ||
case 4: | ||
if (!(_d = _h.sent(), !_d.done)) return [3 /*break*/, 7]; | ||
partial = _d.value; | ||
patialpath = resolveRelativePath(manifestPath, manifest['partials'][partial]); | ||
_e = partials; | ||
_f = partial; | ||
return [4 /*yield*/, fs.promises.readFile(patialpath)]; | ||
case 5: | ||
_e[_f] = (_h.sent()).toString(); | ||
_h.label = 6; | ||
case 6: return [3 /*break*/, 3]; | ||
case 7: return [3 /*break*/, 14]; | ||
case 8: | ||
e_1_1 = _h.sent(); | ||
e_1 = { error: e_1_1 }; | ||
return [3 /*break*/, 14]; | ||
case 9: | ||
_h.trys.push([9, , 12, 13]); | ||
if (!(_d && !_d.done && (_g = _c["return"]))) return [3 /*break*/, 11]; | ||
return [4 /*yield*/, _g.call(_c)]; | ||
case 10: | ||
_h.sent(); | ||
_h.label = 11; | ||
case 11: return [3 /*break*/, 13]; | ||
case 12: | ||
if (e_1) throw e_1.error; | ||
return [7 /*endfinally*/]; | ||
case 13: return [7 /*endfinally*/]; | ||
case 14: | ||
parameters = []; | ||
manifest['parameters'].forEach(function (param) { | ||
parameters.push(param); | ||
}); | ||
return [2 /*return*/, { | ||
partials: partials, | ||
parameters: parameters | ||
}]; | ||
} | ||
}); | ||
}); }; | ||
var imageFingerprint = function (templateDir, values) { return __awaiter(void 0, void 0, void 0, function () { | ||
var hash; | ||
var puppeteerBrowser = function () { return __awaiter(void 0, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, folderHash.hashElement(templateDir)]; | ||
case 1: | ||
hash = _a.sent(); | ||
return [4 /*yield*/, sha256__default['default'](JSON.stringify(hash) + JSON.stringify(values))]; | ||
case 2: return [2 /*return*/, _a.sent()]; | ||
} | ||
return [2 /*return*/, (puppeteer__default['default'].launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'] | ||
}))]; | ||
}); | ||
}); }; | ||
var defaultLocalBrowser = function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var puppeteer_1, e_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
puppeteer_1 = require('puppeteer'); | ||
return [4 /*yield*/, puppeteer_1.launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'], | ||
})]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
case 2: | ||
e_1 = _a.sent(); | ||
throw new Error("Cannot run local browser with Puppeteer: " + e_1 + ".\nSee https://www.npmjs.com/package/@resoc/create-img#configure-puppeteer"); | ||
case 3: | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var convertUrlToImage = function (url, outputOptions, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var _a, page, image; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
_a = browser; | ||
if (_a) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, defaultLocalBrowser()]; | ||
_b = (_a = createImgCore__default['default']).convertUrlToImage; | ||
_c = [url, outputOptions]; | ||
_d = browser; | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
_a = (browser = _b.sent()); | ||
_b.label = 2; | ||
case 2: | ||
return [4 /*yield*/, browser.newPage()]; | ||
case 3: | ||
page = _b.sent(); | ||
// Wait until there are no network connexion for 500ms | ||
return [4 /*yield*/, page.goto(url, { waitUntil: [ | ||
'networkidle0', 'domcontentloaded', 'load' | ||
] })]; | ||
case 4: | ||
// Wait until there are no network connexion for 500ms | ||
_b.sent(); | ||
return [4 /*yield*/, page.screenshot(outputOptions)]; | ||
case 5: | ||
image = _b.sent(); | ||
return [4 /*yield*/, browser.close()]; | ||
case 6: | ||
_b.sent(); | ||
return [2 /*return*/, image]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d])))]; | ||
} | ||
@@ -222,55 +93,19 @@ }); | ||
var fileExists = function (path) { return __awaiter(void 0, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, fs.promises.access(path)]; | ||
case 1: | ||
_a.sent(); | ||
return [2 /*return*/, true]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/, false]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var cachedImageName = function (templateDir, values, imagePath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var hash; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, imageFingerprint(templateDir, values)]; | ||
case 1: | ||
hash = _a.sent(); | ||
return [2 /*return*/, Mustache__default['default'].render(imagePath, { hash: hash })]; | ||
} | ||
}); | ||
}); }; | ||
var createImage = function (templateManifestPath, paramValues, resolution, imagePath, options) { return __awaiter(void 0, void 0, void 0, function () { | ||
var templateDir, template; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
options = Object.assign({}, { | ||
cache: false | ||
}, options); | ||
templateDir = path__default['default'].resolve(path__default['default'].dirname(templateManifestPath)); | ||
if (!options.cache) return [3 /*break*/, 3]; | ||
return [4 /*yield*/, cachedImageName(templateDir, paramValues, imagePath)]; | ||
_b = (_a = createImgCore__default['default']).createImage; | ||
_c = [templateManifestPath, | ||
paramValues, | ||
resolution, | ||
imagePath]; | ||
_d = (options === null || options === void 0 ? void 0 : options.browser); | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
imagePath = _a.sent(); | ||
return [4 /*yield*/, fileExists(imagePath)]; | ||
case 2: | ||
if (_a.sent()) { | ||
return [2 /*return*/, imagePath]; | ||
} | ||
_a.label = 3; | ||
case 3: return [4 /*yield*/, loadLocalTemplate(templateManifestPath)]; | ||
case 4: | ||
template = _a.sent(); | ||
return [4 /*yield*/, createImageFromTemplate(template, paramValues, resolution, imagePath, templateDir, options === null || options === void 0 ? void 0 : options.browser)]; | ||
case 5: | ||
_a.sent(); | ||
return [2 /*return*/, imagePath]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d, (options === null || options === void 0 ? void 0 : options.cache) || false])))]; | ||
} | ||
@@ -281,108 +116,52 @@ }); | ||
var compileLocalTemplate = createImage; | ||
var isLocalResource = function (url) { | ||
var up = url.toLowerCase(); | ||
return (!up.startsWith('http://') && | ||
!up.startsWith('https://') && | ||
!up.startsWith('//') && | ||
!up.startsWith('data:') // Data URL | ||
); | ||
}; | ||
var copyLocalResources = function (parameters, values, tmpDir) { return __awaiter(void 0, void 0, void 0, function () { | ||
var newValues, _i, parameters_1, param, value, v, dest; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var _a, _b, _c, _d; | ||
return __generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
newValues = Object.assign({}, values); | ||
_i = 0, parameters_1 = parameters; | ||
_a.label = 1; | ||
_b = (_a = createImgCore__default['default']).createImageFromTemplate; | ||
_c = [template, paramValues, resolution, imagePath, resourcePath]; | ||
_d = browser; | ||
if (_d) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, puppeteerBrowser()]; | ||
case 1: | ||
if (!(_i < parameters_1.length)) return [3 /*break*/, 4]; | ||
param = parameters_1[_i]; | ||
value = values[param.name]; | ||
if (!(param.type === core.ParamType.ImageUrl && value)) return [3 /*break*/, 3]; | ||
v = core.paramValueToString(param, value); | ||
if (!isLocalResource(v)) return [3 /*break*/, 3]; | ||
dest = tmpDir + "/" + uuid.v4() + "-" + path__default['default'].basename(v); | ||
return [4 /*yield*/, fs.promises.copyFile(v, dest)]; | ||
case 2: | ||
_a.sent(); | ||
newValues[param.name] = dest; | ||
_a.label = 3; | ||
case 3: | ||
_i++; | ||
return [3 /*break*/, 1]; | ||
case 4: return [2 /*return*/, newValues]; | ||
_d = (_e.sent()); | ||
_e.label = 2; | ||
case 2: return [2 /*return*/, (_b.apply(_a, _c.concat([_d])))]; | ||
} | ||
}); | ||
}); }; | ||
var isJpeg = function (imagePath) { return (imagePath && imagePath.toLowerCase().endsWith('.jpg') || imagePath.toLowerCase().endsWith('.jpeg')); }; | ||
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath, browser) { return __awaiter(void 0, void 0, void 0, function () { | ||
var htmlPath; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, renderLocalTemplate(template, paramValues, resolution, resourcePath)]; | ||
case 1: | ||
htmlPath = _a.sent(); | ||
return [4 /*yield*/, convertUrlToImage("file:///" + htmlPath, { | ||
path: imagePath, | ||
quality: isJpeg(imagePath) ? 80 : undefined, | ||
fullPage: true | ||
}, browser)]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
// Old name | ||
var compileTemplate = createImageFromTemplate; | ||
/** | ||
* Turn a template and values into a local HTML file. The resources are copied locally, so the HTML can be opened as is by a browser. | ||
* @returns The path to the HTML file | ||
*/ | ||
var renderLocalTemplate = function (template, paramValues, resolution, resourcePath) { return __awaiter(void 0, void 0, void 0, function () { | ||
var tmpDir, html, htmlPath; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, fs.promises.mkdtemp(path__default['default'].join(os__default['default'].tmpdir(), 'resoc-compile-'))]; | ||
case 1: | ||
tmpDir = _a.sent(); | ||
return [4 /*yield*/, copyLocalResources(template.parameters, paramValues, tmpDir)]; | ||
case 2: | ||
// Copy extenal resources | ||
paramValues = _a.sent(); | ||
html = core.renderTemplateToHtml(template, paramValues, resolution); | ||
htmlPath = tmpDir + "/content.html"; | ||
return [4 /*yield*/, fs.promises.writeFile(htmlPath, html)]; | ||
case 3: | ||
_a.sent(); | ||
if (!resourcePath) return [3 /*break*/, 5]; | ||
return [4 /*yield*/, copy__default['default'](resourcePath, tmpDir)]; | ||
case 4: | ||
_a.sent(); | ||
_a.label = 5; | ||
case 5: return [2 /*return*/, htmlPath]; | ||
} | ||
}); | ||
}); }; | ||
var parseParameters = function (specs, args) { | ||
var values = {}; | ||
args.forEach(function (arg) { | ||
var equal = arg.indexOf('='); | ||
if (equal <= 0) { | ||
throw ("Invalid parameter name/value: " + arg + ". Expected format is <name>=<value>"); | ||
} | ||
var name = arg.substr(0, equal); | ||
var value = arg.substr(equal + 1); | ||
var spec = specs.find(function (p) { return p.name === name; }); | ||
if (!spec) { | ||
throw ("Unknown parameter " + name); | ||
} | ||
values[name] = core.stringToParamValue(spec, value); | ||
}); | ||
return values; | ||
}; | ||
exports.cachedImageName = cachedImageName; | ||
Object.defineProperty(exports, 'cachedImageName', { | ||
enumerable: true, | ||
get: function () { | ||
return createImgCore.cachedImageName; | ||
} | ||
}); | ||
Object.defineProperty(exports, 'fileExists', { | ||
enumerable: true, | ||
get: function () { | ||
return createImgCore.fileExists; | ||
} | ||
}); | ||
Object.defineProperty(exports, 'loadLocalTemplate', { | ||
enumerable: true, | ||
get: function () { | ||
return createImgCore.loadLocalTemplate; | ||
} | ||
}); | ||
Object.defineProperty(exports, 'parseParameters', { | ||
enumerable: true, | ||
get: function () { | ||
return createImgCore.parseParameters; | ||
} | ||
}); | ||
Object.defineProperty(exports, 'renderLocalTemplate', { | ||
enumerable: true, | ||
get: function () { | ||
return createImgCore.renderLocalTemplate; | ||
} | ||
}); | ||
exports.compileLocalTemplate = compileLocalTemplate; | ||
@@ -393,6 +172,2 @@ exports.compileTemplate = compileTemplate; | ||
exports.createImageFromTemplate = createImageFromTemplate; | ||
exports.fileExists = fileExists; | ||
exports.loadLocalTemplate = loadLocalTemplate; | ||
exports.parseParameters = parseParameters; | ||
exports.renderLocalTemplate = renderLocalTemplate; | ||
//# sourceMappingURL=index.js.map |
/// <reference types="node" /> | ||
import type { Browser } from 'puppeteer'; | ||
import type puppeteer from 'puppeteer'; | ||
export declare const convertUrlToImage: (url: string, outputOptions: puppeteer.ScreenshotOptions, browser?: Browser | undefined) => Promise<string | void | Buffer>; | ||
import type { Browser, ScreenshotOptions } from 'puppeteer'; | ||
export declare const puppeteerBrowser: () => Promise<Browser>; | ||
export declare const convertUrlToImage: (url: string, outputOptions: ScreenshotOptions, browser?: Browser | undefined) => Promise<string | void | Buffer>; |
{ | ||
"name": "@resoc/create-img", | ||
"version": "0.7.1", | ||
"version": "0.8.1", | ||
"description": "Create an image based on a Resoc image template", | ||
@@ -29,9 +29,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"@resoc/core": "^0.7.0", | ||
"commander": "^8.1.0", | ||
"folder-hash": "^4.0.1", | ||
"mustache": "^4.2.0", | ||
"recursive-copy": "^2.0.13", | ||
"sha256": "^0.2.0", | ||
"uuid": "^8.3.2" | ||
"@resoc/create-img-core": "^0.8.1", | ||
"puppeteer": "^10.2.0" | ||
}, | ||
@@ -48,8 +43,4 @@ "devDependencies": { | ||
"@types/jest": "^27.0.1", | ||
"@types/mustache": "^4.1.2", | ||
"@types/sha256": "^0.2.0", | ||
"@types/uuid": "^8.3.1", | ||
"jest": "^27.0.6", | ||
"nodemon": "^2.0.12", | ||
"puppeteer": "^10.2.0", | ||
"rollup": "^2.56.3", | ||
@@ -62,3 +53,3 @@ "rollup-plugin-peer-deps-external": "^2.2.4", | ||
}, | ||
"gitHead": "24e3e83a3ac93289d6c7a27d2a512627ace3a6ea" | ||
"gitHead": "4ad63cc15b3ba82d6d92fa164cf3b124031adab7" | ||
} |
@@ -1,23 +0,6 @@ | ||
import { | ||
ImageTemplate, | ||
ImageResolution, | ||
ParamValues, | ||
renderTemplateToHtml, | ||
TemplateParam, | ||
ParamType, | ||
paramValueToString | ||
} from '@resoc/core' | ||
import { promises as fs } from 'fs' | ||
import path from 'path' | ||
import os from 'os' | ||
import copy from 'recursive-copy' | ||
import { loadLocalTemplate } from './local' | ||
import { imageFingerprint } from './fingerprint' | ||
import Mustache from 'mustache' | ||
import { v4 as uuidv4 } from 'uuid' | ||
import { convertUrlToImage } from './puppeteer' | ||
import { puppeteerBrowser } from './puppeteer' | ||
import type { Browser, ScreenshotOptions } from 'puppeteer' | ||
import { ImageResolution, ImageTemplate, ParamValues } from '@resoc/core'; | ||
import createImgCore from '@resoc/create-img-core' | ||
import type puppeteer from 'puppeteer' | ||
import type { Browser } from 'puppeteer' | ||
type LocalTemplateOptions = { | ||
@@ -28,17 +11,2 @@ cache?: boolean; | ||
export const fileExists = async (path: string): Promise<boolean> => { | ||
try { | ||
await fs.access(path); | ||
return true; | ||
} | ||
catch (e) { | ||
return false; | ||
} | ||
}; | ||
export const cachedImageName = async (templateDir: string, values: ParamValues, imagePath: string): Promise<string> => { | ||
const hash = await imageFingerprint(templateDir, values); | ||
return Mustache.render(imagePath, { hash }); | ||
}; | ||
export const createImage = async ( | ||
@@ -50,113 +18,47 @@ templateManifestPath: string, | ||
options?: LocalTemplateOptions | ||
): Promise<string> => { | ||
options = Object.assign({}, { | ||
cache: false | ||
}, options); | ||
const templateDir = path.resolve(path.dirname(templateManifestPath)); | ||
if (options.cache) { | ||
imagePath = await cachedImageName(templateDir, paramValues, imagePath); | ||
if (await fileExists(imagePath)) { | ||
return imagePath; | ||
} | ||
} | ||
const template = await loadLocalTemplate(templateManifestPath); | ||
await createImageFromTemplate( | ||
template, | ||
): Promise<string> => ( | ||
createImgCore.createImage( | ||
templateManifestPath, | ||
paramValues, | ||
resolution, | ||
imagePath, | ||
templateDir, | ||
options?.browser | ||
); | ||
options?.browser || await puppeteerBrowser(), | ||
options?.cache || false | ||
) | ||
); | ||
return imagePath; | ||
}; | ||
// Old name | ||
export const compileLocalTemplate = createImage; | ||
export const isLocalResource = (url: string): boolean => { | ||
const up = url.toLowerCase(); | ||
return ( | ||
!up.startsWith('http://') && | ||
!up.startsWith('https://') && | ||
!up.startsWith('//') && | ||
!up.startsWith('data:') // Data URL | ||
); | ||
}; | ||
export const createImageFromTemplate = async ( | ||
template: ImageTemplate, | ||
paramValues: ParamValues, | ||
resolution: ImageResolution, | ||
imagePath: string, | ||
resourcePath?: string, | ||
browser?: Browser | ||
): Promise<void> => ( | ||
createImgCore.createImageFromTemplate( | ||
template, paramValues, resolution, imagePath, resourcePath, browser || await puppeteerBrowser() | ||
) | ||
); | ||
const copyLocalResources = async (parameters: TemplateParam[], values: ParamValues, tmpDir: string): Promise<ParamValues> => { | ||
const newValues = Object.assign({}, values); | ||
for (const param of parameters) { | ||
const value = values[param.name]; | ||
if (param.type === ParamType.ImageUrl && value) { | ||
const v = paramValueToString(param, value); | ||
if (isLocalResource(v)) { | ||
const dest = `${tmpDir}/${uuidv4()}-${path.basename(v)}`; | ||
await fs.copyFile(v, dest); | ||
newValues[param.name] = dest; | ||
} | ||
} | ||
export const createAnyImageFromTemplate = async ( | ||
template: ImageTemplate, | ||
paramValues: ParamValues, | ||
resolution: ImageResolution, | ||
outputOptions: ScreenshotOptions, | ||
resourcePath?: string, | ||
browser?: Browser | ||
): Promise<string | Buffer | void> => { | ||
if (!browser) { | ||
browser = await puppeteerBrowser(); | ||
} | ||
return newValues; | ||
}; | ||
const isJpeg = (imagePath: string) => ( | ||
imagePath && imagePath.toLowerCase().endsWith('.jpg') || imagePath.toLowerCase().endsWith('.jpeg') | ||
) | ||
export const createImageFromTemplate = async ( | ||
template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string, browser?: Browser | ||
): Promise<void> => { | ||
const htmlPath = await renderLocalTemplate(template, paramValues, resolution, resourcePath); | ||
await convertUrlToImage( | ||
`file:///${htmlPath}`, { | ||
path: imagePath, | ||
quality: isJpeg(imagePath) ? 80 : undefined, | ||
fullPage: true | ||
}, | ||
browser | ||
return createAnyImageFromTemplate( | ||
template, paramValues, resolution, outputOptions, resourcePath, browser | ||
); | ||
}; | ||
export const createAnyImageFromTemplate = async ( | ||
template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, outputOptions: puppeteer.ScreenshotOptions, resourcePath?: string, browser?: Browser | ||
): Promise<string | Buffer | void> => { | ||
const htmlPath = renderLocalTemplate(template, paramValues, resolution, resourcePath); | ||
return convertUrlToImage(`file:///${htmlPath}`, outputOptions, browser); | ||
}; | ||
// Old name | ||
export const compileTemplate = createImageFromTemplate; | ||
/** | ||
* Turn a template and values into a local HTML file. The resources are copied locally, so the HTML can be opened as is by a browser. | ||
* @returns The path to the HTML file | ||
*/ | ||
export const renderLocalTemplate = async (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, resourcePath?: string): Promise<string> => { | ||
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'resoc-compile-')); | ||
// Copy extenal resources | ||
paramValues = await copyLocalResources(template.parameters, paramValues, tmpDir); | ||
const html = renderTemplateToHtml(template, paramValues, resolution); | ||
// Write filled template | ||
const htmlPath = `${tmpDir}/content.html`; | ||
await fs.writeFile(htmlPath, html); | ||
// Also copy template resources | ||
if (resourcePath) { | ||
await copy( | ||
resourcePath, | ||
tmpDir | ||
); | ||
} | ||
return htmlPath; | ||
}; |
@@ -6,8 +6,11 @@ export { | ||
compileLocalTemplate, | ||
} from "./compile"; | ||
export { convertUrlToImage } from "./puppeteer"; | ||
export { | ||
cachedImageName, | ||
fileExists, | ||
renderLocalTemplate | ||
} from "./compile"; | ||
export { loadLocalTemplate } from "./local"; | ||
export { parseParameters } from "./parse-parameters"; | ||
export { convertUrlToImage } from "./puppeteer"; | ||
renderLocalTemplate, | ||
loadLocalTemplate, | ||
parseParameters | ||
} from '@resoc/create-img-core'; |
@@ -1,31 +0,17 @@ | ||
import type { Browser } from 'puppeteer' | ||
import type puppeteer from 'puppeteer' | ||
import type { Browser, ScreenshotOptions } from 'puppeteer' | ||
import puppeteer from 'puppeteer' | ||
import createImageCore from '@resoc/create-img-core' | ||
const defaultLocalBrowser = async (): Promise<Browser> => { | ||
try { | ||
const puppeteer = require('puppeteer'); | ||
return await puppeteer.launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'], | ||
}); | ||
} | ||
catch(e) { | ||
throw new Error( | ||
`Cannot run local browser with Puppeteer: ${e}.\nSee https://www.npmjs.com/package/@resoc/create-img#configure-puppeteer` | ||
); | ||
}; | ||
} | ||
export const puppeteerBrowser = async () => ( | ||
puppeteer.launch({ | ||
args: ['--no-sandbox', '--disable-setuid-sandbox'] | ||
}) | ||
) | ||
export const convertUrlToImage = async (url: string, outputOptions: puppeteer.ScreenshotOptions, browser?: Browser): Promise<string | void | Buffer> => { | ||
browser ||= await defaultLocalBrowser(); | ||
const page = await browser.newPage(); | ||
// Wait until there are no network connexion for 500ms | ||
await page.goto(url, {waitUntil: [ | ||
'networkidle0', 'domcontentloaded', 'load' | ||
]}); | ||
const image = await page.screenshot(outputOptions); | ||
await browser.close(); | ||
return image; | ||
}; | ||
export const convertUrlToImage = async ( | ||
url: string, | ||
outputOptions: ScreenshotOptions, | ||
browser?: Browser | ||
): Promise<string | void | Buffer> => ( | ||
createImageCore.convertUrlToImage(url, outputOptions, browser || await puppeteerBrowser()) | ||
); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
2
17
0
131903
38
923
+ Addedpuppeteer@^10.2.0
+ Added@resoc/core@0.8.5(transitive)
+ Added@resoc/create-img-core@0.8.6(transitive)
+ Added@types/node@20.14.8(transitive)
+ Added@types/yauzl@2.10.3(transitive)
+ Addedagent-base@6.0.2(transitive)
+ Addedbase64-js@1.5.1(transitive)
+ Addedbl@4.1.0(transitive)
+ Addedbuffer@5.7.1(transitive)
+ Addedbuffer-crc32@0.2.13(transitive)
+ Addedchownr@1.1.4(transitive)
+ Addeddebug@4.3.1(transitive)
+ Addeddevtools-protocol@0.0.901419(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addedextract-zip@2.0.1(transitive)
+ Addedfd-slicer@1.1.0(transitive)
+ Addedfind-up@4.1.0(transitive)
+ Addedfs-constants@1.0.0(transitive)
+ Addedget-stream@5.2.0(transitive)
+ Addedhttps-proxy-agent@5.0.0(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedlocate-path@5.0.0(transitive)
+ Addednode-fetch@2.6.1(transitive)
+ Addedp-limit@2.3.0(transitive)
+ Addedp-locate@4.1.0(transitive)
+ Addedp-try@2.2.0(transitive)
+ Addedpath-exists@4.0.0(transitive)
+ Addedpend@1.2.0(transitive)
+ Addedpkg-dir@4.2.0(transitive)
+ Addedprogress@2.0.1(transitive)
+ Addedproxy-from-env@1.1.0(transitive)
+ Addedpump@3.0.0(transitive)
+ Addedpuppeteer@10.4.0(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedrimraf@3.0.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedstring_decoder@1.3.0(transitive)
+ Addedtar-fs@2.0.0(transitive)
+ Addedtar-stream@2.2.0(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedunbzip2-stream@1.3.3(transitive)
+ Addedundici-types@5.26.5(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedws@7.4.6(transitive)
+ Addedyauzl@2.10.0(transitive)
- Removed@resoc/core@^0.7.0
- Removedcommander@^8.1.0
- Removedfolder-hash@^4.0.1
- Removedmustache@^4.2.0
- Removedrecursive-copy@^2.0.13
- Removedsha256@^0.2.0
- Removeduuid@^8.3.2
- Removed@resoc/core@0.7.0(transitive)
- Removedcommander@8.3.0(transitive)