Giter Site home page Giter Site logo

maximecb / noisecraft Goto Github PK

View Code? Open in Web Editor NEW
1.0K 18.0 59.0 923 KB

Browser-based visual programming language and platform for sound synthesis.

Home Page: https://noisecraft.app

License: GNU General Public License v2.0

JavaScript 90.62% Shell 0.28% HTML 6.80% CSS 2.27% Dockerfile 0.04%
sound audio sound-synthesis music music-programming music-programming-language javascript modular-synthesizers visual-programming-language webaudio

noisecraft's People

Contributors

5mixer avatar alexlitty avatar artaud avatar chrisguttandin avatar johnernstdev avatar maximecb avatar raisch avatar thecrimsonking92 avatar treefrogman avatar victorkochkarev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

noisecraft's Issues

Ability to rename inputs and outputs for individual nodes

One of the issues right now, when creating modules, is that the inputs and outputs get assigned generic names ie in0, in1, out0, out1. This is obviously not very descriptive. If you combine a set of nodes into a module, you might not even know which input is which.

One solution is to allow renaming ins and outs for modules. However, that still has the problem that you might now know which in/out is which when renaming them. So I was thinking, maybe the better solution is to allow renaming ins/outs not just for modules, but for every type of node. That way, before you group nodes into a module, you could rename their ins/outs. Then, when creating the module, it would use the in/out names of the nodes for the in/out names of the module. This would fix the problem of being able to figure out what is what ๐Ÿค”

Add github workflow to test `server.js`

Since we're actively making changes to the server, I think it might make sense to add a GitHub CI workflow to test it.

Something like:

  • Install the dependencies
  • Check that we can start the server
  • Do some simple requests using wget, at least make sure we can get /, /help, /browse without crashing

Help setting this up would be most welcome :)

zoom in and out function using mouse scroll wheel

I am requesting that the ability to zoom in and out using the mouse wheel would greatly enhance the app making it easier to copy and paste / select and move... groups of nodes when creating larger schematics. Also that the darker blue cables are changed to a lighter blue that may be more visible on the majority of computer monitors with their default display settings.. I make barely make out the blue cables with my display settings as it is

Autoscroll when moving nodes outside of window

The editor div will automatically resize to fit all nodes, both when a project is loaded and when nodes are moved outside of the window (see Editor.resize() method). However, ideally, we'd also like to automatically scroll horizontally and vertically to "follow" nodes when they are moved outside the window.

One additional difficulty is that we want to avoid the scrolling going crazily fast when nodes are moved outside the window/viewport. We need this to work smoothly. Probably, we should scroll by the exact number of pixels that a node gets pushed outside the window.

There's an added little wrinkle here that scrolling is going to mess with the way the getMousePos() method operates, because it tries to calculate a position relative to the editor div, whereas for the scrolling, what we really want is deltaX, deltaY in the mouse movement.

Help us improve the /help page

If there's anything you found confusing about NoiseCraft or you think could/should be better documented, you can help us improve the /help page. Either adding new sections, adding more details, or even taking screenshots to use as illustrations.

The help page contents are found in the public/help.html file.

Help page

We're going to eventually need a help page. In Zupiter (NoiseCraft 0.5), the help page was built within the app with HTML, but you couldn't link to it directly because of the single-page app design. With NoiseCraft I want to fix that flaw and have it be its own independent /help URL, with the ability to link to specific subsections (eg: /help#creating-new-nodes).

I was wondering if we should just have the help page be a markdown document in the NoiseCraft GitHub repo that we link people to, because that's really simple. However, the downside of that is, if we ever want to ship NoiseCraft as a standalone electron app, or people want to use it offline, maybe it's better for the help page to be in the app itself. It makes the app more self-contained.

I could also be overanalyzing this problem. Maybe we could start with a GitHub markdown document for the help page, and eventually, if we want to bundle that in the app, we could compile the markdown into HTML. One clear advantage here is that GitHub has a markdown editor that's pretty decent, which makes it easy for users to fix or add things to the document ๐Ÿค”

Node & project state validation

At the moment when editing the parameters of a node, we don't do any validation. We should be validating that parameters like minVal, maxVal and value are all numbers and that minVal <= maxVal. There's also probably more validation to do on the types of other parameters.

Ideally, we would also validate other values in the node state, and reusing this validation code when project sharing requests are made on the server side. We don't need to do much validation when copying and pasting because we just have to assume that browsers on the client-side could be compromised.

This code should be located in model.js, probably in a function we call validateNode(node). We may also want to implement a validateProject(project) for use on the server side. These are to assume plain JSON objects and should be written defensively (assume malicious input is possible).

Debug touch support on tablets/phones

NoiseCraft seems to work well on laptops and desktops, but on my android phone, I can't manage to move a node or select nodes. I don't really get why it doesn't work. The JavaScript pointer API is pretty unintuitive.

I think a fair bit of work would be needed to properly support tablets, for instance, keyboard shortcuts aren't going to be usable on tablets, but it might still be nice to get touch screens and touch devices working better than they are now. For example, if people could at least change the values of knobs on tablets and move nodes, that would be a nice improvement. There are also laptops with touch screens nowadays.

Feature request: ability to run audio server-side

Hi there, great project!
I have a request, though I fear it might be a bit unusual, so feel free to close if it is completely out of scope for the project.

The idea is to allow audio to run on the server side, instead of client side.
Client would act purely as frontend (though since you already have web audio working, could be left as is too), and communicate with the server to setup the nodes, connections etc.

This would allow for example:

  • Able to run it headless
  • Allow integration with other modular tools, if audio running on something like JACK or PipeWire
  • Allow remote instance setup, running on a beefier PC
  • Background processing that does not need a browser tab open/active

If it doesnt fit the project, I understand.
Just thought to ask, in case you see potential in it

MonoSeq (monophonic sequencer) implementation

The basic MonoSeq is working. It can play a 16-step pattern, edit the pattern while it's playing, and highlight the step that's currently playing. However, it's still missing several features:

  • Ability to switch patterns in the editor
  • Ability to queue the next pattern to play
  • Pattern transposition to a new scale
  • Extend/shrink pattern length

Server side API method refactoring proposal.

Hello,

I reviewed the server-side of the project and noticed a few things about how it can be made better.

At the moment, the server has the following supported API endpoints:

GET /public
GET /
GET /:projectId([0-9+])
GET /help
GET /browse
GET /allthestats
POST /register
POST /login
POST /share
GET /browse/:from
GET /get_project/:id
GET /del_project/:id - commented out

I would recommend restructuring project entity-related URLs to match standard REST methods.

GET /get_project/:id -> GET /projects/{project_id} - get project by id

GET /browse/:from -> GET /projects
with the following optional query params - limit, offset. Potentially this method can be used to browse other users projects, but it can be decided in future.

POST /share -> POST /projects. This endpoint can be used just to save the project object.

GET /del_project/:id -> DELETE /projects/{id} - standard method to delete a resourse.

I would be happy to work on these changes.

splitting server.js file

server.js file contains the complete server functionality.
I think it might be a good idea to start splitting it up.
It might be good to move out database initialisation into a separate file.
HTTP method handlers could be grouped into different controllers.

These actions might make the project better organised and more maintainable.

I would be happy to the work.

Node grouping (modules) checklist

A feature that I've been slowly working towards is the ability to group multiple nodes into a user-created module. I think this can unlock a lot of potential for this app because it will help manage the complexity in larger projects, and it will allow people to create custom modules for sounds and sound effects. Modules will also be copyable between projects, so you can imagine something like drum sounds being reused across projects.

This is a list of tasks that need to be completed for this new feature to come together:

  • GroupNodes action
  • Ability to show an error message in the editor, errorDialog()
  • Remove restriction that there can only be a single Notes node
  • #15
  • #19
  • Show error message when trying to group nodes that aren't groupable (i.e. sequencers, scopes)
  • Test that modules interact properly with copy and paste
  • Add some tests/examples that include groups
  • Support for modules in validateProject()

no sound when play is not pressed

I started new module and added few nodes to make basic MIDI synth. It did not make any sound at all.

I found out, that I need to press play to enable sound.

There should be some popup when you try to play midi on your keyboard and sound is stopped.

Colored SVG Play / Stop buttons

Right now there's a Play/Stop button in the top right corner of the app. However, it's just a text link and it's not very noticeable. That means new users often miss it and are left wondering why no audio is being produced.

I think it would make sense to have a green Play button that says "Play โ–ถ" with the right-facing triangle next to it. This button should be replaced by a red "Stop โ–ก" button when playback is started.

The play and stop button graphics should preferably be in SVG format and should have exactly the same width and height.

Get basic audio graph compilation working

I want to get to the point where we can connect a Noise node to an AudioOut and hear some noise. Then I'll work on getting knobs to work along with some basic oscillators. Then after that we can work our way up to more complex nodes like sequencers.

Sequencers are going to require data to flow both ways between the UI and the audio thread. The user will be able to click to turn individual notes/steps on and off. However, the timing logic will be controlled from the audio thread, so the sequencer will need to be able to set its current step from the audio thread.

There are also other nodes like Scope which will need to send data back from the audio thread to the UI thread. We might be able to help the performance of that by limiting updates to once every 50ms and keeping the updates fairly granular. There are also dedicated ArrayBuffers IIRC that can be used to send data back without allocating. I'm hoping we won't have to use that because it would add complexity, but we'll just have to see how everything performs once this is more advanced ๐Ÿค”

ClockIn node (requested by Nicolas Stocker)

This was requested by Nicolas Stocker, one of the biggest users of Zupiter, and so should be prioritized.

This probably needs to be able to select a specific MIDI device to listen to.

There's a special challenge because MIDI can send play/stop messages. These should probably trigger play/stop actions, but the timing is sensitive. Currently, there's a bit of a delay when we start playback, especially on larger projects, because we need to recompile the unit. That makes it difficult to start out in sync. Possibly, we could try to compile the unit before play is clicked, but I would need to check how much time we need to start the audio.

Can you help create drum kit sounds?

Curious to see if someone can create and share a good drum kit sounds on the app. Trying to gather the building blocks so people can create electronic beats :)

Simple kick sound: https://noisecraft.app/53
Another kick sound: https://noisecraft.app/131
Nice clap: https://noisecraft.app/106
Simple snare: https://noisecraft.app/112
Bass drum sound: https://noisecraft.app/215
808-style cowbell: https://noisecraft.app/593

Drum machines:
Other drum sounds: https://noisecraft.app/75
(a or not b)'s drum machine: https://noisecraft.app/203

Popup to explain this works best in Chrome or Edge

We're currently waiting on a Firefox bug to be fixed, and it doesn't yet work in Safari. I'm going to create a popup to tell people who aren't running Chrome or Edge that the app works best in Chrome. That way, we at least set expectations instead of failing silently.

Alternative feedback for edge connections

Prior discussion in this comment.

When an edge connection is created (the moment you click on the "other" port to finalize the connection) there is some visual feedback: The edge color changes from gray to a different non-gray color.

