Socket
Socket
Sign inDemoInstall

@resoc/create-img

Package Overview
Dependencies
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@resoc/create-img - npm Package Compare versions

Comparing version 0.4.2 to 0.5.0

build/puppeteer.d.ts

17

build/compile.d.ts

@@ -0,4 +1,8 @@

/// <reference types="node" />
import { ImageTemplate, ImageResolution, ParamValues } from '@resoc/core';
import type puppeteer from 'puppeteer';
import type { Browser } from 'puppeteer';
declare type LocalTemplateOptions = {
cache: boolean;
cache?: boolean;
browser?: Browser;
};

@@ -10,5 +14,10 @@ export declare const fileExists: (path: string) => Promise<boolean>;

export declare const isLocalResource: (url: string) => boolean;
export declare const createImageFromTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined) => Promise<void>;
export declare const compileTemplate: (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string | undefined) => Promise<void>;
export declare const urlToImage: (url: string, outputPath: string) => Promise<void>;
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 {};

@@ -1,3 +0,2 @@

import { renderTemplateToHtml, ParamType } from '@resoc/core';
import puppeteer from 'puppeteer';
import { renderTemplateToHtml, ParamType, stringToParamValue } from '@resoc/core';
import { promises } from 'fs';

@@ -159,2 +158,54 @@ import path from 'path';

var defaultLocalBrowser = function () { return __awaiter(void 0, void 0, void 0, function () {
var puppeteer_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:
_a.sent();
throw new Error('Cannot find local browser. See 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) {
case 0:
_a = browser;
if (_a) return [3 /*break*/, 2];
return [4 /*yield*/, defaultLocalBrowser()];
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];
}
});
}); };
var fileExists = function (path) { return __awaiter(void 0, void 0, void 0, function () {

@@ -209,3 +260,3 @@ return __generator(this, function (_a) {

template = _a.sent();
return [4 /*yield*/, compileTemplate(template, paramValues, resolution, imagePath, templateDir)];
return [4 /*yield*/, createImageFromTemplate(template, paramValues, resolution, imagePath, templateDir, options === null || options === void 0 ? void 0 : options.browser)];
case 5:

@@ -226,3 +277,3 @@ _a.sent();

var copyLocalResources = function (parameters, values, tmpDir) { return __awaiter(void 0, void 0, void 0, function () {
var newValues, _i, parameters_1, param, url, dest;
var newValues, _i, parameters_1, param, value, dest;
return __generator(this, function (_a) {

@@ -237,6 +288,6 @@ switch (_a.label) {

param = parameters_1[_i];
url = values[param.name];
if (!(param.type === ParamType.ImageUrl && isLocalResource(url))) return [3 /*break*/, 3];
dest = tmpDir + "/" + v4() + "-" + path.basename(url);
return [4 /*yield*/, promises.copyFile(url, dest)];
value = values[param.name];
if (!(param.type === ParamType.ImageUrl && value && isLocalResource(value))) return [3 /*break*/, 3];
dest = tmpDir + "/" + v4() + "-" + path.basename(value);
return [4 /*yield*/, promises.copyFile(value, dest)];
case 2:

@@ -253,3 +304,27 @@ _a.sent();

}); };
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath) { return __awaiter(void 0, void 0, void 0, function () {
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: 80,
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;

@@ -275,44 +350,6 @@ return __generator(this, function (_a) {

_a.label = 5;
case 5: return [4 /*yield*/, urlToImage("file:///" + htmlPath, imagePath)];
case 6:
_a.sent();
return [2 /*return*/];
case 5: return [2 /*return*/, htmlPath];
}
});
}); };
// Old name
var compileTemplate = createImageFromTemplate;
var urlToImage = function (url, outputPath) { return __awaiter(void 0, void 0, void 0, function () {
var browser, page, output;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
})];
case 1:
browser = _a.sent();
return [4 /*yield*/, browser.newPage()];
case 2:
page = _a.sent();
// Wait until there are no network connexion for 500ms
return [4 /*yield*/, page.goto(url, { waitUntil: [
'networkidle0', 'domcontentloaded', 'load'
] })];
case 3:
// Wait until there are no network connexion for 500ms
_a.sent();
output = outputPath;
return [4 /*yield*/, page.screenshot({
path: output,
fullPage: true
})];
case 4:
_a.sent();
return [4 /*yield*/, browser.close()];
case 5:
_a.sent();
return [2 /*return*/];
}
});
}); };

@@ -326,3 +363,9 @@ var parseParameters = function (specs, args) {

}
values[arg.substr(0, equal)] = arg.substr(equal + 1);
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);
});

@@ -329,0 +372,0 @@ return values;

@@ -6,3 +6,2 @@ 'use strict';

var core = require('@resoc/core');
var puppeteer = require('puppeteer');
var fs = require('fs');

@@ -19,3 +18,2 @@ var path = require('path');

var puppeteer__default = /*#__PURE__*/_interopDefaultLegacy(puppeteer);
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);

