tag:github.com,2008:https://github.com/moleculerjs/moleculer/releases
Release notes from moleculer
2024-11-06T17:35:22Z
tag:github.com,2008:Repository/82289483/v0.14.35
2024-11-06T17:38:46Z
v0.14.35
<h2>What's Changed</h2>
<ul>
<li>chore(peer-deps): allow to work with pino v9 by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jellydn/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jellydn">@jellydn</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2273610973" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1282" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1282/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1282">#1282</a></li>
<li>Runner: log runner error through util.inspect by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/PetrChalov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/PetrChalov">@PetrChalov</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2566047629" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1304" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1304/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1304">#1304</a></li>
<li>fix: Update default type for ServiceSchema generic to Service. by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/marceliwac/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/marceliwac">@marceliwac</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2526252790" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1299" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1299/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1299">#1299</a></li>
<li>fix: updated removePendingRequestByNodeID by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/JS-AK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/JS-AK">@JS-AK</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2636490383" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1306" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1306/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1306">#1306</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jellydn/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jellydn">@jellydn</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2273610973" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1282" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1282/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1282">#1282</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/PetrChalov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/PetrChalov">@PetrChalov</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2566047629" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1304" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1304/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1304">#1304</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/JS-AK/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/JS-AK">@JS-AK</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2636490383" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1306" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1306/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1306">#1306</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.34...v0.14.35"><tt>v0.14.34...v0.14.35</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.34
2024-07-28T12:01:16Z
v0.14.34
<h2>What's Changed</h2>
<ul>
<li>feat: Expand the type for ServiceSchema to allow for typed lifecycle handlers by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/marceliwac/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/marceliwac">@marceliwac</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2118672153" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1272" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1272/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1272">#1272</a></li>
<li>Fix runner use of moleculer.config function with default export by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2304331521" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1284" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1284/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1284">#1284</a></li>
<li>Improve broker error handler types by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2338736509" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1286" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1286/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1286">#1286</a></li>
<li>Don't plugging third-party Promise library for ioredis in RedisTransporter by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kuzalekon/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kuzalekon">@kuzalekon</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2346109906" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1290" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1290/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1290">#1290</a></li>
<li>fixed numeric cache key issue by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/icebob/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/icebob">@icebob</a> <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2343541441" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1289" data-hovercard-type="issue" data-hovercard-url="/moleculerjs/moleculer/issues/1289/hovercard" href="https://github.com/moleculerjs/moleculer/issues/1289">#1289</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/marceliwac/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/marceliwac">@marceliwac</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2118672153" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1272" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1272/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1272">#1272</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/kuzalekon/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/kuzalekon">@kuzalekon</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2346109906" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1290" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1290/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1290">#1290</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.33...v0.14.34"><tt>v0.14.33...v0.14.34</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.15.0-beta1
2024-05-06T16:49:30Z
v0.15.0-beta1
<p><a href="https://github.com/moleculerjs/moleculer/blob/next/docs/MIGRATION_GUIDE_0.15.md"><strong>Migration guide from 0.14 to 0.15</strong></a></p>
<h1>Breaking changes</h1>
<h2>Minimum Node 18</h2>
<p>The minimum supported Node version is changed from Node 10 to Node 18.</p>
<h2>Communication protocol has been changed</h2>
<p>The Moleculer communication protocol has been changed. The new protocol version is <code>5</code>. However all schema-based serializer has been removed from the core repo. It means v0.15 Moleculer nodes will able to communicate with v0.14 nodes, if you disable version checking in broker options.</p>
<h2>Schema-based serializers (ProtoBuf, Avro, Thrift) are removed</h2>
<p>The reason is desribed in this issue: <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="818205860" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/882" data-hovercard-type="issue" data-hovercard-url="/moleculerjs/moleculer/issues/882/hovercard" href="https://github.com/moleculerjs/moleculer/issues/882">#882</a></p>
<p>If you use one of those, you should change it to one of these schemaless serializers: MsgPack, Notepack.io, JSON, JSONExt, CBOR</p>
<h2>EventLegacy tracing export is removed</h2>
<p>The <code>EventLegacy</code> tracing exporter is removed. Use the <code>Event</code> tracing exporter instead.</p>
<h2>Legacy event handler is removed</h2>
<p>The legacy event handler signature (<code>user.created(payload, sender, eventName)</code>) is removed. You should use the new <code>Context</code> based signature which was introduced in version 0.14.</p>
<p><strong>Legacy event handler</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="module.exports = {
name: "accounts",
events: {
"user.created"(payload, sender, eventName) {
// ...
}
}
};"><pre><span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">name</span>: <span class="pl-s">"accounts"</span><span class="pl-kos">,</span>
<span class="pl-c1">events</span>: <span class="pl-kos">{</span>
<span class="pl-s">"user.created"</span><span class="pl-kos">(</span><span class="pl-s1">payload</span><span class="pl-kos">,</span> <span class="pl-s1">sender</span><span class="pl-kos">,</span> <span class="pl-s1">eventName</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-c">// ...</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<p><strong>Supported event handler</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="module.exports = {
name: "accounts",
events: {
"user.created"(ctx) {
console.log("Payload:", ctx.params);
console.log("Sender:", ctx.nodeID);
console.log("We have also metadata:", ctx.meta);
console.log("The called event name:", ctx.eventName);
// ...
}
}
};"><pre><span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">name</span>: <span class="pl-s">"accounts"</span><span class="pl-kos">,</span>
<span class="pl-c1">events</span>: <span class="pl-kos">{</span>
<span class="pl-s">"user.created"</span><span class="pl-kos">(</span><span class="pl-s1">ctx</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s">"Payload:"</span><span class="pl-kos">,</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">params</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s">"Sender:"</span><span class="pl-kos">,</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">nodeID</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s">"We have also metadata:"</span><span class="pl-kos">,</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">meta</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s">"The called event name:"</span><span class="pl-kos">,</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">eventName</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// ...</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<h2>New REPL options</h2>
<p>In order to the REPL options can be more extensible, a new <code>replOptions</code> broker option is introduces. You can use it instead of the old <code>replCommands</code> and <code>replDelimiter</code> broker options.</p>
<p><strong>Old REPL options</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// moleculer.config.js
module.exports = {
replDelimiter: "mol # ",
replCommands: [
{
command: "hello <name>",
action(broker, args) {
// ...
}
}
]
}"><pre><span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">replDelimiter</span>: <span class="pl-s">"mol # "</span><span class="pl-kos">,</span>
<span class="pl-c1">replCommands</span>: <span class="pl-kos">[</span>
<span class="pl-kos">{</span>
<span class="pl-c1">command</span>: <span class="pl-s">"hello <name>"</span><span class="pl-kos">,</span>
<span class="pl-en">action</span><span class="pl-kos">(</span><span class="pl-s1">broker</span><span class="pl-kos">,</span> <span class="pl-s1">args</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-c">// ...</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">]</span>
<span class="pl-kos">}</span></pre></div>
<p><strong>New REPL options</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// moleculer.config.js
module.exports = {
replOptions: {
delimiter: "mol # ",
customCommands: [
{
command: "hello <name>",
action(broker, args) {
// ...
}
}
]
}
}"><pre><span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">replOptions</span>: <span class="pl-kos">{</span>
<span class="pl-c1">delimiter</span>: <span class="pl-s">"mol # "</span><span class="pl-kos">,</span>
<span class="pl-c1">customCommands</span>: <span class="pl-kos">[</span>
<span class="pl-kos">{</span>
<span class="pl-c1">command</span>: <span class="pl-s">"hello <name>"</span><span class="pl-kos">,</span>
<span class="pl-en">action</span><span class="pl-kos">(</span><span class="pl-s1">broker</span><span class="pl-kos">,</span> <span class="pl-s1">args</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-c">// ...</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">]</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<blockquote>
<p>Please note, you should rename the <code>replCommands</code> property to <code>customCommands</code>, as well.</p>
</blockquote>
<h2>Action streaming</h2>
<p>The built-in <code>Stream</code> sending has been rewritten. Now it accepts <code>params</code> besides the <code>Stream</code> instance.<br>
The <code>Stream</code> parameter moved from <code>ctx.params</code> into calling options under a <code>stream</code> property.</p>
<h3>New way to send a stream with extra parameters</h3>
<p>The stream instance is passed as a calling options, so you can use <code>ctx.params</code> as a normal action call.</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ctx.call("file.save", { filename: "as.txt" }, { stream: fs.createReadStream() });"><pre><span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-en">call</span><span class="pl-kos">(</span><span class="pl-s">"file.save"</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">filename</span>: <span class="pl-s">"as.txt"</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">stream</span>: <span class="pl-s1">fs</span><span class="pl-kos">.</span><span class="pl-en">createReadStream</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<h3>New way to receive a stream</h3>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// file.service.js
module.exports = {
name: "file",
actions: {
save(ctx) {
// The stream is in Context directly
const stream = ctx.stream;
const s = fs.createWriteStream(ctx.params.filename);
stream.pipe(s);
}
}
};"><pre><span class="pl-c">// file.service.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">name</span>: <span class="pl-s">"file"</span><span class="pl-kos">,</span>
<span class="pl-c1">actions</span>: <span class="pl-kos">{</span>
<span class="pl-en">save</span><span class="pl-kos">(</span><span class="pl-s1">ctx</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-c">// The stream is in Context directly</span>
<span class="pl-k">const</span> <span class="pl-s1">stream</span> <span class="pl-c1">=</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">stream</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-s1">s</span> <span class="pl-c1">=</span> <span class="pl-s1">fs</span><span class="pl-kos">.</span><span class="pl-en">createWriteStream</span><span class="pl-kos">(</span><span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">params</span><span class="pl-kos">.</span><span class="pl-c1">filename</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">stream</span><span class="pl-kos">.</span><span class="pl-en">pipe</span><span class="pl-kos">(</span><span class="pl-s1">s</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<h2>Removed deprecated functions and signatures</h2>
<h3>Removed deprecated <code>broker.createService</code> signature</h3>
<p>The <code>broker.createService</code> second argument (for service schema extending) is removed. You should use the <code>mixins</code> in service schema.</p>
<h3>Removed deprecated event sending method signature</h3>
<p>In previous versions, the <code>emit</code>, <code>broadcast</code> and <code>broadcastLocal</code> methods accept a group <code>String</code> or groups as <code>Array<String></code> as third arguments, instead of an <code>opts</code>.<br>
This signature is removed, you should always pass an <code>opts</code> object as 3rd argument.</p>
<h3>Removed deprecated middleware as a <code>Function</code></h3>
<p>We removed and old and deprecated middleware signature where the middleware was <code>localAction</code> function. Now <code>ServiceBroker</code> accepts middleware as <code>Object</code> only.</p>
<h3>Removed deprecated <code>getLocalService</code> signature.</h3>
<p>The <code>broker.getLocalService</code> supports only <code>getLocalService(name|obj)</code> without second <code>version</code> parameter. If you want to get a versioned service, use the <code>v1.posts</code> argument or as object <code>{ name: "posts", version: 1}</code></p>
<h3>Removed <code>Service</code> constructor 3rd argument.</h3>
<p>The <code>Service</code> constructor had a 3rd argument as <code>schemaMods</code> which was deprecated because you should use <code>mixins</code> instead modifier schemas.</p>
<h2>Garbage collector and event-loop metrics removed</h2>
<p>Since <code>gc-stats</code> and <code>event-loop-stats</code> native libraries are not maintained and they are not compatible with newer Node versions, they are removed from the built-in metrics.</p>
<p><strong>Removed metrics:</strong></p>
<ul>
<li><code>process.gc.time</code></li>
<li><code>process.gc.total.time</code></li>
<li><code>process.gc.executed.total</code></li>
<li><code>process.eventloop.lag.min</code></li>
<li><code>process.eventloop.lag.avg</code></li>
<li><code>process.eventloop.lag.max</code></li>
<li><code>process.eventloop.lag.count</code></li>
<li><code>process.internal.active.requests</code></li>
</ul>
<h2>Removed STAN (NATS Streaming) transporter</h2>
<p>The STAN (NATS Streaming) transporter has been removed while it's deprecated and not supported by the NATS.io, as well. More info: <a href="https://nats-io.gitbook.io/legacy-nats-docs/nats-streaming-server-aka-stan" rel="nofollow">https://nats-io.gitbook.io/legacy-nats-docs/nats-streaming-server-aka-stan</a></p>
<h2>Rewritten Kafka transporter (based on kafkajs)</h2>
<p>The previous <code>kafka-node</code> based transporter has been rewritten to a <code>kafkajs</code> based transporter. It means, you should migrate your Kafka Transporter options.</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// moleculer.config.js
module.exports = {
transporter: {
type: "Kafka",
options: {
// KafkaClient options. More info: https://kafka.js.org/docs/configuration
client: {
brokers: [/*...*/]
},
// KafkaProducer options. More info: https://kafka.js.org/docs/producing#options
producer: {},
// ConsumerGroup options. More info: https://kafka.js.org/docs/consuming#a-name-options-a-options
consumer: {},
// Advanced options for `send`. More info: https://kafka.js.org/docs/producing#producing-messages
publish: {},
// Advanced message options for `send`. More info: https://kafka.js.org/docs/producing#message-structure
publishMessage: {
partition: 0
}
}
}
}"><pre><span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">transporter</span>: <span class="pl-kos">{</span>
<span class="pl-c1">type</span>: <span class="pl-s">"Kafka"</span><span class="pl-kos">,</span>
<span class="pl-c1">options</span>: <span class="pl-kos">{</span>
<span class="pl-c">// KafkaClient options. More info: https://kafka.js.org/docs/configuration</span>
<span class="pl-c1">client</span>: <span class="pl-kos">{</span>
<span class="pl-c1">brokers</span>: <span class="pl-kos">[</span><span class="pl-c">/*...*/</span><span class="pl-kos">]</span>
<span class="pl-kos">}</span><span class="pl-kos">,</span>
<span class="pl-c">// KafkaProducer options. More info: https://kafka.js.org/docs/producing#options</span>
<span class="pl-c1">producer</span>: <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span>
<span class="pl-c">// ConsumerGroup options. More info: https://kafka.js.org/docs/consuming#a-name-options-a-options</span>
<span class="pl-c1">consumer</span>: <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span>
<span class="pl-c">// Advanced options for `send`. More info: https://kafka.js.org/docs/producing#producing-messages</span>
<span class="pl-c1">publish</span>: <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span>
<span class="pl-c">// Advanced message options for `send`. More info: https://kafka.js.org/docs/producing#message-structure</span>
<span class="pl-c1">publishMessage</span>: <span class="pl-kos">{</span>
<span class="pl-c1">partition</span>: <span class="pl-c1">0</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<p>About new configuration options, check this documentation: <a href="https://kafka.js.org/docs/configuration" rel="nofollow">https://kafka.js.org/docs/configuration</a></p>
<h2>Removed legacy NATS library (<a href="mailto:nats@1.x.x">nats@1.x.x</a>) implementation</h2>
<p>The legacy <code>nats@1.x.x</code> transporter implementation is removed. This version supports only <code>nats@2.x.x</code> library.</p>
<h2>The Fastest Validator options changed.</h2>
<p>In 0.15 the <code>useNewCustomCheckFunction</code> default value is changed from <code>false</code> to <code>true</code>. It means, if you have old custom checker function in your parameter validation schemas, you should rewrite it to the new custom check function form.</p>
<p>You can see example about migration here: <a href="https://github.com/icebob/fastest-validator/blob/master/CHANGELOG.md#new-custom-function-signature">https://github.com/icebob/fastest-validator/blob/master/CHANGELOG.md#new-custom-function-signature</a></p>
<h2>Rewritten Typescript definition files</h2>
<p>The previously used huge one-file <code>index.d.ts</code> file has been rewritten and separated to multiple <code>d.ts</code> files, all are placed besides the source file. It may causes breaking changes in Typescript projects.</p>
<h2>Other breaking changes</h2>
<ul>
<li><code>ServiceBroker.Promise</code> is removed. Use <code>broker.Promise</code> or <code>this.Promise</code> inside a <code>Service</code>.</li>
</ul>
<h1>New features</h1>
<h2>New JSON Extended serializer</h2>
<p>We implemented a new JSON serializer which unlike the native JSON serializer, it supports serializing <code>Buffer</code>, <code>BigInt</code>, <code>Date</code>, <code>Map</code>, <code>Set</code> and <code>RegExp</code> classes, as well.</p>
<h3>Example</h3>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// moleculer.config.js
module.exports = {
serializer: "JSONExt"
}"><pre><span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">serializer</span>: <span class="pl-s">"JSONExt"</span>
<span class="pl-kos">}</span></pre></div>
<h3>Custom extensions</h3>
<p>You can extend the serializer with custom types.</p>
<h4>Example to extend with a custom class serializing/deserializing</h4>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// MyClass.js
class MyClass {
constructor(a, b) {
this.a = a;
this.b = b;
}
}"><pre><span class="pl-c">// MyClass.js</span>
<span class="pl-k">class</span> <span class="pl-v">MyClass</span> <span class="pl-kos">{</span>
<span class="pl-en">constructor</span><span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-smi">this</span><span class="pl-kos">.</span><span class="pl-c1">a</span> <span class="pl-c1">=</span> <span class="pl-s1">a</span><span class="pl-kos">;</span>
<span class="pl-smi">this</span><span class="pl-kos">.</span><span class="pl-c1">b</span> <span class="pl-c1">=</span> <span class="pl-s1">b</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// moleculer.config.js
module.exports = {
serializer: {
type: "JSONExt",
options: {
customs: [
{
// This is the identifier of the custom type
prefix: "AB",
// This function checks the type of JSON value
check: v => v instanceof MyClass,
// Serialize the custom class properties to a String
serialize: v => v.a + "|" + v.b,
// Deserialize the JSON string to custom class instance and set properties
deserialize: v => {
const [a, b] = v.split("|");
return new MyClass(parseInt(a), b);
}
}
]
}
}
}"><pre><span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">serializer</span>: <span class="pl-kos">{</span>
<span class="pl-c1">type</span>: <span class="pl-s">"JSONExt"</span><span class="pl-kos">,</span>
<span class="pl-c1">options</span>: <span class="pl-kos">{</span>
<span class="pl-c1">customs</span>: <span class="pl-kos">[</span>
<span class="pl-kos">{</span>
<span class="pl-c">// This is the identifier of the custom type</span>
<span class="pl-c1">prefix</span>: <span class="pl-s">"AB"</span><span class="pl-kos">,</span>
<span class="pl-c">// This function checks the type of JSON value</span>
<span class="pl-en">check</span>: <span class="pl-s1">v</span> <span class="pl-c1">=></span> <span class="pl-s1">v</span> <span class="pl-k">instanceof</span> <span class="pl-v">MyClass</span><span class="pl-kos">,</span>
<span class="pl-c">// Serialize the custom class properties to a String</span>
<span class="pl-en">serialize</span>: <span class="pl-s1">v</span> <span class="pl-c1">=></span> <span class="pl-s1">v</span><span class="pl-kos">.</span><span class="pl-c1">a</span> <span class="pl-c1">+</span> <span class="pl-s">"|"</span> <span class="pl-c1">+</span> <span class="pl-s1">v</span><span class="pl-kos">.</span><span class="pl-c1">b</span><span class="pl-kos">,</span>
<span class="pl-c">// Deserialize the JSON string to custom class instance and set properties</span>
<span class="pl-en">deserialize</span>: <span class="pl-s1">v</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span>
<span class="pl-k">const</span> <span class="pl-kos">[</span><span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">]</span> <span class="pl-c1">=</span> <span class="pl-s1">v</span><span class="pl-kos">.</span><span class="pl-en">split</span><span class="pl-kos">(</span><span class="pl-s">"|"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-v">MyClass</span><span class="pl-kos">(</span><span class="pl-en">parseInt</span><span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">]</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<h2>New Request headers</h2>
<p>We added a new <code>headers</code> property in calling options and Context class to store meta information for an action calling or an event emitting.</p>
<p>The difference between <code>headers</code> and <code>meta</code> is that the <code>meta</code> is always passed to all action calls in a chain and merged, the <code>headers</code> is transferred only to the actual action call and not passed to the nested calls.</p>
<blockquote>
<p>Please note, header keys start with <code>$</code> means internal header keys (e.g. <code>$streamObjectMode</code>). We recommend to don't use this prefix for your keys to avoid conflicts.</p>
</blockquote>
<h3>Set headers in action calls</h3>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="broker.call("posts.list", { limit: 100 }, {
headers: {
customProp: "customValue"
}
});"><pre><span class="pl-s1">broker</span><span class="pl-kos">.</span><span class="pl-en">call</span><span class="pl-kos">(</span><span class="pl-s">"posts.list"</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">limit</span>: <span class="pl-c1">100</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
<span class="pl-c1">headers</span>: <span class="pl-kos">{</span>
<span class="pl-c1">customProp</span>: <span class="pl-s">"customValue"</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<blockquote>
<p>You can use the same way for event emitting or broadcasting.</p>
</blockquote>
<h3>Read headers inside action handler</h3>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// posts.service.js
module.exports = {
name: "posts",
actions: {
list(ctx) {
const customProp = ctx.headers.customProp;
}
}
};"><pre><span class="pl-c">// posts.service.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">name</span>: <span class="pl-s">"posts"</span><span class="pl-kos">,</span>
<span class="pl-c1">actions</span>: <span class="pl-kos">{</span>
<span class="pl-en">list</span><span class="pl-kos">(</span><span class="pl-s1">ctx</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">const</span> <span class="pl-s1">customProp</span> <span class="pl-c1">=</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">headers</span><span class="pl-kos">.</span><span class="pl-c1">customProp</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<blockquote>
<p>You can use the same way in event handlers.</p>
</blockquote>
<h3>Use header value in cache keys</h3>
<p>You can add headers values to the cache keys as well. For this, use <code>@</code> prefix</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// posts.service.js
module.exports = {
name: "posts",
actions: {
list: {
cache: {
keys: [
"limit", // value from `ctx.params`
"#tenant", // value from `ctx.meta`
"@customProp" // value from `ctx.headers`
]
}
handler(ctx) {
const customProp = ctx.headers.customProp;
}
}
}
};"><pre><span class="pl-c">// posts.service.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">name</span>: <span class="pl-s">"posts"</span><span class="pl-kos">,</span>
<span class="pl-c1">actions</span>: <span class="pl-kos">{</span>
<span class="pl-c1">list</span>: <span class="pl-kos">{</span>
<span class="pl-c1">cache</span>: <span class="pl-kos">{</span>
<span class="pl-c1">keys</span>: <span class="pl-kos">[</span>
<span class="pl-s">"limit"</span><span class="pl-kos">,</span> <span class="pl-c">// value from `ctx.params`</span>
<span class="pl-s">"#tenant"</span><span class="pl-kos">,</span> <span class="pl-c">// value from `ctx.meta`</span>
<span class="pl-s">"@customProp"</span> <span class="pl-c">// value from `ctx.headers`</span>
<span class="pl-kos">]</span>
<span class="pl-kos">}</span>
<span class="pl-s1">handler</span><span class="pl-kos">(</span><span class="pl-s1">ctx</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-k">const</span> <span class="pl-s1">customProp</span> <span class="pl-c1">=</span> <span class="pl-s1">ctx</span><span class="pl-kos">.</span><span class="pl-c1">headers</span><span class="pl-kos">.</span><span class="pl-c1">customProp</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div>
<h3>Response headers</h3>
<p>The Moleculer protocol supports headers in response, as well (<code>ctx.responseHeaders</code>). But in normal way, you can't access to them in your services because you don't have pointer to the returned <code>Context</code> instance. So at present, it can be used by middlewares only.</p>
<h2>Other changes</h2>
<h3>Better error handling in event handlers.</h3>
<p>!TODO!</p>
<h3>Cacher changes</h3>
<h4>The <code>getCacheKey</code> and <code>opts.keygen</code> signature has been changed</h4>
<p>Old signature: <code>getCacheKey(actionName, params, meta, keys, actionKeygen)</code></p>
<p>New signature: <code>getCacheKey(action, opts, ctx)</code></p>
<h4>Added <code>missingResponse</code> option to cacher options</h4>
<p>In 0.14, you could not make a difference between the result cached value is <code>null</code> or it's not in the cache. Because both way, the <code>cacher.get</code> responded with <code>null</code>.</p>
<p>In 0.15, if a cache key is not found in cache, it returns <code>undefined</code> by default, or you can change it with <code>missingResponse</code> option.</p>
<p><strong>Example: using a custom symbol to detect missing entries</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="const missingSymbol = Symbol("MISSING");
// moleculer.config.js
module.exports = {
cacher: {
type: "Memory",
options: {
missingResponse: missingSymbol
}
}
}
// Get data from cache
const res = await cacher.get("not-existing-key");
if (res === cacher.opts.missingSymbol) {
console.log("It's not cached.");
}"><pre><span class="pl-k">const</span> <span class="pl-s1">missingSymbol</span> <span class="pl-c1">=</span> <span class="pl-v">Symbol</span><span class="pl-kos">(</span><span class="pl-s">"MISSING"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// moleculer.config.js</span>
<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
<span class="pl-c1">cacher</span>: <span class="pl-kos">{</span>
<span class="pl-c1">type</span>: <span class="pl-s">"Memory"</span><span class="pl-kos">,</span>
<span class="pl-c1">options</span>: <span class="pl-kos">{</span>
<span class="pl-c1">missingResponse</span>: <span class="pl-s1">missingSymbol</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-c">// Get data from cache</span>
<span class="pl-k">const</span> <span class="pl-s1">res</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">cacher</span><span class="pl-kos">.</span><span class="pl-en">get</span><span class="pl-kos">(</span><span class="pl-s">"not-existing-key"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">res</span> <span class="pl-c1">===</span> <span class="pl-s1">cacher</span><span class="pl-kos">.</span><span class="pl-c1">opts</span><span class="pl-kos">.</span><span class="pl-c1">missingSymbol</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
<span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s">"It's not cached."</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span></pre></div>
<h3>Cache key generation changed</h3>
<p>There are some changes in the serialized values in the cache keys. In previous versions, the <code>null</code> and <code>undefined</code> values were serialized as <code>null</code>, and <code>"null"</code> as string also serialized to <code>null</code>.<br>
In 0.15, string values are wrapped into quotes, the <code>null</code> is <code>null</code> and <code>undefined</code> is serialized as <code>undefined</code>, so similar serialized values.</p>
<p>These changes means the 0.15 cachers create different cache keys than 0.14 cachers.</p>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.33...v0.15.0-beta1"><tt>v0.14.33...v0.15.0-beta1</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.33
2024-04-02T15:37:25Z
v0.14.33
<h2>What's Changed</h2>
<ul>
<li>autodetect Redis type discoverer when using redis SSL URI by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Freezystem/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Freezystem">@Freezystem</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1999484946" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1260" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1260/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1260">#1260</a></li>
<li>Transit improve by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0x0a0d/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0x0a0d">@0x0a0d</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1998456957" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1258" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1258/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1258">#1258</a></li>
<li>change from 'connect' to 'ready' event in redis clients. Fixes <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1992490374" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1257" data-hovercard-type="issue" data-hovercard-url="/moleculerjs/moleculer/issues/1257/hovercard" href="https://github.com/moleculerjs/moleculer/issues/1257">#1257</a> by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/icebob/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/icebob">@icebob</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2080251536" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1269" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1269/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1269">#1269</a></li>
<li>Add hook middlewares interceptors to preserve call context with call middlewares. by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DonVietnam/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DonVietnam">@DonVietnam</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2081670356" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1270" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1270/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1270">#1270</a></li>
<li>Remove unnecessary clone in node update method by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Ubitso/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Ubitso">@Ubitso</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2134131769" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1274" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1274/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1274">#1274</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Freezystem/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Freezystem">@Freezystem</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1999484946" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1260" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1260/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1260">#1260</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DonVietnam/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DonVietnam">@DonVietnam</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2081670356" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1270" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1270/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1270">#1270</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.32...v0.14.33"><tt>v0.14.32...v0.14.33</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.32
2023-11-12T18:07:03Z
v0.14.32
<h2>What's Changed</h2>
<ul>
<li>Update peer dependency for mqtt to 5.0.2 by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mze9412/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mze9412">@mze9412</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1841228683" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1236" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1236/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1236">#1236</a></li>
<li>add d.ts for class Runner (MoleculerRunner) by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0x0a0d/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0x0a0d">@0x0a0d</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1904894118" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1245" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1245/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1245">#1245</a></li>
<li>Update index.d.ts with Middlewares.Transmit type definitions by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0x0a0d/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0x0a0d">@0x0a0d</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1908722599" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1246" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1246/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1246">#1246</a></li>
<li>fix memory leak by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ghostiee/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ghostiee">@ghostiee</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1889144155" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1243" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1243/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1243">#1243</a></li>
<li>imp(index.d.ts): middleware serviceCreating params by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0x0a0d/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0x0a0d">@0x0a0d</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1912000132" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1248" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1248/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1248">#1248</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/mze9412/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/mze9412">@mze9412</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1841228683" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1236" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1236/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1236">#1236</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ghostiee/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ghostiee">@ghostiee</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1889144155" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1243" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1243/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1243">#1243</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.31...v0.14.32"><tt>v0.14.31...v0.14.32</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.31
2023-08-06T13:53:03Z
v0.14.31
<h2>What's Changed</h2>
<ul>
<li>Remove usage of _.uniq by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MrDroid1/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MrDroid1">@MrDroid1</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1707763629" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1211" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1211/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1211">#1211</a></li>
<li>Fix: prometheus reporter to accept host option by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MichaelErmer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MichaelErmer">@MichaelErmer</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1760715650" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1221" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1221/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1221">#1221</a></li>
<li>Bugfix: started not being called when createService is used by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MichaelErmer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MichaelErmer">@MichaelErmer</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1812734383" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1229" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1229/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1229">#1229</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MichaelErmer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MichaelErmer">@MichaelErmer</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1760715650" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1221" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1221/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1221">#1221</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.30...v0.14.31"><tt>v0.14.30...v0.14.31</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.30
2023-07-15T17:08:58Z
v0.14.30
<h2>What's Changed</h2>
<ul>
<li>Improve logger types by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1702383734" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1208" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1208/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1208">#1208</a></li>
<li>add typings to package.json export by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cs4inctec/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cs4inctec">@cs4inctec</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1707526174" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1210" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1210/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1210">#1210</a></li>
<li>Remove usage of _.random by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MrDroid1/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MrDroid1">@MrDroid1</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1707857786" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1212" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1212/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1212">#1212</a></li>
<li>replace deprecated redis.setex with redis.set method by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/fernandodevelon/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/fernandodevelon">@fernandodevelon</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1614104242" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1191" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1191/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1191">#1191</a></li>
<li>Update some registry types around ActionCatalog by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1799522899" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1225" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1225/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1225">#1225</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cs4inctec/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cs4inctec">@cs4inctec</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1707526174" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1210" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1210/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1210">#1210</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/MrDroid1/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/MrDroid1">@MrDroid1</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1707857786" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1212" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1212/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1212">#1212</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/fernandodevelon/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/fernandodevelon">@fernandodevelon</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1614104242" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1191" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1191/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1191">#1191</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.29...v0.14.30"><tt>v0.14.29...v0.14.30</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.29
2023-03-12T19:54:59Z
v0.14.29
<h2>What's Changed</h2>
<ul>
<li>Improve lifecycle handler types by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1552204808" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1179" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1179/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1179">#1179</a></li>
<li>chore(types): add service list options & define getActionList type by @lucduong in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1567312459" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1182" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1182/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1182">#1182</a></li>
<li>fix: do not emit send node info during broker stopping event by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/alvaroinckot/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/alvaroinckot">@alvaroinckot</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1605618299" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1186" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1186/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1186">#1186</a></li>
<li>Updated Datadog metrics by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/bcavlin/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/bcavlin">@bcavlin</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1458947697" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1156" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1156/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1156">#1156</a></li>
<li>chore(types): mergeSchema can be used to merge 2 mixins by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0x0a0d/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0x0a0d">@0x0a0d</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1609942816" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1187" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1187/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1187">#1187</a></li>
<li>Allow opt out of redlock in redis cacher by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1615662626" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1192" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1192/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1192">#1192</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li>@lucduong made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1567312459" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1182" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1182/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1182">#1182</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/bcavlin/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/bcavlin">@bcavlin</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1458947697" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1156" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1156/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1156">#1156</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.28...v0.14.29"><tt>v0.14.28...v0.14.29</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.28
2023-01-08T15:45:31Z
v0.14.28
<h2>What's Changed</h2>
<ul>
<li>fix no clean exit on shutdown, with disableBalancer: true <a href="https://github.com/moleculerjs/moleculer/pull/1168" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1168/hovercard">#1168</a></li>
<li>change <code>__proto__</code> to <code>Object.getProtoTypeOf</code> <a href="https://github.com/moleculerjs/moleculer/pull/1170" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1170/hovercard">#1170</a></li>
<li>fix merge schemas (handling nulls) <a href="https://github.com/moleculerjs/moleculer/pull/1172" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1172/hovercard">#1172</a></li>
<li>fix hot reload error handling <a href="https://github.com/moleculerjs/moleculer/issues/1174" data-hovercard-type="issue" data-hovercard-url="/moleculerjs/moleculer/issues/1174/hovercard">#1174</a></li>
<li>update d.ts file</li>
<li>update dependencies</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/danieledraganti/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/danieledraganti">@danieledraganti</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1512771305" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1173" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1173/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1173">#1173</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/gautaz/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/gautaz">@gautaz</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1502907190" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1170" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1170/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1170">#1170</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.27...v0.14.28"><tt>v0.14.27...v0.14.28</tt></a></p>
icebob
tag:github.com,2008:Repository/82289483/v0.14.27
2022-12-17T16:29:31Z
v0.14.27
<h2>What's Changed</h2>
<ul>
<li>feat(TS/cachers): add types for lock functions by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/thib3113/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/thib3113">@thib3113</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1447150855" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1152" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1152/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1152">#1152</a></li>
<li>Typing add spanName and safeTags to tracing options by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/thib3113/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/thib3113">@thib3113</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1462581960" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1157" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1157/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1157">#1157</a></li>
<li>Use interface instead of type to allow for declaration merging by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/shawnmcknight/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/shawnmcknight">@shawnmcknight</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1490419364" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1165" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1165/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1165">#1165</a></li>
<li>Prevent registerInternalServices deprecation warning by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DenisFerrero/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DenisFerrero">@DenisFerrero</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1486350843" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1163" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1163/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1163">#1163</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DenisFerrero/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DenisFerrero">@DenisFerrero</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1486350843" data-permission-text="Title is private" data-url="https://github.com/moleculerjs/moleculer/issues/1163" data-hovercard-type="pull_request" data-hovercard-url="/moleculerjs/moleculer/pull/1163/hovercard" href="https://github.com/moleculerjs/moleculer/pull/1163">#1163</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/moleculerjs/moleculer/compare/v0.14.26...v0.14.27"><tt>v0.14.26...v0.14.27</tt></a></p>
icebob