It would be nice to introduce a different kind of visual feedback here, one that doesn't depend on the color, as we'd like to introduce another feature (#11) that conflicts with this.

Install on Windows

You probably don't want this kind of issue on here, but if we're going to perform with this thing we have to be able to install locally.
I've got Node.js installed and npm up to date but the install dependencies step doesn't work.

Looks like the problem is I don't have Python? or sqlite?

--install log

0 verbose cli [
0 verbose cli 'C:\Program Files\nodejs\node.exe',
0 verbose cli 'C:\Users\User\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js',
0 verbose cli 'install'
0 verbose cli ]
1 info using [email protected]
2 info using [email protected]
3 timing npm:load:whichnode Completed in 0ms
4 timing config:load:defaults Completed in 2ms
5 timing config:load:file:C:\Users\User\AppData\Roaming\npm\node_modules\npm\npmrc Completed in 4ms
6 timing config:load:builtin Completed in 4ms
7 timing config:load:cli Completed in 1ms
8 timing config:load:env Completed in 1ms
9 timing config:load:file:C:\laragon\www\noisecraft\noisecraft.npmrc Completed in 0ms
10 timing config:load:project Completed in 1ms
11 timing config:load:file:C:\Users\User.npmrc Completed in 0ms
12 timing config:load:user Completed in 1ms
13 timing config:load:file:C:\Users\User\AppData\Roaming\npm\etc\npmrc Completed in 0ms
14 timing config:load:global Completed in 0ms
15 timing config:load:validate Completed in 0ms
16 timing config:load:credentials Completed in 1ms
17 timing config:load:setEnvs Completed in 1ms
18 timing config:load Completed in 12ms
19 timing npm:load:configload Completed in 13ms
20 timing npm:load:setTitle Completed in 0ms
21 timing config:load:flatten Completed in 3ms
22 timing npm:load:display Completed in 6ms
23 verbose logfile C:\Users\User\AppData\Local\npm-cache_logs\2022-01-02T23_22_13_412Z-debug-0.log
24 timing npm:load:logFile Completed in 7ms
25 timing npm:load:timers Completed in 0ms
26 timing npm:load:configScope Completed in 0ms
27 timing npm:load Completed in 27ms
28 timing arborist:ctor Completed in 1ms
29 timing idealTree:init Completed in 94ms
30 timing idealTree:userRequests Completed in 1ms
31 silly idealTree buildDeps
32 silly fetch manifest nodemon@^2.0.15
33 http fetch GET 200 https://registry.npmjs.org/nodemon 52849ms attempt #2 (cache updated)
34 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.15
35 silly fetch manifest chokidar@^3.5.2
36 silly fetch manifest debug@^3.2.7
37 silly fetch manifest ignore-by-default@^1.0.1
38 silly fetch manifest pstree.remy@^1.1.8
39 silly fetch manifest supports-color@^5.5.0
40 silly fetch manifest touch@^3.1.0
41 silly fetch manifest undefsafe@^2.0.5
42 silly fetch manifest update-notifier@^5.1.0
43 http fetch GET 200 https://registry.npmjs.org/supports-color 175ms (cache revalidated)
44 http fetch GET 200 https://registry.npmjs.org/debug 192ms (cache updated)
45 http fetch GET 200 https://registry.npmjs.org/pstree.remy 199ms (cache revalidated)
46 http fetch GET 200 https://registry.npmjs.org/undefsafe 224ms (cache revalidated)
47 http fetch GET 200 https://registry.npmjs.org/chokidar 230ms (cache revalidated)
48 http fetch GET 200 https://registry.npmjs.org/ignore-by-default 233ms (cache revalidated)
49 http fetch GET 200 https://registry.npmjs.org/touch 234ms (cache revalidated)
50 http fetch GET 200 https://registry.npmjs.org/update-notifier 235ms (cache revalidated)
51 timing idealTree:#root Completed in 53104ms
52 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.5.2
53 silly placeDep node_modules/nodemon [email protected] OK for: [email protected] want: ^3.2.7
54 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.1
55 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.8
56 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.5.0
57 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.0
58 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.5
59 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.1.0
60 silly fetch manifest anymatch@~3.1.2
61 silly fetch manifest braces@~3.0.2
62 silly fetch manifest glob-parent@~5.1.2
63 silly fetch manifest is-binary-path@~2.1.0
64 silly fetch manifest is-glob@~4.0.1
65 silly fetch manifest normalize-path@~3.0.0
66 silly fetch manifest readdirp@~3.6.0
67 silly fetch manifest fsevents@~2.3.2
68 silly fetch manifest ms@^2.1.1
69 silly fetch manifest has-flag@^3.0.0
70 silly fetch manifest nopt@~1.0.10
71 silly fetch manifest boxen@^5.0.0
72 silly fetch manifest chalk@^4.1.0
73 silly fetch manifest configstore@^5.0.1
74 silly fetch manifest has-yarn@^2.1.0
75 silly fetch manifest import-lazy@^2.1.0
76 silly fetch manifest is-ci@^2.0.0
77 silly fetch manifest is-installed-globally@^0.4.0
78 silly fetch manifest is-npm@^5.0.0
79 silly fetch manifest is-yarn-global@^0.3.0
80 silly fetch manifest latest-version@^5.1.0
81 silly fetch manifest pupa@^2.1.1
82 silly fetch manifest semver@^7.3.4
83 silly fetch manifest semver-diff@^3.1.1
84 silly fetch manifest xdg-basedir@^4.0.0
85 http fetch GET 200 https://registry.npmjs.org/glob-parent 164ms (cache revalidated)
86 http fetch GET 200 https://registry.npmjs.org/readdirp 163ms (cache revalidated)
87 http fetch GET 200 https://registry.npmjs.org/anymatch 167ms (cache revalidated)
88 http fetch GET 200 https://registry.npmjs.org/braces 166ms (cache revalidated)
89 http fetch GET 200 https://registry.npmjs.org/normalize-path 166ms (cache revalidated)
90 http fetch GET 200 https://registry.npmjs.org/nopt 165ms (cache revalidated)
91 http fetch GET 200 https://registry.npmjs.org/boxen 166ms (cache revalidated)
92 http fetch GET 200 https://registry.npmjs.org/is-binary-path 176ms (cache revalidated)
93 http fetch GET 200 https://registry.npmjs.org/pupa 171ms (cache revalidated)
94 http fetch GET 200 https://registry.npmjs.org/latest-version 174ms (cache revalidated)
95 http fetch GET 200 https://registry.npmjs.org/is-npm 175ms (cache revalidated)
96 http fetch GET 200 https://registry.npmjs.org/is-yarn-global 175ms (cache revalidated)
97 http fetch GET 200 https://registry.npmjs.org/is-installed-globally 176ms (cache revalidated)
98 http fetch GET 200 https://registry.npmjs.org/fsevents 184ms (cache revalidated)
99 http fetch GET 200 https://registry.npmjs.org/has-yarn 181ms (cache revalidated)
100 http fetch GET 200 https://registry.npmjs.org/semver 182ms (cache revalidated)
101 http fetch GET 200 https://registry.npmjs.org/semver-diff 185ms (cache revalidated)
102 http fetch GET 200 https://registry.npmjs.org/xdg-basedir 184ms (cache revalidated)
103 http fetch GET 200 https://registry.npmjs.org/chalk 196ms (cache revalidated)
104 http fetch GET 200 https://registry.npmjs.org/configstore 196ms (cache revalidated)
105 http fetch GET 200 https://registry.npmjs.org/ms 201ms (cache revalidated)
106 http fetch GET 200 https://registry.npmjs.org/has-flag 200ms (cache revalidated)
107 http fetch GET 200 https://registry.npmjs.org/is-glob 205ms (cache revalidated)
108 http fetch GET 200 https://registry.npmjs.org/import-lazy 200ms (cache revalidated)
109 http fetch GET 200 https://registry.npmjs.org/is-ci 1056ms (cache revalidated)
110 timing idealTree:node_modules/nodemon Completed in 1078ms
111 silly placeDep ROOT [email protected] OK for: [email protected] want: ~3.1.2
112 silly placeDep ROOT [email protected] OK for: [email protected] want: ~3.0.2
113 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.3.2
114 silly placeDep ROOT [email protected] OK for: [email protected] want: ~5.1.2
115 silly placeDep ROOT [email protected] OK for: [email protected] want: ~2.1.0
116 silly placeDep ROOT [email protected] OK for: [email protected] want: ~4.0.1
117 silly placeDep ROOT [email protected] OK for: [email protected] want: ~3.0.0
118 silly placeDep ROOT [email protected] OK for: [email protected] want: ~3.6.0
119 silly fetch manifest picomatch@^2.0.4
120 silly fetch manifest fill-range@^7.0.1
121 silly fetch manifest binary-extensions@^2.0.0
122 silly fetch manifest is-extglob@^2.1.1
123 silly fetch manifest picomatch@^2.2.1
124 http fetch GET 200 https://registry.npmjs.org/binary-extensions 59ms (cache revalidated)
125 http fetch GET 200 https://registry.npmjs.org/is-extglob 60ms (cache revalidated)
126 http fetch GET 200 https://registry.npmjs.org/fill-range 87ms (cache revalidated)
127 http fetch GET 200 https://registry.npmjs.org/picomatch 91ms (cache updated)
128 timing idealTree:node_modules/chokidar Completed in 109ms
129 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.4
130 timing idealTree:node_modules/anymatch Completed in 1ms
131 silly placeDep ROOT [email protected] OK for: [email protected] want: ^7.0.1
132 silly fetch manifest to-regex-range@^5.0.1
133 http fetch GET 200 https://registry.npmjs.org/to-regex-range 44ms (cache revalidated)
134 timing idealTree:node_modules/braces Completed in 47ms
135 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.0.1
136 silly fetch manifest is-number@^7.0.0
137 http fetch GET 200 https://registry.npmjs.org/is-number 38ms (cache revalidated)
138 timing idealTree:node_modules/fill-range Completed in 41ms
139 timing idealTree:node_modules/fsevents Completed in 0ms
140 timing idealTree:node_modules/glob-parent Completed in 0ms
141 timing idealTree:node_modules/ignore-by-default Completed in 0ms
142 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
143 timing idealTree:node_modules/is-binary-path Completed in 1ms
144 timing idealTree:node_modules/binary-extensions Completed in 0ms
145 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.1
146 timing idealTree:node_modules/is-glob Completed in 1ms
147 timing idealTree:node_modules/is-extglob Completed in 0ms
148 timing idealTree:node_modules/normalize-path Completed in 0ms
149 timing idealTree:node_modules/picomatch Completed in 0ms
150 timing idealTree:node_modules/pstree.remy Completed in 0ms
151 timing idealTree:node_modules/readdirp Completed in 0ms
152 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
153 timing idealTree:node_modules/supports-color Completed in 0ms
154 timing idealTree:node_modules/has-flag Completed in 0ms
155 silly placeDep ROOT [email protected] OK for: [email protected] want: ^7.0.0
156 timing idealTree:node_modules/to-regex-range Completed in 0ms
157 timing idealTree:node_modules/is-number Completed in 0ms
158 silly placeDep node_modules/touch [email protected] OK for: [email protected] want: ~1.0.10
159 timing idealTree:node_modules/touch Completed in 1ms
160 timing idealTree:node_modules/undefsafe Completed in 0ms
161 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.0.0
162 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.0
163 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.0.1
164 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.0
165 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.0
166 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
167 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.4.0
168 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.0.0
169 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.3.0
170 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.1.0
171 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.1.1
172 silly placeDep node_modules/update-notifier [email protected] OK for: [email protected] want: ^7.3.4
173 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.1
174 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.0
175 silly fetch manifest ansi-align@^3.0.0
176 silly fetch manifest camelcase@^6.2.0
177 silly fetch manifest cli-boxes@^2.2.1
178 silly fetch manifest string-width@^4.2.2
179 silly fetch manifest type-fest@^0.20.2
180 silly fetch manifest widest-line@^3.1.0
181 silly fetch manifest wrap-ansi@^7.0.0
182 silly fetch manifest ansi-styles@^4.1.0
183 silly fetch manifest supports-color@^7.1.0
184 silly fetch manifest dot-prop@^5.2.0
185 silly fetch manifest graceful-fs@^4.1.2
186 silly fetch manifest make-dir@^3.0.0
187 silly fetch manifest unique-string@^2.0.0
188 silly fetch manifest write-file-atomic@^3.0.0
189 silly fetch manifest ci-info@^2.0.0
190 silly fetch manifest global-dirs@^3.0.0
191 silly fetch manifest is-path-inside@^3.0.2
192 silly fetch manifest package-json@^6.3.0
193 silly fetch manifest escape-goat@^2.0.0
194 silly fetch manifest lru-cache@^6.0.0
195 silly fetch manifest semver@^6.3.0
196 http fetch GET 200 https://registry.npmjs.org/ansi-align 451ms (cache revalidated)
197 http fetch GET 200 https://registry.npmjs.org/widest-line 448ms (cache revalidated)
198 http fetch GET 200 https://registry.npmjs.org/string-width 450ms (cache revalidated)
199 http fetch GET 200 https://registry.npmjs.org/cli-boxes 451ms (cache revalidated)
200 http fetch GET 200 https://registry.npmjs.org/escape-goat 441ms (cache revalidated)
201 http fetch GET 200 https://registry.npmjs.org/ansi-styles 449ms (cache revalidated)
202 http fetch GET 200 https://registry.npmjs.org/unique-string 447ms (cache revalidated)
203 http fetch GET 200 https://registry.npmjs.org/make-dir 449ms (cache revalidated)
204 http fetch GET 200 https://registry.npmjs.org/type-fest 453ms (cache revalidated)
205 http fetch GET 200 https://registry.npmjs.org/dot-prop 454ms (cache revalidated)
206 http fetch GET 200 https://registry.npmjs.org/wrap-ansi 456ms (cache revalidated)
207 http fetch GET 200 https://registry.npmjs.org/package-json 449ms (cache revalidated)
208 http fetch GET 200 https://registry.npmjs.org/graceful-fs 456ms (cache revalidated)
209 http fetch GET 200 https://registry.npmjs.org/ci-info 454ms (cache revalidated)
210 http fetch GET 200 https://registry.npmjs.org/write-file-atomic 463ms (cache revalidated)
211 http fetch GET 200 https://registry.npmjs.org/camelcase 471ms (cache updated)
212 http fetch GET 200 https://registry.npmjs.org/lru-cache 459ms (cache revalidated)
213 http fetch GET 200 https://registry.npmjs.org/global-dirs 1039ms (cache revalidated)
214 http fetch GET 200 https://registry.npmjs.org/is-path-inside 1045ms (cache revalidated)
215 timing idealTree:node_modules/update-notifier Completed in 1070ms
216 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
217 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.2.0
218 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.2.1
219 silly placeDep node_modules/boxen [email protected] OK for: [email protected] want: ^4.2.2
220 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.20.2
221 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.0
222 silly placeDep ROOT [email protected] OK for: [email protected] want: ^7.0.0
223 silly fetch manifest string-width@^4.1.0
224 silly fetch manifest emoji-regex@^8.0.0
225 silly fetch manifest is-fullwidth-code-point@^3.0.0
226 silly fetch manifest strip-ansi@^6.0.1
227 silly fetch manifest string-width@^4.0.0
228 silly fetch manifest ansi-styles@^4.0.0
229 silly fetch manifest strip-ansi@^6.0.0
230 http fetch GET 200 https://registry.npmjs.org/emoji-regex 39ms (cache revalidated)
231 http fetch GET 200 https://registry.npmjs.org/strip-ansi 56ms (cache revalidated)
232 http fetch GET 200 https://registry.npmjs.org/is-fullwidth-code-point 59ms (cache revalidated)
233 timing idealTree:node_modules/boxen Completed in 74ms
234 silly placeDep node_modules/ansi-align [email protected] OK for: [email protected] want: ^4.1.0
235 timing idealTree:node_modules/ansi-align Completed in 2ms
236 timing idealTree:node_modules/camelcase Completed in 0ms
237 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.0
238 silly placeDep node_modules/chalk [email protected] OK for: [email protected] want: ^7.1.0
239 silly fetch manifest color-convert@^2.0.1
240 silly fetch manifest has-flag@^4.0.0
241 http fetch GET 200 https://registry.npmjs.org/color-convert 37ms (cache revalidated)
242 timing idealTree:node_modules/chalk Completed in 41ms
243 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.1
244 silly fetch manifest color-name@~1.1.4
245 http fetch GET 200 https://registry.npmjs.org/color-name 43ms (cache revalidated)
246 timing idealTree:node_modules/ansi-styles Completed in 45ms
247 timing idealTree:node_modules/cli-boxes Completed in 0ms
248 silly placeDep ROOT [email protected] OK for: [email protected] want: ~1.1.4
249 timing idealTree:node_modules/color-convert Completed in 1ms
250 timing idealTree:node_modules/color-name Completed in 0ms
251 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.2.0
252 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.2
253 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
254 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
255 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
256 silly fetch manifest is-obj@^2.0.0
257 silly fetch manifest semver@^6.0.0
258 silly fetch manifest crypto-random-string@^2.0.0
259 silly fetch manifest imurmurhash@^0.1.4
260 silly fetch manifest is-typedarray@^1.0.0
261 silly fetch manifest typedarray-to-buffer@^3.1.5
262 http fetch GET 200 https://registry.npmjs.org/is-obj 48ms (cache revalidated)
263 http fetch GET 200 https://registry.npmjs.org/imurmurhash 57ms (cache revalidated)
264 http fetch GET 200 https://registry.npmjs.org/crypto-random-string 60ms (cache revalidated)
265 http fetch GET 200 https://registry.npmjs.org/typedarray-to-buffer 58ms (cache revalidated)
266 http fetch GET 200 https://registry.npmjs.org/is-typedarray 62ms (cache revalidated)
267 timing idealTree:node_modules/configstore Completed in 69ms
268 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
269 timing idealTree:node_modules/dot-prop Completed in 2ms
270 timing idealTree:node_modules/graceful-fs Completed in 0ms
271 timing idealTree:node_modules/has-yarn Completed in 0ms
272 timing idealTree:node_modules/import-lazy Completed in 0ms
273 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
274 timing idealTree:node_modules/is-ci Completed in 1ms
275 timing idealTree:node_modules/ci-info Completed in 0ms
276 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
277 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.2
278 silly fetch manifest [email protected]
279 http fetch GET 200 https://registry.npmjs.org/ini 56ms (cache revalidated)
280 timing idealTree:node_modules/is-installed-globally Completed in 59ms
281 silly placeDep node_modules/global-dirs [email protected] OK for: [email protected] want: 2.0.0
282 timing idealTree:node_modules/global-dirs Completed in 2ms
283 timing idealTree:node_modules/is-npm Completed in 0ms
284 timing idealTree:node_modules/is-obj Completed in 0ms
285 timing idealTree:node_modules/is-path-inside Completed in 0ms
286 timing idealTree:node_modules/is-yarn-global Completed in 0ms
287 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.3.0
288 silly fetch manifest got@^9.6.0
289 silly fetch manifest registry-auth-token@^4.0.0
290 silly fetch manifest registry-url@^5.0.0
291 silly fetch manifest semver@^6.2.0
292 http fetch GET 200 https://registry.npmjs.org/registry-url 39ms (cache revalidated)
293 http fetch GET 200 https://registry.npmjs.org/got 46ms (cache revalidated)
294 http fetch GET 200 https://registry.npmjs.org/registry-auth-token 51ms (cache revalidated)
295 timing idealTree:node_modules/latest-version Completed in 54ms
296 silly placeDep node_modules/make-dir [email protected] OK for: [email protected] want: ^6.0.0
297 timing idealTree:node_modules/make-dir Completed in 1ms
298 silly placeDep ROOT [email protected] OK for: [email protected] want: ^9.6.0
299 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.0
300 silly placeDep ROOT [email protected] OK for: [email protected] want: ^5.0.0
301 silly placeDep node_modules/package-json [email protected] OK for: [email protected] want: ^6.2.0
302 silly fetch manifest @sindresorhus/is@^0.14.0
303 silly fetch manifest @szmarczak/http-timer@^1.1.2
304 silly fetch manifest cacheable-request@^6.0.0
305 silly fetch manifest decompress-response@^3.3.0
306 silly fetch manifest duplexer3@^0.1.4
307 silly fetch manifest get-stream@^4.1.0
308 silly fetch manifest lowercase-keys@^1.0.1
309 silly fetch manifest mimic-response@^1.0.1
310 silly fetch manifest p-cancelable@^1.0.0
311 silly fetch manifest to-readable-stream@^1.0.0
312 silly fetch manifest url-parse-lax@^3.0.0
313 http fetch GET 200 https://registry.npmjs.org/url-parse-lax 128ms (cache revalidated)
314 http fetch GET 200 https://registry.npmjs.org/get-stream 133ms (cache revalidated)
315 http fetch GET 200 https://registry.npmjs.org/cacheable-request 137ms (cache revalidated)
316 http fetch GET 200 https://registry.npmjs.org/duplexer3 137ms (cache revalidated)
317 http fetch GET 200 https://registry.npmjs.org/lowercase-keys 138ms (cache revalidated)
318 http fetch GET 200 https://registry.npmjs.org/decompress-response 140ms (cache revalidated)
319 http fetch GET 200 https://registry.npmjs.org/p-cancelable 140ms (cache revalidated)
320 http fetch GET 200 https://registry.npmjs.org/to-readable-stream 140ms (cache revalidated)
321 http fetch GET 200 https://registry.npmjs.org/mimic-response 146ms (cache revalidated)
322 http fetch GET 200 https://registry.npmjs.org/@szmarczak%2fhttp-timer 153ms (cache revalidated)
323 http fetch GET 200 https://registry.npmjs.org/@sindresorhus%2fis 156ms (cache revalidated)
324 timing idealTree:node_modules/package-json Completed in 165ms
325 silly placeDep ROOT @sindresorhus/[email protected] OK for: [email protected] want: ^0.14.0
326 silly placeDep ROOT @szmarczak/[email protected] OK for: [email protected] want: ^1.1.2
327 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.0.0
328 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.3.0
329 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.1.4
330 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.0
331 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.1
332 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.1
333 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
334 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
335 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
336 silly fetch manifest defer-to-connect@^1.0.1
337 silly fetch manifest clone-response@^1.0.2
338 silly fetch manifest get-stream@^5.1.0
339 silly fetch manifest http-cache-semantics@^4.0.0
340 silly fetch manifest keyv@^3.0.0
341 silly fetch manifest lowercase-keys@^2.0.0
342 silly fetch manifest normalize-url@^4.1.0
343 silly fetch manifest responselike@^1.0.2
344 silly fetch manifest pump@^3.0.0
345 silly fetch manifest prepend-http@^2.0.0
346 http fetch GET 200 https://registry.npmjs.org/responselike 62ms (cache revalidated)
347 http fetch GET 200 https://registry.npmjs.org/http-cache-semantics 66ms (cache revalidated)
348 http fetch GET 200 https://registry.npmjs.org/keyv 67ms (cache revalidated)
349 http fetch GET 200 https://registry.npmjs.org/prepend-http 65ms (cache revalidated)
350 http fetch GET 200 https://registry.npmjs.org/pump 68ms (cache revalidated)
351 http fetch GET 200 https://registry.npmjs.org/clone-response 72ms (cache revalidated)
352 http fetch GET 200 https://registry.npmjs.org/defer-to-connect 75ms (cache revalidated)
353 http fetch GET 200 https://registry.npmjs.org/normalize-url 76ms (cache revalidated)
354 timing idealTree:node_modules/got Completed in 89ms
355 timing idealTree:node_modules/@sindresorhus/is Completed in 0ms
356 silly placeDep ROOT [email protected] OK for: @szmarczak/[email protected] want: ^1.0.1
357 timing idealTree:node_modules/@szmarczak/http-timer Completed in 1ms
358 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.2
359 silly placeDep node_modules/cacheable-request [email protected] OK for: [email protected] want: ^5.1.0
360 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.0.0
361 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
362 silly placeDep node_modules/cacheable-request [email protected] OK for: [email protected] want: ^2.0.0
363 silly placeDep ROOT [email protected] OK for: [email protected] want: ^4.1.0
364 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.2
365 silly fetch manifest [email protected]
366 http fetch GET 200 https://registry.npmjs.org/json-buffer 44ms (cache revalidated)
367 timing idealTree:node_modules/cacheable-request Completed in 54ms
368 timing idealTree:node_modules/clone-response Completed in 0ms
369 timing idealTree:node_modules/decompress-response Completed in 0ms
370 timing idealTree:node_modules/defer-to-connect Completed in 0ms
371 timing idealTree:node_modules/duplexer3 Completed in 0ms
372 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.0.0
373 silly fetch manifest end-of-stream@^1.1.0
374 http fetch GET 200 https://registry.npmjs.org/end-of-stream 57ms (cache revalidated)
375 timing idealTree:node_modules/get-stream Completed in 59ms
376 timing idealTree:node_modules/http-cache-semantics Completed in 0ms
377 silly placeDep ROOT [email protected] OK for: [email protected] want: 3.0.0
378 timing idealTree:node_modules/keyv Completed in 3ms
379 timing idealTree:node_modules/json-buffer Completed in 0ms
380 timing idealTree:node_modules/lowercase-keys Completed in 0ms
381 timing idealTree:node_modules/mimic-response Completed in 0ms
382 timing idealTree:node_modules/normalize-url Completed in 0ms
383 timing idealTree:node_modules/p-cancelable Completed in 0ms
384 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.1.0
385 timing idealTree:node_modules/pump Completed in 1ms
386 timing idealTree:node_modules/end-of-stream Completed in 0ms
387 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
388 timing idealTree:node_modules/pupa Completed in 0ms
389 timing idealTree:node_modules/escape-goat Completed in 0ms
390 timing idealTree:node_modules/registry-auth-token Completed in 0ms
391 timing idealTree:node_modules/registry-url Completed in 0ms
392 timing idealTree:node_modules/responselike Completed in 0ms
393 silly placeDep node_modules/semver-diff [email protected] OK for: [email protected] want: ^6.3.0
394 timing idealTree:node_modules/semver-diff Completed in 1ms
395 timing idealTree:node_modules/to-readable-stream Completed in 0ms
396 timing idealTree:node_modules/type-fest Completed in 0ms
397 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
398 timing idealTree:node_modules/unique-string Completed in 1ms
399 timing idealTree:node_modules/crypto-random-string Completed in 0ms
400 silly placeDep ROOT [email protected] OK for: [email protected] want: ^2.0.0
401 timing idealTree:node_modules/url-parse-lax Completed in 1ms
402 timing idealTree:node_modules/prepend-http Completed in 0ms
403 silly placeDep node_modules/widest-line [email protected] OK for: [email protected] want: ^4.0.0
404 timing idealTree:node_modules/widest-line Completed in 1ms
405 silly placeDep node_modules/wrap-ansi [email protected] OK for: [email protected] want: ^4.1.0
406 silly placeDep node_modules/wrap-ansi [email protected] OK for: [email protected] want: ^6.0.0
407 silly fetch manifest ansi-regex@^5.0.1
408 http fetch GET 200 https://registry.npmjs.org/ansi-regex 39ms (cache revalidated)
409 timing idealTree:node_modules/wrap-ansi Completed in 44ms
410 silly placeDep ROOT [email protected] OK for: [email protected] want: ^0.1.4
411 silly placeDep ROOT [email protected] OK for: [email protected] want: ^1.0.0
412 silly placeDep ROOT [email protected] OK for: [email protected] want: ^3.1.5
413 timing idealTree:node_modules/write-file-atomic Completed in 3ms
414 timing idealTree:node_modules/imurmurhash Completed in 0ms
415 timing idealTree:node_modules/is-typedarray Completed in 0ms
416 timing idealTree:node_modules/typedarray-to-buffer Completed in 0ms
417 timing idealTree:node_modules/xdg-basedir Completed in 0ms
418 silly placeDep ROOT [email protected] OK for: [email protected] want: ^8.0.0
419 silly placeDep node_modules/ansi-align [email protected] OK for: [email protected] want: ^3.0.0
420 silly placeDep node_modules/ansi-align [email protected] OK for: [email protected] want: ^6.0.1
421 timing idealTree:node_modules/ansi-align/node_modules/string-width Completed in 4ms
422 timing idealTree:node_modules/emoji-regex Completed in 0ms
423 timing idealTree:node_modules/ansi-align/node_modules/is-fullwidth-code-point Completed in 0ms
424 silly placeDep node_modules/ansi-align [email protected] OK for: [email protected] want: ^5.0.1
425 timing idealTree:node_modules/ansi-align/node_modules/strip-ansi Completed in 1ms
426 timing idealTree:node_modules/ansi-align/node_modules/ansi-regex Completed in 0ms
427 silly placeDep node_modules/boxen [email protected] OK for: [email protected] want: ^3.0.0
428 silly placeDep node_modules/boxen [email protected] OK for: [email protected] want: ^6.0.1
429 timing idealTree:node_modules/boxen/node_modules/string-width Completed in 2ms
430 timing idealTree:node_modules/boxen/node_modules/is-fullwidth-code-point Completed in 0ms
431 silly placeDep node_modules/boxen [email protected] OK for: [email protected] want: ^5.0.1
432 timing idealTree:node_modules/boxen/node_modules/strip-ansi Completed in 0ms
433 timing idealTree:node_modules/boxen/node_modules/ansi-regex Completed in 0ms
434 timing idealTree:node_modules/cacheable-request/node_modules/get-stream Completed in 0ms
435 timing idealTree:node_modules/cacheable-request/node_modules/lowercase-keys Completed in 0ms
436 silly placeDep node_modules/chalk [email protected] OK for: [email protected] want: ^4.0.0
437 timing idealTree:node_modules/chalk/node_modules/supports-color Completed in 0ms
438 timing idealTree:node_modules/chalk/node_modules/has-flag Completed in 0ms
439 timing idealTree:node_modules/global-dirs/node_modules/ini Completed in 0ms
440 timing idealTree:node_modules/make-dir/node_modules/semver Completed in 0ms
441 silly placeDep node_modules/nodemon [email protected] OK for: [email protected] want: ^2.1.1
442 timing idealTree:node_modules/nodemon/node_modules/debug Completed in 0ms
443 timing idealTree:node_modules/nodemon/node_modules/ms Completed in 0ms
444 timing idealTree:node_modules/package-json/node_modules/semver Completed in 0ms
445 timing idealTree:node_modules/semver-diff/node_modules/semver Completed in 0ms
446 timing idealTree:node_modules/touch/node_modules/nopt Completed in 0ms
447 silly placeDep ROOT [email protected] OK for: [email protected] want: ^6.0.0
448 silly fetch manifest yallist@^4.0.0
449 http fetch GET 200 https://registry.npmjs.org/yallist 139ms (cache revalidated)
450 timing idealTree:node_modules/update-notifier/node_modules/semver Completed in 142ms
451 silly placeDep node_modules/lru-cache [email protected] OK for: [email protected] want: ^4.0.0
452 timing idealTree:node_modules/lru-cache Completed in 4ms
453 timing idealTree:node_modules/lru-cache/node_modules/yallist Completed in 0ms
454 silly placeDep node_modules/widest-line [email protected] OK for: [email protected] want: ^3.0.0
455 silly placeDep node_modules/widest-line [email protected] OK for: [email protected] want: ^6.0.1
456 timing idealTree:node_modules/widest-line/node_modules/string-width Completed in 5ms
457 timing idealTree:node_modules/widest-line/node_modules/is-fullwidth-code-point Completed in 0ms
458 silly placeDep node_modules/widest-line [email protected] OK for: [email protected] want: ^5.0.1
459 timing idealTree:node_modules/widest-line/node_modules/strip-ansi Completed in 2ms
460 timing idealTree:node_modules/widest-line/node_modules/ansi-regex Completed in 0ms
461 silly placeDep node_modules/wrap-ansi [email protected] OK for: [email protected] want: ^3.0.0
462 timing idealTree:node_modules/wrap-ansi/node_modules/string-width Completed in 1ms
463 timing idealTree:node_modules/wrap-ansi/node_modules/is-fullwidth-code-point Completed in 0ms
464 silly placeDep node_modules/wrap-ansi [email protected] OK for: [email protected] want: ^5.0.1
465 timing idealTree:node_modules/wrap-ansi/node_modules/strip-ansi Completed in 1ms
466 timing idealTree:node_modules/wrap-ansi/node_modules/ansi-regex Completed in 0ms
467 timing idealTree:buildDeps Completed in 56406ms
468 timing idealTree:fixDepFlags Completed in 4ms
469 timing idealTree Completed in 56509ms
470 timing reify:loadTrees Completed in 56510ms
471 timing reify:diffTrees Completed in 5ms
472 silly reify moves {}
473 timing reify:retireShallow Completed in 1ms
474 timing reify:createSparse Completed in 107ms
475 timing reify:loadBundles Completed in 0ms
476 silly audit bulk request {
476 silly audit abbrev: [ '1.1.1' ],
476 silly audit accepts: [ '1.3.7' ],
476 silly audit 'ansi-regex': [ '2.1.1', '5.0.1' ],
476 silly audit aproba: [ '1.2.0' ],
476 silly audit 'are-we-there-yet': [ '1.1.7' ],
476 silly audit 'array-flatten': [ '1.1.1' ],
476 silly audit 'balanced-match': [ '1.0.2' ],
476 silly audit 'base64-js': [ '1.5.1' ],
476 silly audit 'body-parser': [ '1.19.0' ],
476 silly audit 'brace-expansion': [ '1.1.11' ],
476 silly audit buffer: [ '5.7.1' ],
476 silly audit bytes: [ '3.1.0' ],
476 silly audit chownr: [ '1.1.4' ],
476 silly audit 'code-point-at': [ '1.1.0' ],
476 silly audit 'concat-map': [ '0.0.1' ],
476 silly audit 'console-control-strings': [ '1.1.0' ],
476 silly audit 'content-disposition': [ '0.5.3' ],
476 silly audit 'content-type': [ '1.0.4' ],
476 silly audit cookie: [ '0.4.0' ],
476 silly audit 'cookie-signature': [ '1.0.6' ],
476 silly audit 'core-util-is': [ '1.0.3' ],
476 silly audit crc: [ '3.8.0' ],
476 silly audit debug: [ '2.6.9', '3.2.7' ],
476 silly audit 'deep-extend': [ '0.6.0' ],
476 silly audit delegates: [ '1.0.0' ],
476 silly audit depd: [ '1.1.2' ],
476 silly audit destroy: [ '1.0.4' ],
476 silly audit 'detect-libc': [ '1.0.3' ],
476 silly audit 'ee-first': [ '1.1.1' ],
476 silly audit encodeurl: [ '1.0.2' ],
476 silly audit 'escape-html': [ '1.0.3' ],
476 silly audit etag: [ '1.8.1' ],
476 silly audit express: [ '4.17.1' ],
476 silly audit finalhandler: [ '1.1.2' ],
476 silly audit forwarded: [ '0.2.0' ],
476 silly audit fresh: [ '0.5.2' ],
476 silly audit 'fs-minipass': [ '1.2.7' ],
476 silly audit 'fs.realpath': [ '1.0.0' ],
476 silly audit gauge: [ '2.7.4' ],
476 silly audit glob: [ '7.1.7' ],
476 silly audit 'has-unicode': [ '2.0.1' ],
476 silly audit 'http-errors': [ '1.7.2' ],
476 silly audit 'iconv-lite': [ '0.4.24' ],
476 silly audit ieee754: [ '1.2.1' ],
476 silly audit 'ignore-walk': [ '3.0.4' ],
476 silly audit inflight: [ '1.0.6' ],
476 silly audit inherits: [ '2.0.3' ],
476 silly audit ini: [ '1.3.8', '2.0.0' ],
476 silly audit 'ipaddr.js': [ '1.9.1' ],
476 silly audit 'is-fullwidth-code-point': [ '1.0.0', '3.0.0' ],
476 silly audit isarray: [ '1.0.0' ],
476 silly audit 'media-typer': [ '0.3.0' ],
476 silly audit 'merge-descriptors': [ '1.0.1' ],
476 silly audit methods: [ '1.1.2' ],
476 silly audit mime: [ '1.6.0' ],
476 silly audit 'mime-db': [ '1.49.0' ],
476 silly audit 'mime-types': [ '2.1.32' ],
476 silly audit minimatch: [ '3.0.4' ],
476 silly audit minimist: [ '1.2.5' ],
476 silly audit minipass: [ '2.9.0' ],
476 silly audit minizlib: [ '1.3.3' ],
476 silly audit mkdirp: [ '0.5.5' ],
476 silly audit ms: [ '2.0.0', '2.1.3', '2.1.1' ],
476 silly audit nan: [ '2.15.0' ],
476 silly audit needle: [ '2.9.1' ],
476 silly audit negotiator: [ '0.6.2' ],
476 silly audit 'node-pre-gyp': [ '0.11.0' ],
476 silly audit nopt: [ '4.0.3', '1.0.10' ],
476 silly audit 'npm-bundled': [ '1.1.2' ],
476 silly audit 'npm-normalize-package-bin': [ '1.0.1' ],
476 silly audit 'npm-packlist': [ '1.4.8' ],
476 silly audit npmlog: [ '4.1.2' ],
476 silly audit 'number-is-nan': [ '1.0.1' ],
476 silly audit 'object-assign': [ '4.1.1' ],
476 silly audit 'on-finished': [ '2.3.0' ],
476 silly audit once: [ '1.4.0' ],
476 silly audit 'os-homedir': [ '1.0.2' ],
476 silly audit 'os-tmpdir': [ '1.0.2' ],
476 silly audit osenv: [ '0.1.5' ],
476 silly audit parseurl: [ '1.3.3' ],
476 silly audit 'path-is-absolute': [ '1.0.1' ],
476 silly audit 'path-to-regexp': [ '0.1.7' ],
476 silly audit 'process-nextick-args': [ '2.0.1' ],
476 silly audit 'proxy-addr': [ '2.0.7' ],
476 silly audit qs: [ '6.7.0' ],
476 silly audit 'range-parser': [ '1.2.1' ],
476 silly audit 'raw-body': [ '2.4.0' ],
476 silly audit rc: [ '1.2.8' ],
476 silly audit 'readable-stream': [ '2.3.7' ],
476 silly audit rimraf: [ '2.7.1' ],
476 silly audit 'safe-buffer': [ '5.1.2', '5.2.1' ],
476 silly audit 'safer-buffer': [ '2.1.2' ],
476 silly audit sax: [ '1.2.4' ],
476 silly audit semver: [ '5.7.1', '7.3.5', '6.3.0' ],
476 silly audit send: [ '0.17.1' ],
476 silly audit 'serve-static': [ '1.14.1' ],
476 silly audit 'set-blocking': [ '2.0.0' ],
476 silly audit setprototypeof: [ '1.1.1' ],
476 silly audit 'signal-exit': [ '3.0.3' ],
476 silly audit sqlite3: [ '4.2.0' ],
476 silly audit statuses: [ '1.5.0' ],
476 silly audit string_decoder: [ '1.1.1' ],
476 silly audit 'string-width': [ '1.0.2', '4.2.3' ],
476 silly audit 'strip-ansi': [ '3.0.1', '6.0.1' ],
476 silly audit 'strip-json-comments': [ '2.0.1' ],
476 silly audit tar: [ '4.4.19' ],
476 silly audit toidentifier: [ '1.0.0' ],
476 silly audit 'type-is': [ '1.6.18' ],
476 silly audit unpipe: [ '1.0.0' ],
476 silly audit 'util-deprecate': [ '1.0.2' ],
476 silly audit 'utils-merge': [ '1.0.1' ],
476 silly audit vary: [ '1.1.2' ],
476 silly audit vhost: [ '3.0.2' ],
476 silly audit 'wide-align': [ '1.1.3' ],
476 silly audit wrappy: [ '1.0.2' ],
476 silly audit yallist: [ '3.1.1', '4.0.0' ],
476 silly audit nodemon: [ '2.0.15' ],
476 silly audit chokidar: [ '3.5.2' ],
476 silly audit 'ignore-by-default': [ '1.0.1' ],
476 silly audit 'pstree.remy': [ '1.1.8' ],
476 silly audit 'supports-color': [ '5.5.0', '7.2.0' ],
476 silly audit touch: [ '3.1.0' ],
476 silly audit undefsafe: [ '2.0.5' ],
476 silly audit 'update-notifier': [ '5.1.0' ],
476 silly audit anymatch: [ '3.1.2' ],
476 silly audit braces: [ '3.0.2' ],
476 silly audit fsevents: [ '2.3.2' ],
476 silly audit 'glob-parent': [ '5.1.2' ],
476 silly audit 'is-binary-path': [ '2.1.0' ],
476 silly audit 'is-glob': [ '4.0.3' ],
476 silly audit 'normalize-path': [ '3.0.0' ],
476 silly audit readdirp: [ '3.6.0' ],
476 silly audit picomatch: [ '2.3.1' ],
476 silly audit 'fill-range': [ '7.0.1' ],
476 silly audit 'to-regex-range': [ '5.0.1' ],
476 silly audit 'binary-extensions': [ '2.2.0' ],
476 silly audit 'is-extglob': [ '2.1.1' ],
476 silly audit 'has-flag': [ '3.0.0', '4.0.0' ],
476 silly audit 'is-number': [ '7.0.0' ],
476 silly audit boxen: [ '5.1.2' ],
476 silly audit chalk: [ '4.1.2' ],
476 silly audit configstore: [ '5.0.1' ],
476 silly audit 'has-yarn': [ '2.1.0' ],
476 silly audit 'import-lazy': [ '2.1.0' ],
476 silly audit 'is-ci': [ '2.0.0' ],
476 silly audit 'is-installed-globally': [ '0.4.0' ],
476 silly audit 'is-npm': [ '5.0.0' ],
476 silly audit 'is-yarn-global': [ '0.3.0' ],
476 silly audit 'latest-version': [ '5.1.0' ],
476 silly audit pupa: [ '2.1.1' ],
476 silly audit 'semver-diff': [ '3.1.1' ],
476 silly audit 'xdg-basedir': [ '4.0.0' ],
476 silly audit 'ansi-align': [ '3.0.1' ],
476 silly audit camelcase: [ '6.3.0' ],
476 silly audit 'cli-boxes': [ '2.2.1' ],
476 silly audit 'type-fest': [ '0.20.2' ],
476 silly audit 'widest-line': [ '3.1.0' ],
476 silly audit 'wrap-ansi': [ '7.0.0' ],
476 silly audit 'ansi-styles': [ '4.3.0' ],
476 silly audit 'color-convert': [ '2.0.1' ],
476 silly audit 'color-name': [ '1.1.4' ],
476 silly audit 'dot-prop': [ '5.3.0' ],
476 silly audit 'graceful-fs': [ '4.2.8' ],
476 silly audit 'make-dir': [ '3.1.0' ],
476 silly audit 'unique-string': [ '2.0.0' ],
476 silly audit 'write-file-atomic': [ '3.0.3' ],
476 silly audit 'is-obj': [ '2.0.0' ],
476 silly audit 'ci-info': [ '2.0.0' ],
476 silly audit 'global-dirs': [ '3.0.0' ],
476 silly audit 'is-path-inside': [ '3.0.3' ],
476 silly audit 'package-json': [ '6.5.0' ],
476 silly audit got: [ '9.6.0' ],
476 silly audit 'registry-auth-token': [ '4.2.1' ],
476 silly audit 'registry-url': [ '5.1.0' ],
476 silly audit '@sindresorhus/is': [ '0.14.0' ],
476 silly audit '@szmarczak/http-timer': [ '1.1.2' ],
476 silly audit 'cacheable-request': [ '6.1.0' ],
476 silly audit 'decompress-response': [ '3.3.0' ],
476 silly audit duplexer3: [ '0.1.4' ],
476 silly audit 'get-stream': [ '4.1.0', '5.2.0' ],
476 silly audit 'lowercase-keys': [ '1.0.1', '2.0.0' ],
476 silly audit 'mimic-response': [ '1.0.1' ],
476 silly audit 'p-cancelable': [ '1.1.0' ],
476 silly audit 'to-readable-stream': [ '1.0.0' ],
476 silly audit 'url-parse-lax': [ '3.0.0' ],
476 silly audit 'defer-to-connect': [ '1.1.3' ],
476 silly audit 'clone-response': [ '1.0.2' ],
476 silly audit 'http-cache-semantics': [ '4.1.0' ],
476 silly audit keyv: [ '3.1.0' ],
476 silly audit 'normalize-url': [ '4.5.1' ],
476 silly audit responselike: [ '1.0.2' ],
476 silly audit pump: [ '3.0.0' ],
476 silly audit 'json-buffer': [ '3.0.0' ],
476 silly audit 'end-of-stream': [ '1.4.4' ],
476 silly audit 'escape-goat': [ '2.1.1' ],
476 silly audit 'crypto-random-string': [ '2.0.0' ],
476 silly audit 'prepend-http': [ '2.0.0' ],
476 silly audit imurmurhash: [ '0.1.4' ],
476 silly audit 'is-typedarray': [ '1.0.0' ],
476 silly audit 'typedarray-to-buffer': [ '3.1.5' ],
476 silly audit 'emoji-regex': [ '8.0.0' ],
476 silly audit 'lru-cache': [ '6.0.0' ]
476 silly audit }
477 verbose reify failed optional dependency C:\laragon\www\noisecraft\noisecraft\node_modules\fsevents
478 silly reify mark deleted [ 'C:\laragon\www\noisecraft\noisecraft\node_modules\fsevents' ]
479 timing reifyNode:node_modules/fsevents Completed in 51ms
480 silly tarball no local data for camelcase@https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz. Extracting by manifest.
481 silly tarball no local data for picomatch@https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz. Extracting by manifest.
482 http fetch POST 200 https://registry.npmjs.org/-/npm/v1/security/advisories/bulk 512ms
483 timing auditReport:getReport Completed in 518ms
484 silly audit report {}
485 timing auditReport:init Completed in 0ms
486 timing reify:audit Completed in 518ms
487 timing reifyNode:node_modules/prepend-http Completed in 831ms
488 timing reifyNode:node_modules/imurmurhash Completed in 837ms
489 timing reifyNode:node_modules/end-of-stream Completed in 838ms
490 timing reifyNode:node_modules/to-readable-stream Completed in 837ms
491 timing reifyNode:node_modules/mimic-response Completed in 837ms
492 timing reifyNode:node_modules/url-parse-lax Completed in 837ms
493 timing reifyNode:node_modules/lowercase-keys Completed in 838ms
494 timing reifyNode:node_modules/decompress-response Completed in 838ms
495 timing reifyNode:node_modules/duplexer3 Completed in 838ms
496 timing reifyNode:node_modules/color-name Completed in 838ms
497 timing reifyNode:node_modules/wrap-ansi Completed in 838ms
498 timing reifyNode:node_modules/import-lazy Completed in 838ms
499 timing reifyNode:node_modules/configstore Completed in 838ms
500 timing reifyNode:node_modules/is-number Completed in 838ms
501 timing reifyNode:node_modules/is-extglob Completed in 838ms
502 timing reifyNode:node_modules/has-flag Completed in 838ms
503 timing reifyNode:node_modules/normalize-path Completed in 839ms
504 timing reifyNode:node_modules/ignore-by-default Completed in 838ms
505 timing reifyNode:node_modules/wide-align Completed in 838ms
506 timing reifyNode:node_modules/strip-ansi Completed in 839ms
507 timing reifyNode:node_modules/wrappy Completed in 839ms
508 timing reifyNode:node_modules/strip-json-comments Completed in 840ms
509 timing reifyNode:node_modules/string-width Completed in 843ms
510 timing reifyNode:node_modules/process-nextick-args Completed in 843ms
511 timing reifyNode:node_modules/os-tmpdir Completed in 843ms
512 timing reifyNode:node_modules/number-is-nan Completed in 842ms
513 timing reifyNode:node_modules/os-homedir Completed in 844ms
514 timing reifyNode:node_modules/path-is-absolute Completed in 844ms
515 timing reifyNode:node_modules/object-assign Completed in 844ms
516 timing reifyNode:node_modules/once Completed in 844ms
517 timing reifyNode:node_modules/osenv Completed in 845ms
518 timing reifyNode:node_modules/npm-packlist Completed in 844ms
519 timing reifyNode:node_modules/npm-bundled Completed in 844ms
520 timing reifyNode:node_modules/ms Completed in 844ms
521 timing reifyNode:node_modules/toidentifier Completed in 848ms
522 timing reifyNode:node_modules/is-fullwidth-code-point Completed in 845ms
523 timing reifyNode:node_modules/inflight Completed in 845ms
524 timing reifyNode:node_modules/ignore-walk Completed in 846ms
525 timing reifyNode:node_modules/has-unicode Completed in 846ms
526 timing reifyNode:node_modules/ini Completed in 846ms
527 timing reifyNode:node_modules/escape-html Completed in 846ms
528 timing reifyNode:node_modules/fs-minipass Completed in 847ms
529 timing reifyNode:node_modules/destroy Completed in 847ms
530 timing reifyNode:node_modules/ee-first Completed in 847ms
531 timing reifyNode:node_modules/code-point-at Completed in 847ms
532 timing reifyNode:node_modules/chownr Completed in 848ms
533 timing reifyNode:node_modules/ansi-regex Completed in 848ms
534 timing reifyNode:node_modules/abbrev Completed in 848ms
535 timing reifyNode:node_modules/brace-expansion Completed in 849ms
536 timing reifyNode:node_modules/aproba Completed in 849ms
537 timing reifyNode:node_modules/global-dirs/node_modules/ini Completed in 860ms
538 timing reifyNode:node_modules/nodemon/node_modules/ms Completed in 856ms
539 timing reifyNode:node_modules/send/node_modules/ms Completed in 856ms
540 timing reifyNode:node_modules/clone-response Completed in 864ms
541 timing reifyNode:node_modules/lru-cache Completed in 868ms
542 timing reifyNode:node_modules/responselike Completed in 866ms
543 timing reifyNode:node_modules/needle/node_modules/ms Completed in 858ms
544 timing reifyNode:node_modules/@szmarczak/http-timer Completed in 870ms
545 timing reifyNode:node_modules/fill-range Completed in 867ms
546 timing reifyNode:node_modules/is-glob Completed in 867ms
547 timing reifyNode:node_modules/array-flatten Completed in 864ms
548 timing reifyNode:node_modules/to-regex-range Completed in 874ms
549 timing reifyNode:node_modules/minipass Completed in 872ms
550 timing reifyNode:node_modules/core-util-is Completed in 873ms
551 timing reifyNode:node_modules/keyv Completed in 892ms
552 timing reifyNode:node_modules/http-cache-semantics Completed in 893ms
553 timing reifyNode:node_modules/cacheable-request Completed in 895ms
554 timing reifyNode:node_modules/minimatch Completed in 896ms
555 timing reifyNode:node_modules/crypto-random-string Completed in 913ms
556 timing reifyNode:node_modules/is-typedarray Completed in 914ms
557 timing reifyNode:node_modules/escape-goat Completed in 914ms
558 timing reifyNode:node_modules/get-stream Completed in 913ms
559 timing reifyNode:node_modules/normalize-url Completed in 915ms
560 timing reifyNode:node_modules/registry-url Completed in 913ms
561 timing reifyNode:node_modules/is-obj Completed in 913ms
562 timing reifyNode:node_modules/unique-string Completed in 913ms
563 timing reifyNode:node_modules/p-cancelable Completed in 915ms
564 timing reifyNode:node_modules/is-path-inside Completed in 914ms
565 timing reifyNode:node_modules/global-dirs Completed in 914ms
566 timing reifyNode:node_modules/dot-prop Completed in 913ms
567 timing reifyNode:node_modules/make-dir Completed in 915ms
568 timing reifyNode:node_modules/widest-line Completed in 914ms
569 timing reifyNode:node_modules/xdg-basedir Completed in 913ms
570 timing reifyNode:node_modules/latest-version Completed in 914ms
571 timing reifyNode:node_modules/is-yarn-global Completed in 914ms
572 timing reifyNode:node_modules/semver-diff Completed in 914ms
573 timing reifyNode:node_modules/is-npm Completed in 914ms
574 timing reifyNode:node_modules/ansi-align Completed in 916ms
575 timing reifyNode:node_modules/has-yarn Completed in 915ms
576 timing reifyNode:node_modules/is-installed-globally Completed in 915ms
577 timing reifyNode:node_modules/is-binary-path Completed in 914ms
578 timing reifyNode:node_modules/pupa Completed in 916ms
579 timing reifyNode:node_modules/supports-color Completed in 914ms
580 timing reifyNode:node_modules/glob-parent Completed in 914ms
581 timing reifyNode:node_modules/vary Completed in 914ms
582 timing reifyNode:node_modules/vhost Completed in 914ms
583 timing reifyNode:node_modules/anymatch Completed in 916ms
584 timing reifyNode:node_modules/unpipe Completed in 915ms
585 timing reifyNode:node_modules/type-is Completed in 916ms
586 timing reifyNode:node_modules/set-blocking Completed in 915ms
587 timing reifyNode:node_modules/utils-merge Completed in 917ms
588 timing reifyNode:node_modules/range-parser Completed in 916ms
589 timing reifyNode:node_modules/path-to-regexp Completed in 916ms
590 timing reifyNode:node_modules/sax Completed in 918ms
591 timing reifyNode:node_modules/parseurl Completed in 917ms
592 timing reifyNode:node_modules/on-finished Completed in 917ms
593 timing reifyNode:node_modules/methods Completed in 917ms
594 timing reifyNode:node_modules/merge-descriptors Completed in 917ms
595 timing reifyNode:node_modules/media-typer Completed in 918ms
596 timing reifyNode:node_modules/minizlib Completed in 918ms
597 timing reifyNode:node_modules/ieee754 Completed in 918ms
598 timing reifyNode:node_modules/forwarded Completed in 918ms
599 timing reifyNode:node_modules/inherits Completed in 918ms
600 timing reifyNode:node_modules/finalhandler Completed in 919ms
601 timing reifyNode:node_modules/fresh Completed in 919ms
602 timing reifyNode:node_modules/etag Completed in 919ms
603 timing reifyNode:node_modules/encodeurl Completed in 919ms
604 timing reifyNode:node_modules/cookie-signature Completed in 919ms
605 timing reifyNode:node_modules/console-control-strings Completed in 919ms
606 timing reifyNode:node_modules/content-type Completed in 919ms
607 timing reifyNode:node_modules/bytes Completed in 920ms
608 timing reifyNode:node_modules/cacheable-request/node_modules/lowercase-keys Completed in 930ms
609 timing reifyNode:node_modules/accepts Completed in 920ms
610 timing reifyNode:node_modules/widest-line/node_modules/is-fullwidth-code-point Completed in 930ms
611 timing reifyNode:node_modules/wrap-ansi/node_modules/is-fullwidth-code-point Completed in 930ms
612 timing reifyNode:node_modules/wrap-ansi/node_modules/strip-ansi Completed in 930ms
613 timing reifyNode:node_modules/ansi-align/node_modules/strip-ansi Completed in 929ms
614 timing reifyNode:node_modules/ansi-align/node_modules/string-width Completed in 930ms
615 timing reifyNode:node_modules/boxen/node_modules/ansi-regex Completed in 929ms
616 timing reifyNode:node_modules/widest-line/node_modules/ansi-regex Completed in 931ms
617 timing reifyNode:node_modules/widest-line/node_modules/strip-ansi Completed in 931ms
618 timing reifyNode:node_modules/ansi-align/node_modules/ansi-regex Completed in 930ms
619 timing reifyNode:node_modules/widest-line/node_modules/string-width Completed in 931ms
620 timing reifyNode:node_modules/boxen/node_modules/is-fullwidth-code-point Completed in 929ms
621 timing reifyNode:node_modules/ansi-align/node_modules/is-fullwidth-code-point Completed in 931ms
622 timing reifyNode:node_modules/wrap-ansi/node_modules/string-width Completed in 932ms
623 timing reifyNode:node_modules/boxen/node_modules/strip-ansi Completed in 930ms
624 timing reifyNode:node_modules/chalk/node_modules/supports-color Completed in 931ms
625 timing reifyNode:node_modules/wrap-ansi/node_modules/ansi-regex Completed in 932ms
626 timing reifyNode:node_modules/boxen/node_modules/string-width Completed in 930ms
627 timing reifyNode:node_modules/chalk/node_modules/has-flag Completed in 931ms
628 timing reifyNode:node_modules/package-json Completed in 935ms
629 timing reifyNode:node_modules/write-file-atomic Completed in 936ms
630 timing reifyNode:node_modules/boxen Completed in 934ms
631 timing reifyNode:node_modules/ansi-styles Completed in 937ms
632 timing reifyNode:node_modules/defer-to-connect Completed in 939ms
633 timing reifyNode:node_modules/touch Completed in 934ms
634 timing reifyNode:node_modules/yallist Completed in 933ms
635 timing reifyNode:node_modules/readdirp Completed in 936ms
636 timing reifyNode:node_modules/update-notifier Completed in 935ms
637 timing reifyNode:node_modules/rimraf Completed in 934ms
638 timing reifyNode:node_modules/serve-static Completed in 936ms
639 timing reifyNode:node_modules/npmlog Completed in 935ms
640 timing reifyNode:node_modules/mime-types Completed in 935ms
641 timing reifyNode:node_modules/http-errors Completed in 935ms
642 timing reifyNode:node_modules/fs.realpath Completed in 936ms
643 timing reifyNode:node_modules/cookie Completed in 935ms
644 timing reifyNode:node_modules/content-disposition Completed in 936ms
645 timing reifyNode:node_modules/balanced-match Completed in 936ms
646 timing reifyNode:node_modules/lru-cache/node_modules/yallist Completed in 950ms
647 timing reifyNode:node_modules/proxy-addr Completed in 942ms
648 timing reifyNode:node_modules/string_decoder Completed in 946ms
649 timing reifyNode:node_modules/send Completed in 947ms
650 timing reifyNode:node_modules/safe-buffer Completed in 946ms
651 timing reifyNode:node_modules/tar/node_modules/safe-buffer Completed in 957ms
652 timing reifyNode:node_modules/cli-boxes Completed in 963ms
653 timing reifyNode:node_modules/is-ci Completed in 963ms
654 timing reifyNode:node_modules/util-deprecate Completed in 961ms
655 timing reifyNode:node_modules/signal-exit Completed in 962ms
656 timing reifyNode:node_modules/base64-js Completed in 960ms
657 timing reifyNode:node_modules/ci-info Completed in 972ms
658 timing reifyNode:node_modules/setprototypeof Completed in 970ms
659 timing reifyNode:node_modules/raw-body Completed in 971ms
660 timing reifyNode:node_modules/mkdirp Completed in 973ms
661 timing reifyNode:node_modules/deep-extend Completed in 973ms
662 timing reifyNode:node_modules/cacheable-request/node_modules/get-stream Completed in 986ms
663 timing reifyNode:node_modules/statuses Completed in 991ms
664 timing reifyNode:node_modules/@sindresorhus/is Completed in 1005ms
665 timing reifyNode:node_modules/ipaddr.js Completed in 998ms
666 timing reifyNode:node_modules/nopt Completed in 1000ms
667 timing reifyNode:node_modules/detect-libc Completed in 1000ms
668 timing reifyNode:node_modules/pump Completed in 1012ms
669 timing reifyNode:node_modules/binary-extensions Completed in 1009ms
670 timing reifyNode:node_modules/registry-auth-token Completed in 1018ms
671 timing reifyNode:node_modules/json-buffer Completed in 1020ms
672 timing reifyNode:node_modules/color-convert Completed in 1018ms
673 timing reifyNode:node_modules/typedarray-to-buffer Completed in 1023ms
674 timing reifyNode:node_modules/buffer Completed in 1015ms
675 timing reifyNode:node_modules/graceful-fs Completed in 1025ms
676 timing reifyNode:node_modules/safer-buffer Completed in 1023ms
677 timing reifyNode:node_modules/concat-map Completed in 1023ms
678 timing reifyNode:node_modules/touch/node_modules/nopt Completed in 1031ms
679 timing reifyNode:node_modules/chalk Completed in 1036ms
680 timing reifyNode:node_modules/glob Completed in 1032ms
681 timing reifyNode:node_modules/isarray Completed in 1034ms
682 timing reifyNode:node_modules/semver Completed in 1038ms
683 timing reifyNode:node_modules/delegates Completed in 1039ms
684 timing reifyNode:node_modules/make-dir/node_modules/semver Completed in 1049ms
685 timing reifyNode:node_modules/package-json/node_modules/semver Completed in 1049ms
686 timing reifyNode:node_modules/semver-diff/node_modules/semver Completed in 1048ms
687 timing reifyNode:node_modules/emoji-regex Completed in 1056ms
688 timing reifyNode:node_modules/mime-db Completed in 1052ms
689 timing reifyNode:node_modules/are-we-there-yet Completed in 1054ms
690 timing reifyNode:node_modules/negotiator Completed in 1059ms
691 timing reifyNode:node_modules/undefsafe Completed in 1064ms
692 http fetch GET 200 https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz 919ms (cache miss)
693 timing reifyNode:node_modules/camelcase Completed in 1071ms
694 timing reifyNode:node_modules/chokidar Completed in 1069ms
695 timing reifyNode:node_modules/needle/node_modules/debug Completed in 1067ms
696 timing reifyNode:node_modules/nodemon/node_modules/debug Completed in 1071ms
697 timing reifyNode:node_modules/mime Completed in 1076ms
698 timing reifyNode:node_modules/depd Completed in 1079ms
699 timing reifyNode:node_modules/body-parser Completed in 1083ms
700 timing reifyNode:node_modules/braces Completed in 1093ms
701 timing reifyNode:node_modules/pstree.remy Completed in 1099ms
702 timing reifyNode:node_modules/rc Completed in 1099ms
703 timing reifyNode:node_modules/npm-normalize-package-bin Completed in 1104ms
704 timing reifyNode:node_modules/debug Completed in 1142ms
705 http fetch GET 200 https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz 1017ms (cache miss)
706 timing reifyNode:node_modules/picomatch Completed in 1173ms
707 timing reifyNode:node_modules/gauge Completed in 1173ms
708 timing reifyNode:node_modules/express Completed in 1175ms
709 timing reifyNode:node_modules/got Completed in 1185ms
710 timing reifyNode:node_modules/qs Completed in 1180ms
711 timing reifyNode:node_modules/minimist Completed in 1181ms
712 timing reifyNode:node_modules/readable-stream Completed in 1199ms
713 timing reifyNode:node_modules/tar Completed in 1216ms
714 timing reifyNode:node_modules/iconv-lite Completed in 1218ms
715 warn deprecated [email protected]: Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future
716 timing reifyNode:node_modules/node-pre-gyp Completed in 1228ms
717 timing reifyNode:node_modules/type-fest Completed in 1270ms
718 timing reifyNode:node_modules/nodemon Completed in 1286ms
719 timing reifyNode:node_modules/needle Completed in 1284ms
720 timing reifyNode:node_modules/nan Completed in 1285ms
721 timing reifyNode:node_modules/update-notifier/node_modules/semver Completed in 1291ms
722 timing reifyNode:node_modules/crc Completed in 1293ms
723 timing reifyNode:node_modules/sqlite3 Completed in 1311ms
724 timing reify:unpack Completed in 1321ms
725 timing reify:unretire Completed in 1ms
726 timing build:queue Completed in 12ms
727 timing build:link:node_modules/detect-libc Completed in 33ms
728 timing build:link:node_modules/make-dir/node_modules/semver Completed in 29ms
729 timing build:link:node_modules/is-ci Completed in 32ms
730 timing build:link:node_modules/mkdirp Completed in 31ms
731 timing build:link:node_modules/package-json/node_modules/semver Completed in 29ms
732 timing build:link:node_modules/mime Completed in 32ms
733 timing build:link:node_modules/needle Completed in 31ms
734 timing build:link:node_modules/semver-diff/node_modules/semver Completed in 29ms
735 timing build:link:node_modules/touch/node_modules/nopt Completed in 29ms
736 timing build:link:node_modules/node-pre-gyp Completed in 31ms
737 timing build:link:node_modules/nodemon Completed in 31ms
738 timing build:link:node_modules/nopt Completed in 30ms
739 timing build:link:node_modules/rc Completed in 30ms
740 timing build:link:node_modules/rimraf Completed in 30ms
741 timing build:link:node_modules/touch Completed in 29ms
742 timing build:link:node_modules/semver Completed in 30ms
743 timing build:link:node_modules/update-notifier/node_modules/semver Completed in 30ms
744 timing build:link Completed in 34ms
745 info run [email protected] install node_modules/sqlite3 node-pre-gyp install --fallback-to-build
746 info run [email protected] install { code: 1, signal: null }
747 timing reify:rollback:createSparse Completed in 382ms
748 timing reify:rollback:retireShallow Completed in 0ms
749 timing command:install Completed in 60735ms
750 verbose stack Error: command failed
750 verbose stack at ChildProcess. (C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\promise-spawn\index.js:64:27)
750 verbose stack at ChildProcess.emit (node:events:390:28)
750 verbose stack at maybeClose (node:internal/child_process:1064:16)
750 verbose stack at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5)
751 verbose pkgid [email protected]
752 verbose cwd C:\laragon\www\noisecraft\noisecraft
753 verbose Windows_NT 10.0.19042
754 verbose argv "C:\Program Files\nodejs\node.exe" "C:\Users\User\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js" "install"
755 verbose node v16.13.1
756 verbose npm v8.3.0
757 error code 1
758 error path C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3
759 error command failed
760 error command C:\Windows\system32\cmd.exe /d /s /c node-pre-gyp install --fallback-to-build
761 error Failed to execute 'C:\Program Files\nodejs\node.exe C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64\node_sqlite3.node --module_name=node_sqlite3 --module_path=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64 --napi_version=8 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v93' (1)
762 error node-pre-gyp info it worked if it ends with ok
762 error node-pre-gyp info using [email protected]
762 error node-pre-gyp info using [email protected] | win32 | x64
762 error node-pre-gyp WARN Using needle for node-pre-gyp https download
762 error node-pre-gyp info check checked for "C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64\node_sqlite3.node" (not found)
762 error node-pre-gyp http GET https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.2.0/node-v93-win32-x64.tar.gz
762 error node-pre-gyp http 403 https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.2.0/node-v93-win32-x64.tar.gz
762 error node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.2.0/node-v93-win32-x64.tar.gz
762 error node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v93 ABI, unknown) (falling back to source compile with node-gyp)
762 error node-pre-gyp http 403 status code downloading tarball https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.2.0/node-v93-win32-x64.tar.gz
762 error gyp info it worked if it ends with ok
762 error gyp info using [email protected]
762 error gyp info using [email protected] | win32 | x64
762 error gyp info ok
762 error gyp info it worked if it ends with ok
762 error gyp info using [email protected]
762 error gyp info using [email protected] | win32 | x64
762 error gyp ERR! find Python
762 error gyp ERR! find Python Python is not set from command line or npm configuration
762 error gyp ERR! find Python Python is not set from environment variable PYTHON
762 error gyp ERR! find Python checking if "python3" can be used
762 error gyp ERR! find Python - "python3" is not in PATH or produced an error
762 error gyp ERR! find Python checking if "python" can be used
762 error gyp ERR! find Python - "python" is not in PATH or produced an error
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python39\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python39\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python39\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python39\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python39-32\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python39-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python39-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python39-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files (x86)\Python39-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files (x86)\Python39-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python38\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python38\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python38\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python38\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python38-32\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python38-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python38-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python38-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files (x86)\Python38-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files (x86)\Python38-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python37\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python37\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python37-32\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python37-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python37-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python37-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files (x86)\Python37-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files (x86)\Python37-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python36\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python36\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python36\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python36\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Users\User\AppData\Local\Programs\Python\Python36-32\python.exe
762 error gyp ERR! find Python - "C:\Users\User\AppData\Local\Programs\Python\Python36-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files\Python36-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files\Python36-32\python.exe" could not be run
762 error gyp ERR! find Python checking if Python is C:\Program Files (x86)\Python36-32\python.exe
762 error gyp ERR! find Python - "C:\Program Files (x86)\Python36-32\python.exe" could not be run
762 error gyp ERR! find Python checking if the py launcher can be used to find Python 3
762 error gyp ERR! find Python - "py.exe" is not in PATH or produced an error
762 error gyp ERR! find Python
762 error gyp ERR! find Python **********************************************************
762 error gyp ERR! find Python You need to install the latest version of Python.
762 error gyp ERR! find Python Node-gyp should be able to find and use Python. If not,
762 error gyp ERR! find Python you can try one of the following options:
762 error gyp ERR! find Python - Use the switch --python="C:\Path\To\python.exe"
762 error gyp ERR! find Python (accepted by both node-gyp and npm)
762 error gyp ERR! find Python - Set the environment variable PYTHON
762 error gyp ERR! find Python - Set the npm configuration variable python:
762 error gyp ERR! find Python npm config set python "C:\Path\To\python.exe"
762 error gyp ERR! find Python For more information consult the documentation at:
762 error gyp ERR! find Python https://github.com/nodejs/node-gyp#installation
762 error gyp ERR! find Python **********************************************************
762 error gyp ERR! find Python
762 error gyp ERR! configure error
762 error gyp ERR! stack Error: Could not find any Python installation to use
762 error gyp ERR! stack at PythonFinder.fail (C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\lib\find-python.js:330:47)
762 error gyp ERR! stack at PythonFinder.runChecks (C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\lib\find-python.js:159:21)
762 error gyp ERR! stack at PythonFinder. (C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\lib\find-python.js:228:18)
762 error gyp ERR! stack at PythonFinder.execFileCallback (C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\lib\find-python.js:294:16)
762 error gyp ERR! stack at exithandler (node:child_process:404:5)
762 error gyp ERR! stack at ChildProcess.errorhandler (node:child_process:416:5)
762 error gyp ERR! stack at ChildProcess.emit (node:events:390:28)
762 error gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:288:12)
762 error gyp ERR! stack at onErrorNT (node:internal/child_process:477:16)
762 error gyp ERR! stack at processTicksAndRejections (node:internal/process/task_queues:83:21)
762 error gyp ERR! System Windows_NT 10.0.19042
762 error gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "configure" "--fallback-to-build" "--module=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64\node_sqlite3.node" "--module_name=node_sqlite3" "--module_path=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64" "--napi_version=8" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v93"
762 error gyp ERR! cwd C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3
762 error gyp ERR! node -v v16.13.1
762 error gyp ERR! node-gyp -v v8.4.1
762 error gyp ERR! not ok
762 error node-pre-gyp ERR! build error
762 error node-pre-gyp ERR! stack Error: Failed to execute 'C:\Program Files\nodejs\node.exe C:\Users\User\AppData\Roaming\npm\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64\node_sqlite3.node --module_name=node_sqlite3 --module_path=C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3\lib\binding\node-v93-win32-x64 --napi_version=8 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v93' (1)
762 error node-pre-gyp ERR! stack at ChildProcess. (C:\laragon\www\noisecraft\noisecraft\node_modules\node-pre-gyp\lib\util\compile.js:83:29)
762 error node-pre-gyp ERR! stack at ChildProcess.emit (node:events:390:28)
762 error node-pre-gyp ERR! stack at maybeClose (node:internal/child_process:1064:16)
762 error node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5)
762 error node-pre-gyp ERR! System Windows_NT 10.0.19042
762 error node-pre-gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\laragon\www\noisecraft\noisecraft\node_modules\node-pre-gyp\bin\node-pre-gyp" "install" "--fallback-to-build"
762 error node-pre-gyp ERR! cwd C:\laragon\www\noisecraft\noisecraft\node_modules\sqlite3
762 error node-pre-gyp ERR! node -v v16.13.1
762 error node-pre-gyp ERR! node-pre-gyp -v v0.11.0
762 error node-pre-gyp ERR! not ok
763 verbose exit 1
764 timing npm Completed in 61447ms
765 verbose unfinished npm timer reify 1641165733996
766 verbose unfinished npm timer reify:build 1641165791974
767 verbose unfinished npm timer build 1641165791975
768 verbose unfinished npm timer build:deps 1641165791975
769 verbose unfinished npm timer build:run:install 1641165792021
770 verbose unfinished npm timer build:run:install:node_modules/sqlite3 1641165792021
771 verbose code 1
772 error A complete log of this run can be found in:
772 error C:\Users\User\AppData\Local\npm-cache_logs\2022-01-02T23_22_13_412Z-debug-0.log