@@ -174,2 +172,54 @@ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);

var defaultLocalBrowser = function () { return __awaiter(void 0, void 0, void 0, function () {
var puppeteer_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:
_a.sent();
throw new Error('Cannot find local browser. See 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) {
case 0:
_a = browser;
if (_a) return [3 /*break*/, 2];
return [4 /*yield*/, defaultLocalBrowser()];
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];
}
});
}); };
var fileExists = function (path) { return __awaiter(void 0, void 0, void 0, function () {

@@ -224,3 +274,3 @@ return __generator(this, function (_a) {

template = _a.sent();
return [4 /*yield*/, compileTemplate(template, paramValues, resolution, imagePath, templateDir)];
return [4 /*yield*/, createImageFromTemplate(template, paramValues, resolution, imagePath, templateDir, options === null || options === void 0 ? void 0 : options.browser)];
case 5:

@@ -241,3 +291,3 @@ _a.sent();

var copyLocalResources = function (parameters, values, tmpDir) { return __awaiter(void 0, void 0, void 0, function () {
var newValues, _i, parameters_1, param, url, dest;
var newValues, _i, parameters_1, param, value, dest;
return __generator(this, function (_a) {

@@ -252,6 +302,6 @@ switch (_a.label) {

param = parameters_1[_i];
url = values[param.name];
if (!(param.type === core.ParamType.ImageUrl && isLocalResource(url))) return [3 /*break*/, 3];
dest = tmpDir + "/" + uuid.v4() + "-" + path__default['default'].basename(url);
return [4 /*yield*/, fs.promises.copyFile(url, dest)];
value = values[param.name];
if (!(param.type === core.ParamType.ImageUrl && value && isLocalResource(value))) return [3 /*break*/, 3];
dest = tmpDir + "/" + uuid.v4() + "-" + path__default['default'].basename(value);
return [4 /*yield*/, fs.promises.copyFile(value, dest)];
case 2:

@@ -268,3 +318,27 @@ _a.sent();

}); };
var createImageFromTemplate = function (template, paramValues, resolution, imagePath, resourcePath) { return __awaiter(void 0, void 0, void 0, function () {
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: 80,
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;

@@ -290,44 +364,6 @@ return __generator(this, function (_a) {

_a.label = 5;
case 5: return [4 /*yield*/, urlToImage("file:///" + htmlPath, imagePath)];
case 6:
_a.sent();
return [2 /*return*/];
case 5: return [2 /*return*/, htmlPath];
}
});
}); };
// Old name
var compileTemplate = createImageFromTemplate;
var urlToImage = function (url, outputPath) { return __awaiter(void 0, void 0, void 0, function () {
var browser, page, output;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, puppeteer__default['default'].launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
})];
case 1:
browser = _a.sent();
return [4 /*yield*/, browser.newPage()];
case 2:
page = _a.sent();
// Wait until there are no network connexion for 500ms
return [4 /*yield*/, page.goto(url, { waitUntil: [
'networkidle0', 'domcontentloaded', 'load'
] })];
case 3:
// Wait until there are no network connexion for 500ms
_a.sent();
output = outputPath;
return [4 /*yield*/, page.screenshot({
path: output,
fullPage: true
})];
case 4:
_a.sent();
return [4 /*yield*/, browser.close()];
case 5:
_a.sent();
return [2 /*return*/];
}
});
}); };

@@ -341,3 +377,9 @@ var parseParameters = function (specs, args) {

}
values[arg.substr(0, equal)] = arg.substr(equal + 1);
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);
});

@@ -344,0 +386,0 @@ return values;

{
"name": "@resoc/create-img",
"version": "0.4.2",
"version": "0.5.0",
"description": "Create an image based on a Resoc image template",

@@ -29,7 +29,6 @@ "main": "build/index.js",

"dependencies": {
"@resoc/core": "^0.4.0",
"@resoc/core": "^0.5.0",
"commander": "^8.1.0",
"folder-hash": "^4.0.1",
"mustache": "^4.2.0",
"puppeteer": "^10.2.0",
"recursive-copy": "^2.0.13",

@@ -54,2 +53,3 @@ "sha256": "^0.2.0",

"nodemon": "^2.0.12",
"puppeteer": "^10.2.0",
"rollup": "^2.56.3",

@@ -62,3 +62,3 @@ "rollup-plugin-peer-deps-external": "^2.2.4",

},
"gitHead": "f29af88220ba348501e5ae83b651b26e3824ef02"
"gitHead": "c03dd64ee237cf366de30a56da5fa70a271c7389"
}

@@ -1,3 +0,10 @@

import { ImageTemplate, ImageResolution, loadRemoteTemplate, ParamValues, renderTemplateToHtml, TemplateParam, ParamType } from '@resoc/core'
import puppeteer from 'puppeteer'
import {
ImageTemplate,
ImageResolution,
loadRemoteTemplate,
ParamValues,
renderTemplateToHtml,
TemplateParam,
ParamType
} from '@resoc/core'
import { promises as fs } from 'fs'

