@resoc/create-img
Advanced tools
Comparing version 0.4.2 to 0.5.0
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
162832
7
46
1609
1
74
21
+ Added@resoc/core@0.5.0(transitive)
- Removedpuppeteer@^10.2.0
- Removed@resoc/core@0.4.0(transitive)
- Removed@types/node@22.7.4(transitive)
- Removed@types/yauzl@2.10.3(transitive)
- Removedagent-base@6.0.2(transitive)
- Removedbase64-js@1.5.1(transitive)
- Removedbl@4.1.0(transitive)
- Removedbuffer@5.7.1(transitive)
- Removedbuffer-crc32@0.2.13(transitive)
- Removedchownr@1.1.4(transitive)
- Removeddebug@4.3.1(transitive)
- Removeddevtools-protocol@0.0.901419(transitive)
- Removedend-of-stream@1.4.4(transitive)
- Removedextract-zip@2.0.1(transitive)
- Removedfd-slicer@1.1.0(transitive)
- Removedfind-up@4.1.0(transitive)
- Removedfs-constants@1.0.0(transitive)
- Removedget-stream@5.2.0(transitive)
- Removedhttps-proxy-agent@5.0.0(transitive)
- Removedieee754@1.2.1(transitive)
- Removedlocate-path@5.0.0(transitive)
- Removedms@2.1.2(transitive)
- Removednode-fetch@2.6.1(transitive)
- Removedp-limit@2.3.0(transitive)
- Removedp-locate@4.1.0(transitive)
- Removedp-try@2.2.0(transitive)
- Removedpath-exists@4.0.0(transitive)
- Removedpend@1.2.0(transitive)
- Removedpkg-dir@4.2.0(transitive)
- Removedprogress@2.0.1(transitive)
- Removedproxy-from-env@1.1.0(transitive)
- Removedpump@3.0.2(transitive)
- Removedpuppeteer@10.4.0(transitive)
- Removedreadable-stream@3.6.2(transitive)
- Removedrimraf@3.0.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedstring_decoder@1.3.0(transitive)
- Removedtar-fs@2.0.0(transitive)
- Removedtar-stream@2.2.0(transitive)
- Removedthrough@2.3.8(transitive)
- Removedunbzip2-stream@1.3.3(transitive)
- Removedundici-types@6.19.8(transitive)
- Removedutil-deprecate@1.0.2(transitive)
- Removedws@7.4.6(transitive)
- Removedyauzl@2.10.0(transitive)
Updated@resoc/core@^0.5.0