Separate Data from Structure

Would anyone consider the idea of separating Data from Structure. An example to create a new node Configurations that contained a list of radio buttons+labels where each row would switch between data sets without needing to remember all the settings of each node, or needing to create separate project for each settings arrangement. This new node would save with the project json and thus stay with the project.

Any thoughts or interest into separating Data from Structure?

Modulo (fmod) node

I think it could be useful for some use cases to have a modulo node that can accept both integer and floating-point values.

This need to never produce NaN outputs, so we need to check for division by zero and special cases involving infinity:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder

Infinity % x => NaN
x % 0 => NaN

The simplest solution would be to use JS's remainder operator directly, and to return 0 if the output is NaN. It might make sense to use the JavaScript semantics for this operator, for simplicity, unless there's a good reason not to. Once the semantics of this operator are set, it might be hard to change them later, so it would be good to consider the implications carefully.

Question: what are the key difference between JavaScript's % operator and C's fmod?

npm install fails

Windows 10
message clipped, but I think this is the relevant part

gyp ERR! node -v v14.15.1
gyp ERR! node-gyp -v v5.1.0
gyp ERR! not ok
node-pre-gyp ERR! build error 
node-pre-gyp ERR! stack Error: Failed to execute 'C:\Program Files\nodejs\node.exe C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\joe\Desktop\noisecraft\node_modules\sqlite3\lib\binding\node-v83-win32-x64\node_sqlite3.node --module_name=node_sqlite3 --module_path=C:\Users\joe\Desktop\noisecraft\node_modules\sqlite3\lib\binding\node-v83-win32-x64 --napi_version=7 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v83' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (C:\Users\joe\Desktop\noisecraft\node_modules\node-pre-gyp\lib\util\compile.js:83:29)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:315:20)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:1048:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)
node-pre-gyp ERR! System Windows_NT 10.0.19044
node-pre-gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\joe\\Desktop\\noisecraft\\node_modules\\node-pre-gyp\\bin\\node-pre-gyp" "install" 
"--fallback-to-build"
node-pre-gyp ERR! cwd C:\Users\joe\Desktop\noisecraft\node_modules\sqlite3
node-pre-gyp ERR! node -v v14.15.1
node-pre-gyp ERR! node-pre-gyp -v v0.11.0
node-pre-gyp ERR! not ok

