diff --git a/package.json b/package.json index 2095da5f959299447aa756508e864742b901cf8b..a391ed90cf2b8f86881d721d07f169c2bdc2cbb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "usp-js", - "version": "0.1.8", + "version": "0.1.9", "description": "Helper library for easy usp communication using mqtt over tcp or ws.", "main": "build/src/index.js", "scripts": { diff --git a/public/index.html b/public/index.html index 38efcfd39bfc8aeb4ab19eb04fc0218fbf3fb767..202faa825b3a5074ea4cbc5f5c3a7a4737175baa 100644 --- a/public/index.html +++ b/public/index.html @@ -171,6 +171,10 @@ run();</code></pre> <li>add with no arguments - adds a new default object</li> </ul> <pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">"Device.NAT.PortMapping."</span>); <span class="hljs-comment">// => "Device.NAT.PortMapping.3."</span></code></pre> + <ul> + <li>add with multiple responses</li> + </ul> + <pre><code class="language-javascript"><span class="hljs-keyword">await</span> usp.add(<span class="hljs-string">"Device.IP.Interface.*.IPv4Address."</span>); <span class="hljs-comment">// => ['Device.IP.Interface.1.IPv4Address.2.', ... ]</span></code></pre> <ul> <li>add with arguments - adds a new object with provided values</li> </ul> diff --git a/public/modules/_commands_add_.html b/public/modules/_commands_add_.html index f5a78c5e034791566ea6a129dcc07d56532c4ef0..cec706e9e4d6765d56d3a4590a110b898b02da02 100644 --- a/public/modules/_commands_add_.html +++ b/public/modules/_commands_add_.html @@ -87,7 +87,7 @@ <a name="decode" class="tsd-anchor"></a> <h3><span class="tsd-flag ts-flagConst">Const</span> decode</h3> <ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module tsd-is-not-exported"> - <li class="tsd-signature tsd-kind-icon">decode<span class="tsd-signature-symbol">(</span>msg<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]</span></li> + <li class="tsd-signature tsd-kind-icon">decode<span class="tsd-signature-symbol">(</span>msg<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">]</span></li> </ul> <ul class="tsd-descriptions"> <li class="tsd-description"> @@ -102,7 +102,7 @@ <h5>msg: <span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span></h5> </li> </ul> - <h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]</span></h4> + <h4 class="tsd-returns-title">Returns <span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">]</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">[</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">]</span></h4> </li> </ul> </section> @@ -116,7 +116,7 @@ <li class="tsd-description"> <aside class="tsd-sources"> <ul> - <li>Defined in commands/add.ts:12</li> + <li>Defined in commands/add.ts:13</li> </ul> </aside> <h4 class="tsd-parameters-title">Parameters</h4> @@ -193,7 +193,7 @@ <li class="tsd-description"> <aside class="tsd-sources"> <ul> - <li>Defined in commands/add.ts:9</li> + <li>Defined in commands/add.ts:10</li> </ul> </aside> <h4 class="tsd-parameters-title">Parameters</h4> diff --git a/public/modules/_types_.html b/public/modules/_types_.html index 15c5cca30c65f8ea170f075d4a32f33da1ea95fc..14875695ed31177002469bd16dfb995ede4402e6 100644 --- a/public/modules/_types_.html +++ b/public/modules/_types_.html @@ -148,7 +148,7 @@ <section class="tsd-panel tsd-member tsd-kind-type-alias tsd-parent-kind-module"> <a name="addcommand" class="tsd-anchor"></a> <h3>Add<wbr>Command</h3> - <div class="tsd-signature tsd-kind-icon">Add<wbr>Command<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, value<span class="tsd-signature-symbol">?: </span><a href="_types_.html#inputrecord" class="tsd-signature-type">InputRecord</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">></span></div> + <div class="tsd-signature tsd-kind-icon">Add<wbr>Command<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span>path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, value<span class="tsd-signature-symbol">?: </span><a href="_types_.html#inputrecord" class="tsd-signature-type">InputRecord</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></div> <aside class="tsd-sources"> <ul> <li>Defined in types.ts:20</li> @@ -159,7 +159,7 @@ <ul class="tsd-parameters"> <li class="tsd-parameter-signature"> <ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-type-alias"> - <li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, value<span class="tsd-signature-symbol">?: </span><a href="_types_.html#inputrecord" class="tsd-signature-type">InputRecord</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">></span></li> + <li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, value<span class="tsd-signature-symbol">?: </span><a href="_types_.html#inputrecord" class="tsd-signature-type">InputRecord</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></li> </ul> <ul class="tsd-descriptions"> <li class="tsd-description"> @@ -172,7 +172,7 @@ <h5><span class="tsd-flag ts-flagOptional">Optional</span> value: <a href="_types_.html#inputrecord" class="tsd-signature-type">InputRecord</a></h5> </li> </ul> - <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">></span></h4> + <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></h4> </li> </ul> </li> diff --git a/src/commands/recipes/resolve.ts b/src/commands/recipes/resolve.ts index cb96b73d7725688d5d1dfed7a5e383781583de49..0e6d9cc93fdba6f958e8f2162125a84f4dd2c10c 100644 --- a/src/commands/recipes/resolve.ts +++ b/src/commands/recipes/resolve.ts @@ -5,25 +5,26 @@ const isReference = (s: string): boolean => s.startsWith("Device."); const addDot = (s: string) => (s.endsWith(".") ? s : s + "."); const resolveReferences = async ( - msg: GetReturn, + message: GetReturn, call: CallFn, level: number ): Promise<GetReturn> => { - if (level === 0 || !["string", "object"].includes(typeof msg)) return msg; - if (typeof msg === "string") { - msg = await call("GET", { paths: splitReference(msg).map(addDot) }); - await resolveReferences(msg, call, level - 1); - return msg; - } else if (typeof msg === "object") { - for (const [key, val] of Object.entries(msg)) { + if (level === 0 || !["string", "object"].includes(typeof message)) return message; + if (typeof message === "string") { + const msg = await call("GET", { paths: splitReference(message).map(addDot) }); + return await resolveReferences(msg, call, level - 1); + } else if (typeof message === "object") { + const msg = Array.isArray(message) ? [...message] : { ...message }; + for (const [key, val] of Object.entries(message)) { if (typeof val === "string" && isReference(val)) { - msg[key] = await call("GET", { paths: splitReference(val).map(addDot) }); - await resolveReferences(msg[key], call, level - 1); + const item = await call("GET", { paths: splitReference(val).map(addDot) }); + msg[key] = await resolveReferences(item, call, level - 1); } else if (typeof val === "object") - await resolveReferences(msg[key], call, level); + msg[key] = await resolveReferences(msg[key], call, level); } + return msg; } - return msg; + return message; }; const make: MakeRecipeFn = (call): ResolveRecipe => (msg, level) => resolveReferences(msg, call, level || 1)