From 47d15c0261c7fc84163de2e747914c4a2f891547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1n=20D=C3=A9nes?= Date: Fri, 14 Jan 2022 19:28:19 +0100 Subject: [PATCH] Hotfix parameterization --- package-lock.json | 4 ++-- package.json | 2 +- src/ergogen.js | 1 + src/prepare.js | 9 ++++++++- test/unit/interface.js | 30 ++++++++++++++++++++++++++++++ test/unit/prepare.js | 20 ++++++++++++++++++-- 6 files changed, 60 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a063a42..8d854cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ergogen", - "version": "3.1.0", + "version": "3.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ergogen", - "version": "3.1.0", + "version": "3.1.1", "license": "MIT", "dependencies": { "@jscad/openjscad": "github:ergogen/oldjscad", diff --git a/package.json b/package.json index 3033c08..2cfcc73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ergogen", - "version": "3.1.0", + "version": "3.1.1", "description": "Ergonomic keyboard layout generator", "author": "Bán Dénes ", "license": "MIT", diff --git a/src/ergogen.js b/src/ergogen.js index 1fd0351..5f223b7 100644 --- a/src/ergogen.js +++ b/src/ergogen.js @@ -25,6 +25,7 @@ const process = async (raw, debug=false, logger=()=>{}) => { logger('Preprocessing input...') config = prepare.unnest(config) config = prepare.inherit(config) + config = prepare.parameterize(config) const results = {} if (debug) { results.raw = raw diff --git a/src/prepare.js b/src/prepare.js index b579b67..6ece3e8 100644 --- a/src/prepare.js +++ b/src/prepare.js @@ -80,6 +80,13 @@ exports.inherit = config => traverse(config, config, [], (target, key, val, root }) exports.parameterize = config => traverse(config, config, [], (target, key, val, root, breadcrumbs) => { + + // we only care about objects + if (a.type(val)() !== 'object') { + target[key] = val + return + } + let params = val.$params let args = val.$args @@ -108,7 +115,7 @@ exports.parameterize = config => traverse(config, config, [], (target, key, val, let str = JSON.stringify(val) const zip = rows => rows[0].map((_, i) => rows.map(row => row[i])) for (const [par, arg] of zip([params, args])) { - str = str.replace(new RegExp(`"${par}"`, 'g'), JSON.stringify(arg)) + str = str.replace(new RegExp(`${par}`, 'g'), arg) } try { val = JSON.parse(str) diff --git a/test/unit/interface.js b/test/unit/interface.js index fe01a4a..332c9cc 100644 --- a/test/unit/interface.js +++ b/test/unit/interface.js @@ -56,6 +56,36 @@ describe('Interface', function() { ergogen.process({points: {zones: {}}}, true, () => {}).should.be.rejectedWith('any points') ]) }) + + it('preprocessor', async function() { + return Promise.all([ + // unnesting + ergogen.process({'points.zones.matrix': {}}).should.eventually.have.deep.property('canonical', { + points: {zones: {matrix: {}}} + }), + // inheritance + ergogen.process({ + 'points.zones.parent.key.a': 1, + 'points.zones.child': { + '$extends': 'points.zones.parent', + 'key.b': 2 + } + }).should.eventually.have.deep.nested.property('canonical.points.zones.child.key', { + a: 1, + b: 2 + }), + // parameterization + ergogen.process({ + 'points.zones.matrix.key': { + a: 'PAR', + $params: ['PAR'], + $args: [1] + } + }).should.eventually.have.deep.nested.property('canonical.points.zones.matrix.key', { + a: '1' + }) + ]) + }) it('engine', async function() { return Promise.all([ diff --git a/test/unit/prepare.js b/test/unit/prepare.js index b643e9d..225e0da 100644 --- a/test/unit/prepare.js +++ b/test/unit/prepare.js @@ -64,7 +64,23 @@ describe('Prepare', function() { $args: [1] } }).decl.should.deep.equal({ - a: 1 + a: '1' + }) + + p.parameterize({ + decl: { + normal_use: 'PAR1', + sub: { + nested_use: 'PAR2 * 2' + }, + $params: ['PAR1', 'PAR2'], + $args: ['text', 14] + } + }).decl.should.deep.equal({ + normal_use: 'text', + sub: { + nested_use: '14 * 2', + } }) p.parameterize.bind(this, { @@ -84,7 +100,7 @@ describe('Prepare', function() { decl: { a: 'PAR', $params: ['PAR'], - $args: [undefined] + $args: ['in"jection'] } }).should.throw('valid') })