Update to sqlite 5 in package.json allowed install to complete

"sqlite3": "5.0.0",

great project, happy to submit a PR if it would help

Coloring edges originating from a src port

Depends on #12. Prior discussion in this comment.

Set the "correct" color for edges that originate from a src port.

Edges colors are determined by the src port they come from. If you start creating an edge connection from a src port, we already know what color that edge will be.

Currently however, we purposely keep the color gray until the edge is connected on both src and dst ends. It serves as visual feedback for the connection being made. If we can find an alternative feedback mechanism in #12, we can implement this without losing visual feedback.

Handling multiple pastes in a row

When you have some nodes copied and you paste them multiple times without moving the cursor, the pasted nodes will always be in the same position.

Pasting is "working as intended" in a sense, but it's difficult to see these new nodes that are 100% overlapping with the old ones.

@maximecb was suggesting we could paste everything with some jitter: On every paste, the final position of the pasted nodes would all be moved +/-5px or so.

Another idea is to detect many identical pastes have happened at the same location in a series, then shift them accordingly. For example: On the first paste, leave them as they are. On the second paste, x+=10 and y+=10. On the third paste, x+=20 and y+=20. On the Nth paste, x+=((N-1)*10) and y+=((N-1)*10).

add scripting support

BespokeSynth has a nice implementation of python scripting as a point of reference. i particularly love the live introspection ability (show the value of specific vars inline) and also highlighting which line is being executed.

it seems like javascript would be a nice companion for noisecraft :)

i'm sure this is a substantial effort, but thought it was worth throwing on the backlog.

UI Enhancements

I've found noisecraft really intuitive so far. I had some ideas for UI enhancements while playing around.

  • Highlight the selected/active node. Currently clicking and dragging highlights the selected nodes. I think it would be easier to see what the current node/modified node is if it is highlighted when clicked.
  • Double click to add, single click to deselect. I have a habit of clicking on empty space to escape an operation, but this always ended up with the add node screen. Single click to deselect the active node/ double click to add a new node would be the expected behaviour for me.
  • Press escape to cancel dragging a wire.
  • Select wires, with the ability to delete wires.

Maybe something for down the road

  • Align nodes (leftmost, rightmost, topmost etc). Would be useful for organising larger scripts.

I'm approaching this from the UI I'm used to in Grasshopper, which I've been developing a similar tool for.

Illegal graph components delete graph on reload

Some part of the functionality that saves and retrieves projects in localStorage is strict about graphs, so if you create an illegal graph, such as the loop pictured below, and then you reload, you lose your whole project.
image

shift-click-to-delete causing frustration

the issue is most notable in the notes node. when editing text, it is instinctual to shift-click in the text to select everything from the text cursor to the mouse cursor. unfortunately this action instead irretrievably annihilates the node and all the notes that were written.

moreover, though, shift-clicking is not normally a delete action, at least not in any of the guis i have used before.

i would love to see shift-click-to-delete retired altogether, since the delete key already serves that function. it would make sense to me to instead enable click-selection of nodes, allowing deletion of individual nodes with the same number of user actions as the current method ([click, delete] instead of [shift-click]).

optionally the X key could be added as an alias for delete, as it is a more reachable key (like shift) and it is familiar to users of Blender's node programming system.

Code generation for modules/groups (inlining)

The code in compiler.js currently doesn't handle modules, so we can't really use them in projects. To implement this, we should implement inlining, basically transforming the incoming graph until it contains no modules anymore and everything is flattened. This has to work recursively (modules inside of modules).

Add docker support

Hello,
I think it might be a good idea to add docker support. It would enable users to run the project more consistently, regardless of their installed node or OS version.

I would be happy to work on it.

Figure out why NoiseCraft doesn't work in Safari

Currently NoiseCraft doesn't produce audio output in Safari when the Play button is pressed. I haven't investigated the specific reason at all. Help would be most appreciated. If a feature is missing in Safari, we might also want to open an issue on their issue tracker.

an extra option with the waves ... 0 to 1.... or -1 to 1

I am enjoying your app a lot. I would quite like an option with the wave types where I could select a zero to 1 range at a click so that I wouldn't have to add and divide to achieve the same thing. I realize that part of your intentions may be about keeping the user interface as simple as possible encouraging creative solutions to such things. I do find myself repeating this process enough that I think it would be of value and help to lay down ideas more easily. Thanks for the great software :)

Prevent nodes from being moved outside of the top or left edge

Currently, it's possible to move nodes into negative coordinates at the top or left of the editor. If you do this with a group, it's possible to "lose" nodes in there that can't be pulled out afterwards.

I think we should prevent nodes from being moved into negative coordinates. The logic for that can be in the editor, in the code for moving nodes.

Server configuration proposal

Currently, the application can run only on port HTTP 7773 and would use file .database.db as its database file.

It can cause problems for users/environments that, for some reason, don't have port 7773 available. As well ability to change database file name might improve development or runtime flexibility.

I would propose to implement an ability to use environment variables so a user/developer could define an alternative HTTP port or any alternative DB file name. If no, params will be provided - current values will be used by default.

And again - will be happy to work on it.

Better, anti-aliased saw and pulse oscillators with PolyBLEP

It's been brought to my attention that there's an issue with aliasing in the naive saw and pulse (square) oscillators that NoiseCraft currently implements.

These blog posts explain the issue and how to implement PolyBLEP oscillators that address the issye:
https://www.metafunction.co.uk/post/all-about-digital-oscillators-part-2-blits-bleps
http://www.martin-finke.de/blog/articles/audio-plugins-018-polyblep-oscillator/

This project demonstrates the issue in NoiseCraft:
https://noisecraft.app/103

This repo has source code we can base our implementation on:
https://github.com/martinfinke/PolyBLEP

This thread warns that it might sound duller, which might be worth investigating, because we don't want to cut the high-end harmonics too too much:
https://www.kvraudio.com/forum/viewtopic.php?t=375517

Copying and pasting nodes

This is one of the big features that's going to distinguish NoiseCraft from Zupiter. It's one of the most requested by users.

I would like it if we could, after selecting one or more nodes, copy them with Ctrl+C and then paste the copied nodes with Ctrl+V. If multiple nodes are selected, the connections within the group of copied nodes should be reproduced when the nodes are pasted.

There is at least one open question: output side connections going outside of the group can't be reproduced because each input can only be connected to one output. However, we could potentially reproduce input-side connections coming from outside when copying and pasting within the same project/tab. The question is, do we want to? I'm thinking it might be simpler and more predictable not to.

Copying and pasting is going to be even more powerful because of what I've been calling "modules", which are just a group of nodes fused into a single meta-node (created using Ctrl+G). Copying and pasting modules is going to be a little complicated because it needs to be done recursively. That is, all the nodes inside the module form a little subgraph that has to itself be copied, so that all the nodes in the module get a unique nodeId. This is necessary because some of the components inside the module are stateful (eg delay lines, ADSR envelopes, oscillators, etc), but also because eventually, we might want to make it possible for people to expose knobs inside modules in the UI. That is, you group a number of nodes that includes some knobs, and you can go into the node parameters dialog, and say, I want these named knobs to be drawn on the module in the UI. That will enable people to create custom components like 4-channel mixers.

Ideally, we'd also be able to use the copy/paste API from the browser to enable people to copy nodes between separate NoiseCraft tabs. This is especially powerful because it will allow people to reuse nodes/modules they like from other projects. It could make people a lot more productive. For example you see this person has created a really nice 808 kick module, or a synthesizer voice, and you just copy and paste it into your own project.

In terms of API, I was thinking we could have a model.copy(nodeIds) method that returns an object with a mapping of nodeIds to node states objects. That object can then easily be serialized into JSON for the copy/paste API. Then we could have a Paste(nodes) action which takes an object with a mapping of nodeIds to node states as input. Paste is an action but copy is not, because paste is something that we can undo, but copy is not. I I think we could keep all the logic for remapping nodeIds inside of the Paste action class. We can split the logic into multiple methods.

ClockDiv not dividing time properly

If I set up two sequencers, one on a Clock, the other on that same Clock passed through a ClockDiv, setting the ClockDiv to any ratio other than 1:1 will cause the downstream sequencer to move slower, but not the right slower. Observe:
image
Now, if we slow this down, we can actually see on the Scopes what's going on:
image 3:1 image 4:1 image

A rising edge in the original wave triggers a rising edge in the divided wave. Good so far. Now we count n rising edges (including that first one), in this case two. Still good. The problem is that upon counting the last rising edge we don't immediately trigger a falling edge in the divided wave, but instead wait for a falling edge in the original wave.

We'll have to switch from watching for rising/falling edges to watching for... just... edges. So from the first edge, count (n-1)*2 edges and put the next edge, repeat.

`BitCrush` distortion node

It seems like it could be fairly easy to implement a basic bit crush style distortion node, and that would give us a new type of distortion effect to play with. This is a node that downsamples the input audio, e.g. 8 bits per sample at an 11KHz sample rate. Internally, NoiseCraft operates with 32-bit samples at a 44100Hz sample rate.

The BitCrush node could have two drop-down menus, one for the bit depth and one for the sample rate. We could select between bit depths like 32 (no-op), 16, 12, 10, 8, 6, 4, 2.

For the sample rate, we could have different fractions of the full 44100 sample rate, or go with a scheme where we produce one output sample for every N input samples, which would give us more sample rates. I want to keep the implementation simple so I'd probably go for hard sampling, no averaging between samples or smoothing.

1:1 => 44100Hz (no-op)
2:1 downsampling => 22050Hz
3:1 => 14700Hz
4:1 => 11050Hz
5:1 => 8820Hz
6:1 => 7350Hz
...
12:1 => 3675Hz

Reducing the sample rate like this should be pretty trivial, we can just keep a modulo counter that goes from 1 to N, and sample the input every time the counter is at 0.

To reduce the bit depth, I'm thinking an easy solution would be to assume that the input is within the [-1, 1] range, and map that onto [0, 65535], that is, between 9 and INT16_MAX, and then take the Math.floor() of that value. That gives us a 16-bit integer. Then we can simply drop the lower bits to get any bit depth that we want between 0 and 16 bits. Technically we should be able to downsample to odd numbers like 3-bits or 5-bits if we want to, which I guess we might as well allow.

List of new features to implement in NoiseCraft

This is a meta-issue to help spur discussion and organize contributions. The list of features below is based on things that were the most requested by users. Most of them are designed to reduce friction. The killer feature of NoiseCraft will be grouping, which will allow users to create new custom modules that can be reused. This will allow project to scale to much larger sizes much easier. For example, users could create a reusable stereo delay module, a 4-channel mixer, or a kick or snare sound modules that other users can then copy and paste into their own projects.

Tentative list:

  • Select and move multiple nodes at once
  • Delete one or more selected nodes
  • Undo
  • Redo
  • Ability to group nodes into custom user-created modules
  • Ability to save projects into local files
    • Local saving would allow people to easily run local instances, or implement tools
    • Fosters more user trust than having us own their data
  • Edges should have different colors to make them easier to follow visually
  • Edges could potentially be curved lines, improve visibility
  • Copy and paste one or more selected nodes
    • We probably want to design this so we could copy and paste from another project. That would require using the paste buffer API.
    • Module (group) nodes will have to be copied recursively so all nodes inside get a unique id
  • Minimize audio glitches by rendering audio in a background thread
  • Ability to expose knobs inside custom modules in the UI
    • If you group multiple nodes, some of the nodes you group could be knobs, you would then be able to pick which knobs will be visible in your new custom module node
  • Light node that flashes when the incoming signal is > 0. This is like a little LED indicator.
    • The color of each light could be user-configurable.
  • GateSeq (gate sequencer) with one separate gate output for each row in the sequencer.
    • This will make it much easier to build something like a drum machine.
  • Polyphonic MIDI input node
    • Can have a node config option to control the number of voices exposed
    • Each voice gets its own gate/trigger. Just connect multiple voice modules.
  • Implement new Browse page (i.e. /browse)
  • Implement new Help page
  • Implement terms of service page
    • Have people agree when creating an account
    • Should protect ourself, no warranty, potential risk of data leaks, etc.

Invalid project id kills the server.

Invalid project id in url kills server.

steps to reproduce:

start noisecraft application.

enter any invalid project id in the following way:
http://localhost:7773/999999

as a result server will crush with the following error:

node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "project not found".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Potential expected behaviour:
In case of invalid project id is entered - the front end should display an error message, server should keep on working.

ClockDiv node

I think it would be really useful to have a node that can take an input clock signal and divide it by some integer divider, eg: 1:2, 1:3, 1:4, ... 1:24. The node should probably just have an "in" port and an "out" port along with a drop-down menu to select the divider value. This node would allow things like having different sequencers that play patterns at different rates.

This should work by counting the rising edges of the clocks at the input, that is the number of times it crosses from less than 0 to greater than zero. Clock signals are square waves that oscillate between -1 and 1.

Bug preventing from creating new nodes on Chrome

Hi! I'm really interested in trying Noisecraft, however I encountered a roadblock issue.
I cannot add new nodes on Chrome (using version 91.0.4472.114). On Firefox, I can add them with no problem.
When I try to add a node, this exception comes up:

Uncaught DOMException:
Failed to execute 'releasePointerCapture' on 'Element': No active pointer with the given id is found. at Editor.onClick (http://localhost:7773/public/editor.js:119:28) onClick @ editor.js:119

Store nodes in an array instead of an object/dict for performance

Right now, in the state, the nodes are in an object/dictionary that maps node ids to nodes. I've been working on the audio code, and thinking about that this morning, and I think this is probably suboptimal for performance.

It's not going to matter for the model and frontend, but the audio thread needs to be able to access audio nodes based on their ID. The problem is that when we add and delete nodes to a JS object or if the object grows very large, at some point, the JavaScript JIT compiler may switch to using a hash map to store those objects, and hash accesses are slow. Also, because of JS semantics, the keys we use to index objects are strings. So if we have a lot of nodes, at some point, the JS engine may switch to having state.nodes be a hash map, and then the audio thread will try to look up nodes in this hash map for every sample, which is a huge waste of CPU cycles.

The solution that comes to my mind is to make nodes an array. That way we can guarantee that our nodeId values are always integers, and that array accesses are always fast. This is going to make our life a little bit more difficult in some ways because we can no longer allocate ids just by doing nextId++. We're going to want a model.getNextId() method which maintains a model.freeIdList which gets refilled when nodes get deleted. That also means we probably want a model.deleteNode(nodeId) method.

Another mild annoyance is when iterating over nodes, we'll have to have a null check:

for (let nodeId in state.nodes)
{
    // Check that the node is not null because this id could have been deleted
    if (!state.nodes[nodeId])
        continue;

    // Do stuff with the node
}

So yeah, mildly annoying refactoring, and I apologize because I just suggested you work on copying and pasting @alexlitty, but this refactoring may slightly get in your way. I can take this one and try to get it done tonight. Thoughts?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.