@@ -11,5 +18,10 @@ import path from 'path'

import { v4 as uuidv4 } from 'uuid'
import { convertUrlToImage } from './puppeteer'
import type puppeteer from 'puppeteer'
import type { Browser } from 'puppeteer'
type LocalTemplateOptions = {
cache: boolean;
cache?: boolean;
browser?: Browser
};

@@ -54,3 +66,3 @@

await compileTemplate(
await createImageFromTemplate(
template,

@@ -60,3 +72,4 @@ paramValues,

imagePath,
templateDir
templateDir,
options?.browser
);

@@ -82,6 +95,6 @@

for (const param of parameters) {
const url = values[param.name];
if (param.type === ParamType.ImageUrl && isLocalResource(url)) {
const dest = `${tmpDir}/${uuidv4()}-${path.basename(url)}`;
await fs.copyFile(url, dest);
const value = values[param.name];
if (param.type === ParamType.ImageUrl && value && isLocalResource(value)) {
const dest = `${tmpDir}/${uuidv4()}-${path.basename(value)}`;
await fs.copyFile(value, dest);
newValues[param.name] = dest;

@@ -93,3 +106,32 @@ }

export const createImageFromTemplate = async (template: ImageTemplate, paramValues: ParamValues, resolution: ImageResolution, imagePath: string, resourcePath?: string): Promise<void> => {
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: 80,
fullPage: true
},
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-'));

@@ -114,27 +156,3 @@

await urlToImage(
`file:///${htmlPath}`,
imagePath
);
}
// Old name
export const compileTemplate = createImageFromTemplate;
export const urlToImage = async (url: string, outputPath: string): Promise<void> => {
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
// Wait until there are no network connexion for 500ms
await page.goto(url, {waitUntil: [
'networkidle0', 'domcontentloaded', 'load'
]});
const output = outputPath;
await page.screenshot({
path: output,
fullPage: true
});
await browser.close();
return htmlPath;
};

@@ -0,13 +1,47 @@

import { ParamType } from "@resoc/core";
import { parseParameters } from "./parse-parameters";
test('parseParameters', () => {
expect(parseParameters([], ['a=X', 'b=Y'])).toEqual({
// Regular
expect(parseParameters([
{ name: "a", type: ParamType.String, demoValue: "A" },
{ name: "b", type: ParamType.String, demoValue: "B" }
], ['a=X', 'b=Y'])).toEqual({
a: 'X', b: 'Y'
});
expect(parseParameters([], ['a=', 'b=Y'])).toEqual({
// Empty value is allowed
expect(parseParameters([
{ name: "a", type: ParamType.String, demoValue: "A" },
{ name: "b", type: ParamType.String, demoValue: "B" }
], ['a=', 'b=Y'])).toEqual({
a: '', b: 'Y'
});
expect(() => parseParameters([], ['a=X', 'dummy'])).toThrow();
expect(() => parseParameters([], ['=X', 'b=Y'])).toThrow();
// Json
expect(parseParameters([
{ name: "str", type: ParamType.String, demoValue: "Hello" },
{ name: "jsn", type: ParamType.ObjectList, demoValue: [ { x: 'x1', y: 'Y2' } ] },
], ['str=Bonjour', 'jsn=[ {"a": "7", "b": "X"}, {"a": "2", "b": "9"} ]'])).toEqual({
str: 'Bonjour', jsn: [
{ a: '7', b: 'X' },
{ a: '2', b: '9' }
]
});
// Invalid format
expect(() => parseParameters([
{ name: "a", type: ParamType.String, demoValue: "A" },
{ name: "b", type: ParamType.String, demoValue: "B" }
], ['a=X', 'dummy'])).toThrow();
expect(() => parseParameters([
{ name: "a", type: ParamType.String, demoValue: "A" },
{ name: "b", type: ParamType.String, demoValue: "B" }
], ['=X', 'b=Y'])).toThrow();
// Unknown parameter
expect(() => parseParameters([
{ name: "a", type: ParamType.String, demoValue: "A" },
{ name: "b", type: ParamType.String, demoValue: "B" }
], ['a=X', 'z=Y'])).toThrow();
});

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

import { ParamValues, TemplateParam } from "@resoc/core";
import { ParamType, ParamValues, stringToParamValue, TemplateParam } from "@resoc/core";

@@ -11,3 +11,11 @@ export const parseParameters = (specs: TemplateParam[], args: string[]): ParamValues => {

}
values[arg.substr(0, equal)] = arg.substr(equal + 1);
const name = arg.substr(0, equal);
const value = arg.substr(equal + 1);
const spec = specs.find(p => p.name === name);
if (!spec) {
throw(`Unknown parameter ${name}`);
}
values[name] = stringToParamValue(spec, value);
});

@@ -14,0 +22,0 @@

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
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc