Socket
Socket
Sign inDemoInstall

@resoc/create-img

Package Overview
Dependencies
89
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.7.1 to 0.8.1

19

build/compile.d.ts
/// <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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc