<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cwd on blog.iankulin.com</title><link>https://blog.iankulin.com/tags/cwd/</link><description>Recent content in Cwd on blog.iankulin.com</description><generator>Hugo</generator><language>en-AU</language><lastBuildDate>Mon, 30 Jan 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.iankulin.com/tags/cwd/index.xml" rel="self" type="application/rss+xml"/><item><title>Expired packages</title><link>https://blog.iankulin.com/expired-packages/</link><pubDate>Mon, 30 Jan 2023 00:00:00 +0000</pubDate><guid>https://blog.iankulin.com/expired-packages/</guid><description>&lt;p&gt;At several points in the &lt;a href="https://www.udemy.com/course/the-complete-web-developer-zero-to-mastery/"&gt;Complete Web Developer&lt;/a&gt; course, deprecated packages have been used, with the slide before the video explaining what&amp;rsquo;s happening, and giving a work around, or sometimes - as is the case for the bit I&amp;rsquo;m just starting - exhorting the benefits of dropping you into a non-working mess and having you figure it out yourself.&lt;/p&gt;
&lt;p&gt;While this argument can be reasonably made - that figuring things out on your own is a valuable skill - it&amp;rsquo;s also a useful fig leaf to cover up the fact that they haven&amp;rsquo;t bothered to fix the course to make it work out of the box.&lt;/p&gt;
&lt;p&gt;A recent example of this was the particles.js library. The card preceding the video says the library used in the video is no longer available, but hey, this other one is pretty much the same. And, I mean it was very similar, but the instructions on it&amp;rsquo;s npm page for using it were different from what was in the video, the video instructions didn&amp;rsquo;t work with it, and following the install page instructions led to one of those repeated &lt;code&gt;npm audit fix --force&lt;/code&gt; cycles where you keep just breaking more things.&lt;/p&gt;
&lt;p&gt;I got it going eventually, but only by starting with a new create-react app with the particles template then slowly adding back my previous code from git a bit at a time and fixing errors as they came up. The whole process from watching the video to having the project working as per the video was probably four or five hours. Was this a good investment of learning time? Probably not.&lt;/p&gt;
&lt;img src="https://blog.iankulin.com/images/img_3996.jpg" width="600" alt=""&gt;
&lt;p&gt;Straight out of that experience, Andrei advises that the next section uses a deprecated api, that he&amp;rsquo;s persisting with because he wants to teach REST apis. In order to make it work, we need to downgrade the react-scripts version which he assures will not cause any problems. Naturally there is a list of critical warnings, and the server can&amp;rsquo;t start because of a heap of errors.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.iankulin.com/images/screen-shot-2023-01-23-at-11.14.08-am.jpg" alt=""&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting the development server&lt;span style="color:#81a1c1"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; error&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0308010&lt;/span&gt;C&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;digital envelope routines&lt;span style="color:#eceff4"&gt;::&lt;/span&gt;unsupported
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at new Hash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;node&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;internal&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;crypto&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;hash&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;71&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#bf616a"&gt;Object&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createHash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;node&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;crypto&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;133&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at module&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;exports &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;util&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;createHash&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;135&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;53&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;_initBuildHash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;417&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;16&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at handleParseError &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;471&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;503&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;358&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;373&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at iterateNormalLoaders &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;214&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at iterateNormalLoaders &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;221&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;react&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;scripts&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;scripts&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;start&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; throw err&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;^&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; error&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0308010&lt;/span&gt;C&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;digital envelope routines&lt;span style="color:#eceff4"&gt;::&lt;/span&gt;unsupported
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at new Hash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;node&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;internal&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;crypto&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;hash&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;71&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#bf616a"&gt;Object&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createHash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;node&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;crypto&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;133&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at module&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;exports &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;util&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;createHash&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;135&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;53&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;_initBuildHash &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;417&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;16&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;452&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;webpack&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;NormalModule&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;323&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;367&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;233&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at context&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;callback &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;runner&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;LoaderRunner&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;111&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;13&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Users&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;ianbailey&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;node_modules&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;babel&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;loader&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;lib&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;index&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;59&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;103&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; opensslErrorStack&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#39;error:03000086:digital envelope routines::initialization error&amp;#39;&lt;/span&gt; &lt;span style="color:#eceff4"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; library&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#39;digital envelope routines&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reason&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#39;unsupported&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#39;ERR_OSSL_EVP_UNSUPPORTED&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;Node&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;js v18&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#b48ead"&gt;12.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;➜&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;~/&lt;/span&gt;Developer&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;CWD&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;facerecognitionbrain &lt;span style="color:#81a1c1"&gt;&amp;gt;&lt;/span&gt; git&lt;span style="color:#eceff4"&gt;:(&lt;/span&gt;main&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#bf616a"&gt;✗&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clearly this (or perhaps the next step) is a spot in the course that receives a few complaints, since Andrei goes to the effort of making a special video in front of it extolling the virtues of solving your own problems, and saying he has a script that runs weekly on his code for this section proving it does work. He also explains that after the app is built with the deprecated REST API, he&amp;rsquo;d got a new video using the new package, then after that we&amp;rsquo;ll be removing all this code anyway to move this functionality to a node server.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve got a few options in front of me.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Try and wind back all of the packages that are causing problems until the app runs again.&lt;/li&gt;
&lt;li&gt;Just watch the REST API content but don&amp;rsquo;t bother trying it.&lt;/li&gt;
&lt;li&gt;Clone Andrie&amp;rsquo;s project and see if he&amp;rsquo;s actually managed to get it going with the outdated script somehow and figure out how and bring that technique over to my project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(2) is the logical option, but it&amp;rsquo;s frustrating since the point of this section is to learn REST API&amp;rsquo;s. In an ideal world, ZTM would have rewritten this part of the course to use a REST API that works. No doubt this would mean coming up with a new app and remaking some videos, but really that&amp;rsquo;s what they need to do.&lt;/p&gt;
&lt;p&gt;Slightly compounding the frustration is that support for the course is community based centred around a Discord, and there&amp;rsquo;s no channel for this course.&lt;/p&gt;
&lt;p&gt;I decide to watch the videos first then make a decision, and in the meantime revert back to the current version of react-script. Of course, when I do this, it suddenly has some critical vulnerabilities in webpack 🤦. I run the force, and now I&amp;rsquo;ve got 80 critical vulnerabilities and the server won&amp;rsquo;t run due to errors five deep in Babel somewhere.&lt;/p&gt;
&lt;p&gt;To be continued&amp;hellip;&lt;/p&gt;</description></item><item><title>CWD - 185 - Problem solving</title><link>https://blog.iankulin.com/cwd-185-problem-solving/</link><pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate><guid>https://blog.iankulin.com/cwd-185-problem-solving/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;/* 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;Question 1: Clean the room function: given an input of [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20], 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;make a function that organizes these into individual array that is ordered. For example 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;answer(ArrayFromAbove) should return: [[1,1,1,1],[2,2,2], 4,5,10,[20,20], 391, 392,591]. 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;function&lt;/span&gt; ctrFunction1&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;inputArray&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// copy the array since we&amp;#39;re mutating it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; array &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[...&lt;/span&gt;inputArray&lt;span style="color:#eceff4"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; array&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;sort&lt;span style="color:#eceff4"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; numberObject &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; number &lt;span style="color:#81a1c1;font-weight:bold"&gt;of&lt;/span&gt; array&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;number&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;===&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;undefined&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// this property does not exist, so add it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;number&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;number&lt;span style="color:#eceff4"&gt;].&lt;/span&gt;push&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;number&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// object now contains arrays for each number, but the ones with a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// single element need degloved
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;property &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; numberObject&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;property&lt;span style="color:#eceff4"&gt;].&lt;/span&gt;length &lt;span style="color:#81a1c1"&gt;===&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;property&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; numberObject&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;property&lt;span style="color:#eceff4"&gt;][&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// now turn back to array 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;Object&lt;/span&gt;&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;values&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;numberObject&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; array1 &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;591&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;392&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;391&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;20&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;20&lt;/span&gt;&lt;span style="color:#eceff4"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; transformedArray1 &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; ctrFunction1&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;array1&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;console&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;log&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;transformedArray1&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// [1, 1, 1, 1], [2, 2, &amp;#39;2&amp;#39;], 4, 5, 10, [20, 20], 391, 392, 591]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="line-10"&gt;Line 10&lt;/h4&gt;
&lt;p&gt;When I&amp;rsquo;m looking at a function, I&amp;rsquo;d prefer not to also have to hold global state in my head - so I&amp;rsquo;m all for functional programming as far as that goes. I&amp;rsquo;m less concerned about side effects, so I wouldn&amp;rsquo;t always bother to copy a parameter like this, but the argument is stronger for an array than an object since in other languages an array might be a value type.&lt;/p&gt;
&lt;p&gt;The copy itself is noteworthy since I&amp;rsquo;m using the cool &lt;code&gt;[...x]&lt;/code&gt; &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax"&gt;spread syntax&lt;/a&gt;. This is one of the newish iterator tools which returns any iterate-able data as an array. Since this is right at the top of our function, we&amp;rsquo;re also indicating to the reader we&amp;rsquo;re expecting a one-dimensional array.&lt;/p&gt;
&lt;h4 id="line-11"&gt;Line 11&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;array.sort()&lt;/code&gt; works as expected, and in place - so our new array is mutated - hence the copying earlier. It can optionally be passed in an arrow function to determine the sort test, but if omitted assumes ascending according to the &amp;lt; and &amp;gt; rules. The format of this function is a bit different that in Swift. For the standard sort it is &lt;code&gt;array.sort((a, b) =&amp;gt; (a - b))&lt;/code&gt; whereas in Swift it would have been &lt;code&gt;( a &amp;gt; b )&lt;/code&gt;. This is because in JS the function result is compared against zero to see if the positions are swapped. This seems odd, but I&amp;rsquo;m sure there&amp;rsquo;s a reason.&lt;/p&gt;
&lt;h4 id="lines-13-20"&gt;Lines 13-20&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;for (x of y)&lt;/code&gt; syntax is a neat iterator loop for when you need the item (but not index) of a collection. I slightly regret using &lt;code&gt;number&lt;/code&gt; for the array element - since this is JS it could be number, string or anything.&lt;/p&gt;
&lt;p&gt;We check the new object we created to see if it has a property with the name of the current element. For example if this element of our array is 254, we check to see if the object has a property of that name - eg &lt;code&gt;numberObject.254&lt;/code&gt;. That&amp;rsquo;s the square brackets on the object. It&amp;rsquo;s a neat bit of meta that would be challenging in other languages.&lt;/p&gt;
&lt;p&gt;If there&amp;rsquo;s no property with that name we add it as an empty array. The value from the array is appended to this array in the object. So if we had an array of &lt;code&gt;[2, 2, 3, 4]&lt;/code&gt; we&amp;rsquo;d end up with an object.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2 - [2, 2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3 - [3]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 - [4]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="lines-22-28"&gt;Lines 22-28&lt;/h4&gt;
&lt;p&gt;Where there&amp;rsquo;s more than one of the same value (as in 2 above) we want an array, but if there&amp;rsquo;s only a single value, we want the raw value. So the next segment of code is to work through each property of the object and change any single values to just their values instead of a single element array. This is a great example of something that&amp;rsquo;s neat and clear in JS but would not be possible in a strictly typed language.&lt;/p&gt;
&lt;p&gt;We use &lt;code&gt;for x **in** y&lt;/code&gt; this time to inspect each property of an object (rather than elements in an array).&lt;/p&gt;
&lt;h4 id="line-31"&gt;Line 31&lt;/h4&gt;
&lt;p&gt;values() is just a standard method that returns an array version of an object.&lt;/p&gt;</description></item><item><title>Step Ahead</title><link>https://blog.iankulin.com/one-step/</link><pubDate>Wed, 04 Jan 2023 00:00:00 +0000</pubDate><guid>https://blog.iankulin.com/one-step/</guid><description>&lt;p&gt;I was a bit pleased with myself when I started the next content element in the Complete Web Developer course to find that one and a half of the extensions I&amp;rsquo;d made to the tutorial app for my own fun were specified as the next task.&lt;/p&gt;
&lt;p&gt;In my previous post, I&amp;rsquo;d talked about using a class to denote if an item was completed, and using a style to indicate this by crossing it out. What I haven&amp;rsquo;t discussed was that I&amp;rsquo;d captured right click events on the list items to make this delete them. I wasn&amp;rsquo;t entirely happy with that for a couple of reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It wasn&amp;rsquo;t obvious to the user how to delete if they wanted to, and perhaps worse, it might accidentally be invoked - never a good idea for a destructive action with no undo.&lt;/li&gt;
&lt;li&gt;It was accessibility un-friendly There was no way to tab through the available actions or to have them read out. This was also the case for crossing items off.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The new task was to add a delete button for each item, which is a much better idea. I decided to do both a &amp;ldquo;check off&amp;rdquo; and &amp;ldquo;delete&amp;rdquo; button to address the accessibility point above.&lt;/p&gt;
&lt;p&gt;The HTML for them looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;ul id=&amp;#34;ulItems&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Sample Item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;button type=&amp;#34;button&amp;#34; class=&amp;#34;btnCheck&amp;#34;&amp;gt;✔️&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;button type=&amp;#34;button&amp;#34; class=&amp;#34;btnDelete&amp;#34;&amp;gt;❌&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I might have been a bit too clever using emoji. I assume they are well supported but not really sure. I also could not change the check mark to green which I would have liked to. I wasn&amp;rsquo;t sure how important the type=&amp;ldquo;button&amp;rdquo; was, but &lt;a href="https://www.w3schools.com/TAGs/att_button_type.asp"&gt;w3schools say&lt;/a&gt; to &amp;ldquo;Always&amp;rdquo; use it, so that&amp;rsquo;s good enough for me.&lt;/p&gt;
&lt;p&gt;Having two buttons complicated some of the handling code a bit. In the section where I attach the listeners to the buttons for any items that have been specified in the HTML (which could probably just be removed) it looks a bit hacky:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; links &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;getElementsByTagName&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;&amp;lt;&lt;/span&gt; links&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;length&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; link &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; links&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onListItemClick&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; console&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;assert&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;length &lt;span style="color:#81a1c1"&gt;===&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;item&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnCheck
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;item&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnDelete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using the indexes into the childNodes like this is quite fragile. For example, the indexes change if the buttons in the HTML are separated by a new line character, so something as simple as a linter in the build chain could break it. There&amp;rsquo;s probably a way to get child nodes by tagname (&lt;em&gt;edit: there is - the well named getElementByTagName()&lt;/em&gt;) but concerns about performance, along with laziness associated by knowing I&amp;rsquo;ll probably remove this whole code block prevented me from using it.&lt;/p&gt;
&lt;p&gt;I thought I&amp;rsquo;d reuse the function for clicking on an item for clicking on the check button, but of course the event contains a different caller. So they ended up like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function onListItemClick(event) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if (event.target.tagName === &amp;#34;LI&amp;#34;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; event.target.classList.toggle(&amp;#34;completed&amp;#34;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function onBtnCheck(event) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; event.target.parentNode.classList.toggle(&amp;#34;completed&amp;#34;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The test in onListItemClick() for the tagname is to stop this being triggered as a side effect of clicking with either of the buttons. Worth noting is that the tagname seems always to be in capitals even if it&amp;rsquo;s lowercase in the HTML. Lowercase for tags seems to be the convention so that was surprising to me.&lt;/p&gt;
&lt;p&gt;The code for adding the buttons for new items is pretty straightforward:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function addNewItem&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;txtItem&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;value&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;length &lt;span style="color:#81a1c1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; btnCheck &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createElement&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnCheck&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;innerText &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;✔️&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnCheck&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;type&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnCheck&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;classList&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;add&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;btnCheck&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnCheck&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnCheck
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; btnDelete &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createElement&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnDelete&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;innerText &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;❌&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnDelete&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;type&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnDelete&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;classList&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;add&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;btnDelete&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; btnDelete&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnDelete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; li &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createElement&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;li&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; li&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;appendChild&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;createTextNode&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;txtItem&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; li&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onListItemClick
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; li&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;appendChild&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;btnCheck&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; li&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;appendChild&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;btnDelete&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ulItems&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;appendChild&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;li&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; txtItem&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;value &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the code above I&amp;rsquo;ve used two different methods of inserting the text into an element. One by using the innerText property, and one by creating a TextNode and inserting it with the appendChild() method. In the CWD course, Andrei had commented &amp;ldquo;//Dangerous&amp;rdquo; next to innerText, but hasn&amp;rsquo;t discussed it yet. There&amp;rsquo;s a good discussion &lt;a href="https://marian-caikovski.medium.com/innerhtml-vs-appendchild-e74c763846df"&gt;here from Marian Čaikovski&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another thing I&amp;rsquo;ve got two different versions of in this codebase is adding the event handlers for when things are clicked on. In some places I&amp;rsquo;ve got the succinct, clear onClick =, in others, addEventListener().&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;txtItem&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;addEventListener&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;keydown&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; onKeyPress&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;btnItem&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;addEventListener&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;click&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; addNewItem&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; links &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;getElementsByTagName&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;&amp;lt;&lt;/span&gt; links&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;length&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; link &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; links&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onListItemClick&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; console&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;assert&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;length &lt;span style="color:#81a1c1"&gt;===&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;item&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnCheck
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;childNodes&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;item&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;onclick &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; onBtnDelete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It &lt;a href="https://www.geeksforgeeks.org/difference-between-addeventlistener-and-onclick-in-javascript/"&gt;sounds like&lt;/a&gt; onClick is better supported, but really only a marginal difference. addEventListener can support more than one handler for any particular event, and covers more events.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/IanKulin/iankulin.github.io/tree/main/todo001"&gt;source&lt;/a&gt; for this project, or &lt;a href="https://iankulin.github.io/todo001/"&gt;try it out here&lt;/a&gt;. I should also note that since I&amp;rsquo;m still working on this those might not exactly match the code above.&lt;/p&gt;</description></item></channel></rss>