From e899e1cc8e03a16f992794813fd11073d5fe881b Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Tue, 5 Aug 2025 12:41:18 +0200 Subject: [PATCH 01/31] Add p5js mode PoC into Processing repo Allow console output in Electron renderer process to be sent to main process --- p5js/build.gradle.kts | 74 ++ .../examples/Basics/FileSystem/FileSystem.js | 23 + p5js/library/keywords.txt | 938 ++++++++++++++++++ p5js/library/mode.properties | 12 + p5js/src/main/kotlin/p5js.kt | 30 + p5js/src/main/kotlin/p5jsEditor.kt | 236 +++++ p5js/src/main/kotlin/p5jsEditorToolbar.kt | 26 + p5js/src/main/kotlin/p5jsFormatter.kt | 9 + p5js/src/main/kotlin/p5jsInputHandler.kt | 24 + p5js/src/main/kotlin/packageJSON.kt | 38 + settings.gradle.kts | 5 +- 11 files changed, 1414 insertions(+), 1 deletion(-) create mode 100644 p5js/build.gradle.kts create mode 100644 p5js/library/examples/Basics/FileSystem/FileSystem.js create mode 100644 p5js/library/keywords.txt create mode 100644 p5js/library/mode.properties create mode 100644 p5js/src/main/kotlin/p5js.kt create mode 100644 p5js/src/main/kotlin/p5jsEditor.kt create mode 100644 p5js/src/main/kotlin/p5jsEditorToolbar.kt create mode 100644 p5js/src/main/kotlin/p5jsFormatter.kt create mode 100644 p5js/src/main/kotlin/p5jsInputHandler.kt create mode 100644 p5js/src/main/kotlin/packageJSON.kt diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts new file mode 100644 index 0000000000..e4a0dd1345 --- /dev/null +++ b/p5js/build.gradle.kts @@ -0,0 +1,74 @@ +plugins { + kotlin("jvm") version "2.0.20" + kotlin("plugin.serialization") version "1.9.0" +} + +group = "org.processing" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() + google() + maven { url = uri("https://jogamp.org/deployment/maven") } +} + +dependencies { +// compileOnly(files("/Applications/Processing.app/Contents/Java/pde.jar/**/")) + implementation(project(":core")) + implementation(project(":app")) + + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") + + testImplementation(kotlin("test")) +} + +project(":app").tasks.named("run").configure { + dependsOn(tasks.named("installLibrary")) +} +tasks.create("copyJars") { + group = "processing" + dependsOn(tasks.jar) + from(layout.buildDirectory.dir("libs")){ + include("**/*.jar") + } + from(configurations.compileClasspath) + into(layout.buildDirectory.dir("library/mode")) + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} +tasks.create("createLibrary") { + group = "processing" + from("library") + into(layout.buildDirectory.dir("library")) +} +tasks.create("installLibrary") { + group = "processing" + dependsOn(tasks.named("createLibrary")) + dependsOn(tasks.named("copyJars")) + from(layout.buildDirectory.dir("library")) + into("${System.getProperty("user.home")}/sketchbook/modes/p5js") +} +//tasks.register("runProcessing") { +// dependsOn(tasks.named("installLibrary")) +// group = "processing" +// classpath = files(fileTree("/Applications/Processing.app/Contents/Java/"){ +// include("*.jar") +// }) +// mainClass.set("processing.app.Base") // Your main class +// +// // Optional: Add arguments if needed +// args = listOf("") +// +// // Optional: Add JVM arguments if needed +// jvmArgs = listOf("-Xmx2g") +//} +tasks.jar { + archiveVersion.set("") + archiveBaseName.set("p5js") +} +tasks.test { + useJUnitPlatform() +} +kotlin { + jvmToolchain(17) +} \ No newline at end of file diff --git a/p5js/library/examples/Basics/FileSystem/FileSystem.js b/p5js/library/examples/Basics/FileSystem/FileSystem.js new file mode 100644 index 0000000000..73c5bec1d2 --- /dev/null +++ b/p5js/library/examples/Basics/FileSystem/FileSystem.js @@ -0,0 +1,23 @@ +const fs = require('fs'); + +let version +function setup() { + createCanvas(400, 400); + + // Read a file (for example, package.json) + fs.readFile('package.json', 'utf8', (err, data) => { + if (err) { + console.error('Error reading file:', err); + return; + } + var json = JSON.parse(data) + version = json.version; + }); +} + +function draw() { + background(220); + + textAlign(CENTER) + text(`I'm version ${version}`, width / 2, height / 2) +} diff --git a/p5js/library/keywords.txt b/p5js/library/keywords.txt new file mode 100644 index 0000000000..16400d61d0 --- /dev/null +++ b/p5js/library/keywords.txt @@ -0,0 +1,938 @@ +# THE TEXT BELOW IS HAND WRITTEN AND FOUND IN THE FILE "keywords_base.txt" +# IN THE PROCESSING-DOCS REPO. DON'T EDITS THE keywords.txt FILE DIRECTLY. + +# For an explanation of these tags, see Token.java +# trunk/processing/app/src/processing/app/syntax/Token.java + +ADD LITERAL2 blend_ +ALIGN_CENTER LITERAL2 +ALIGN_LEFT LITERAL2 +ALIGN_RIGHT LITERAL2 +ALPHA LITERAL2 +ALPHA_MASK LITERAL2 +ALT LITERAL2 +AMBIENT LITERAL2 +ARC LITERAL2 createShape_ +ARROW LITERAL2 cursor_ +ARGB LITERAL2 +BACKSPACE LITERAL2 keyCode +BASELINE LITERAL2 textAlign_ +BEVEL LITERAL2 strokeJoin_ +BLEND LITERAL2 blend_ +BLUE_MASK LITERAL2 +BLUR LITERAL2 filter_ +BOTTOM LITERAL2 textAlign_ +BOX LITERAL2 createShape_ +BURN LITERAL2 blend_ +CENTER LITERAL2 +CHATTER LITERAL2 +CHORD LITERAL2 arc_ +CLAMP LITERAL2 +CLICK LITERAL2 +CLOSE LITERAL2 +CMYK LITERAL2 +CODED LITERAL2 key +COMPLAINT LITERAL2 +COMPOSITE LITERAL2 +COMPONENT LITERAL2 +CONCAVE_POLYGON LITERAL2 +CONTROL LITERAL2 +CONVEX_POLYGON LITERAL2 +CORNER LITERAL2 textAlign_ +CORNERS LITERAL2 +CROSS LITERAL2 cursor_ +CUSTOM LITERAL2 +DARKEST LITERAL2 blend_ +DEGREES LITERAL2 +DEG_TO_RAD LITERAL2 +DELETE LITERAL2 +DIAMETER LITERAL2 +DIFFERENCE LITERAL2 blend_ +DIFFUSE LITERAL2 +DILATE LITERAL2 filter_ +DIRECTIONAL LITERAL2 +DISABLE_ACCURATE_2D LITERAL2 +DISABLE_DEPTH_MASK LITERAL2 +DISABLE_DEPTH_SORT LITERAL2 +DISABLE_DEPTH_TEST LITERAL2 +DISABLE_NATIVE_FONTS LITERAL2 +DISABLE_OPENGL_ERRORS LITERAL2 +DISABLE_PURE_STROKE LITERAL2 +DISABLE_TEXTURE_MIPMAPS LITERAL2 +DISABLE_TRANSFORM_CACHE LITERAL2 +DISABLE_STROKE_PERSPECTIVE LITERAL2 +DISABLED LITERAL2 +DODGE LITERAL2 blend_ +DOWN LITERAL2 keyCode +DRAG LITERAL2 +DXF LITERAL2 size_ +ELLIPSE LITERAL2 createShape_ +ENABLE_ACCURATE_2D LITERAL2 +ENABLE_DEPTH_MASK LITERAL2 +ENABLE_DEPTH_SORT LITERAL2 +ENABLE_DEPTH_TEST LITERAL2 +ENABLE_NATIVE_FONTS LITERAL2 +ENABLE_OPENGL_ERRORS LITERAL2 +ENABLE_PURE_STROKE LITERAL2 +ENABLE_TEXTURE_MIPMAPS LITERAL2 +ENABLE_TRANSFORM_CACHE LITERAL2 +ENABLE_STROKE_PERSPECTIVE LITERAL2 +ENTER LITERAL2 keyCode +EPSILON LITERAL2 +ERODE LITERAL2 filter_ +ESC LITERAL2 keyCode +EXCLUSION LITERAL2 blend_ +EXIT LITERAL2 +FX2D LITERAL2 size_ +GIF LITERAL2 +GRAY LITERAL2 filter_ +GREEN_MASK LITERAL2 +GROUP LITERAL2 +HALF LITERAL2 +HALF_PI LITERAL2 HALF_PI +HAND LITERAL2 cursor_ +HARD_LIGHT LITERAL2 blend_ +HINT_COUNT LITERAL2 +HSB LITERAL2 colorMode_ +IMAGE LITERAL2 textureMode_ +INVERT LITERAL2 filter_ +JAVA2D LITERAL2 size_ +JPEG LITERAL2 +LEFT LITERAL2 keyCode +LIGHTEST LITERAL2 blend_ +LINE LITERAL2 createShape_ +LINES LITERAL2 beginShape_ +LINUX LITERAL2 +MACOSX LITERAL2 +MAX_FLOAT LITERAL2 +MAX_INT LITERAL2 +MIN_FLOAT LITERAL2 +MIN_INT LITERAL2 +MITER LITERAL2 stokeJoin_ +MODEL LITERAL2 textMode_ +MOVE LITERAL2 cursor_ +MULTIPLY LITERAL2 blend_ +NORMAL LITERAL2 +NORMALIZED LITERAL2 textureMode_ +NO_DEPTH_TEST LITERAL2 +NTSC LITERAL2 +ONE LITERAL2 +OPAQUE LITERAL2 filter_ +OPEN LITERAL2 +ORTHOGRAPHIC LITERAL2 +OVERLAY LITERAL2 blend_ +PAL LITERAL2 +PDF LITERAL2 size_ +P2D LITERAL2 size_ +P3D LITERAL2 size_ +PERSPECTIVE LITERAL2 +PI LITERAL2 PI +PIE LITERAL2 +PIXEL_CENTER LITERAL2 +POINT LITERAL2 +POINTS LITERAL2 +POSTERIZE LITERAL2 filter_ +PRESS LITERAL2 +PROBLEM LITERAL2 +PROJECT LITERAL2 strokeCap_ +QUAD LITERAL2 createShape_ +QUAD_STRIP LITERAL2 beginShape_ +QUADS LITERAL2 beginShape_ +QUARTER_PI LITERAL2 QUARTER_PI +RAD_TO_DEG LITERAL2 +RADIUS LITERAL2 +RADIANS LITERAL2 +RECT LITERAL2 +RED_MASK LITERAL2 +RELEASE LITERAL2 +REPEAT LITERAL2 +REPLACE LITERAL2 +RETURN LITERAL2 +RGB LITERAL2 colorMode_ +RIGHT LITERAL2 keyCode +ROUND LITERAL2 strokeCap_ +SCREEN LITERAL2 blend_ +SECAM LITERAL2 +SHAPE LITERAL2 textMode_ +SHIFT LITERAL2 +SPAN LITERAL2 fullScreen_ +SPECULAR LITERAL2 +SPHERE LITERAL2 createShape_ +SOFT_LIGHT LITERAL2 blend_ +SQUARE LITERAL2 strokeCap_ +SUBTRACT LITERAL2 blend_ +SVG LITERAL2 +SVIDEO LITERAL2 +TAB LITERAL2 keyCode +TARGA LITERAL2 +TAU LITERAL2 TAU +TEXT LITERAL2 cursor_ +TFF LITERAL2 +THIRD_PI LITERAL2 +THRESHOLD LITERAL2 filter_ +TIFF LITERAL2 +TOP LITERAL2 textAlign_ +TRIANGLE LITERAL2 createShape_ +TRIANGLE_FAN LITERAL2 beginShape_ +TRIANGLES LITERAL2 beginShape_ +TRIANGLE_STRIP LITERAL2 beginShape_ +TUNER LITERAL2 +TWO LITERAL2 +TWO_PI LITERAL2 TWO_PI +UP LITERAL2 keyCode +WAIT LITERAL2 cursor_ +WHITESPACE LITERAL2 + + +# Java keywords (void, import, , etc.) + +abstract KEYWORD1 +break KEYWORD1 break +class KEYWORD1 class +continue KEYWORD1 continue +default KEYWORD1 default +enum KEYWORD1 +extends KEYWORD1 extends +function KEYWORD1 +false KEYWORD1 false +final KEYWORD1 final +finally KEYWORD1 +implements KEYWORD1 implements +import KEYWORD1 import +instanceof KEYWORD1 +interface KEYWORD1 +let KEYWORD1 +const KEYWORD1 +native KEYWORD1 +new KEYWORD1 new +null KEYWORD1 null +package KEYWORD1 +private KEYWORD1 private +protected KEYWORD1 +public KEYWORD1 public +static KEYWORD1 static +strictfp KEYWORD1 +throws KEYWORD1 +transient KEYWORD1 +true KEYWORD1 true +void KEYWORD1 void +volatile KEYWORD1 + + +# Java keywords which can be followed by a parenthesis + +assert KEYWORD6 +case KEYWORD6 case +return KEYWORD6 return +super KEYWORD6 super +this KEYWORD6 this +throw KEYWORD6 + + +# Datatypes + +Array KEYWORD5 Array +ArrayList KEYWORD5 ArrayList +Boolean KEYWORD5 +Byte KEYWORD5 +BufferedReader KEYWORD5 BufferedReader +Character KEYWORD5 +Class KEYWORD5 class +Double KEYWORD5 +Float KEYWORD5 +Integer KEYWORD5 +HashMap KEYWORD5 HashMap +PrintWriter KEYWORD5 PrintWriter +String KEYWORD5 String +StringBuffer KEYWORD5 +StringBuilder KEYWORD5 +Thread KEYWORD5 +boolean KEYWORD5 boolean +byte KEYWORD5 byte +char KEYWORD5 char +color KEYWORD5 color_datatype +double KEYWORD5 double +float KEYWORD5 float +int KEYWORD5 int +long KEYWORD5 long +short KEYWORD5 + + +# Flow structures + +catch KEYWORD3 catch +do KEYWORD3 +for KEYWORD3 for +if KEYWORD3 if +else KEYWORD3 else +switch KEYWORD3 switch +synchronized KEYWORD3 +while KEYWORD3 while +try KEYWORD3 try + +catch FUNCTION3 catch +do FUNCTION3 +for FUNCTION3 for +if FUNCTION3 if +#else FUNCTION3 else +switch FUNCTION3 switch +synchronized FUNCTION3 +while FUNCTION3 while +#try FUNCTION3 try + + +# These items are a part of Processing but, but pages don't generate + +boolean FUNCTION1 booleanconvert_ +byte FUNCTION1 byteconvert_ +cache FUNCTION2 +char FUNCTION1 charconvert_ +start FUNCTION1 +stop FUNCTION1 +breakShape FUNCTION1 +createPath FUNCTION1 +float FUNCTION1 floatconvert_ +int FUNCTION1 intconvert_ +str FUNCTION1 strconvert_ +loadMatrix FUNCTION1 +parseBoolean FUNCTION1 +parseByte FUNCTION1 +parseChar FUNCTION1 +parseFloat FUNCTION1 +parseInt FUNCTION1 +saveFile FUNCTION1 +savePath FUNCTION1 +sketchFile FUNCTION1 +sketchPath FUNCTION1 + +readLine FUNCTION2 BufferedReader_readLine_ +close FUNCTION2 PrintWriter_close_ +flush FUNCTION2 PrintWriter_flush_ +print FUNCTION2 PrintWriter_print_ +println FUNCTION2 PrintWriter_println_ +charAt FUNCTION2 String_charAt_ +equals FUNCTION2 String_equals_ +indexOf FUNCTION2 String_indexOf_ +length FUNCTION2 String_length_ +substring FUNCTION2 String_substring_ +toLowerCase FUNCTION2 String_toLowerCase_ +toUpperCase FUNCTION2 String_toUpperCase_ + +getDouble FUNCTION2 +getLong FUNCTION2 +getColumnTitles FUNCTION2 +getColumnTypes FUNCTION2 +getColumnType FUNCTION2 +setDouble FUNCTION2 +setLong FUNCTION2 + +length KEYWORD2 String + + +# Temporary additions 3 September 2012 as the reference is getting updated +#end FUNCTION1 +#addChild FUNCTION1 + +# Operators are without KEYWORDS + ++= addassign ++ addition +[] arrayaccess += assign +& bitwiseAND +| bitwiseOR +, comma +// comment +? conditional +{} curlybraces +-- decrement +/ divide +/= divideassign +/** doccomment +. dot +== equality +> greaterthan +>= greaterthanorequalto +++ increment +!= inequality +<< leftshift +< lessthan +<= lessthanorequalto +&& logicalAND +! logicalNOT +|| logicalOR +- minus +% modulo +/* multilinecomment +* multiply +*= multiplyassign +() parentheses +>> rightshift +; semicolon +-= subtractassign + +# Suppressed from Generate to avoid conflicts with variables inside methods + +width KEYWORD4 width_ +height KEYWORD4 height_ + +PVector FUNCTION1 PVector +ArrayList FUNCTION1 ArrayList +HashMap FUNCTION1 HashMap + +# pixelHeight is not generating correctly: https://github.com/processing/processing-docs/issues/260 + +pixelHeight KEYWORD4 pixelHeight + + +# THE TEXT ABOVE IS HAND-WRITTEN AND FOUND IN THE FILE "keywords_base.txt" in processing/processing-docs/generate +# +# THE TEXT BELOW IS AUTO-GENERATED +# +# SO +# DON'T +# TOUCH +# IT + + +abs FUNCTION1 abs_ +acos FUNCTION1 acos_ +alpha FUNCTION1 alpha_ +ambient FUNCTION1 ambient_ +ambientLight FUNCTION1 ambientLight_ +append FUNCTION1 append_ +applyMatrix FUNCTION1 applyMatrix_ +arc FUNCTION1 arc_ +arrayCopy FUNCTION1 arrayCopy_ +asin FUNCTION1 asin_ +atan FUNCTION1 atan_ +atan2 FUNCTION1 atan2_ +background FUNCTION1 background_ +beginCamera FUNCTION1 beginCamera_ +beginContour FUNCTION1 beginContour_ +beginRaw FUNCTION1 beginRaw_ +beginRecord FUNCTION1 beginRecord_ +beginShape FUNCTION1 beginShape_ +bezier FUNCTION1 bezier_ +bezierDetail FUNCTION1 bezierDetail_ +bezierPoint FUNCTION1 bezierPoint_ +bezierTangent FUNCTION1 bezierTangent_ +bezierVertex FUNCTION1 bezierVertex_ +binary FUNCTION1 binary_ +blend FUNCTION1 blend_ +blendColor FUNCTION1 blendColor_ +blendMode FUNCTION1 blendMode_ +blue FUNCTION1 blue_ +box FUNCTION1 box_ +brightness FUNCTION1 brightness_ +camera FUNCTION1 camera_ +ceil FUNCTION1 ceil_ +clear FUNCTION1 clear_ +clip FUNCTION1 clip_ +color FUNCTION1 color_ +colorMode FUNCTION1 colorMode_ +concat FUNCTION1 concat_ +constrain FUNCTION1 constrain_ +copy FUNCTION1 copy_ +cos FUNCTION1 cos_ +createFont FUNCTION1 createFont_ +createGraphics FUNCTION1 createGraphics_ +createImage FUNCTION1 createImage_ +createInput FUNCTION1 createInput_ +createOutput FUNCTION1 createOutput_ +createReader FUNCTION1 createReader_ +createShape FUNCTION1 createShape_ +createWriter FUNCTION1 createWriter_ +cursor FUNCTION1 cursor_ +curve FUNCTION1 curve_ +curveDetail FUNCTION1 curveDetail_ +curvePoint FUNCTION1 curvePoint_ +curveTangent FUNCTION1 curveTangent_ +curveTightness FUNCTION1 curveTightness_ +curveVertex FUNCTION1 curveVertex_ +createCanvas FUNCTION1 createCanvas_ +day FUNCTION1 day_ +degrees FUNCTION1 degrees_ +delay FUNCTION1 delay_ +directionalLight FUNCTION1 directionalLight_ +displayDensity FUNCTION1 displayDensity_ +displayHeight KEYWORD4 displayHeight +displayWidth KEYWORD4 displayWidth +dist FUNCTION1 dist_ +draw FUNCTION4 draw +ellipse FUNCTION1 ellipse_ +ellipseMode FUNCTION1 ellipseMode_ +emissive FUNCTION1 emissive_ +endCamera FUNCTION1 endCamera_ +endContour FUNCTION1 endContour_ +endRaw FUNCTION1 endRaw_ +endRecord FUNCTION1 endRecord_ +endShape FUNCTION1 endShape_ +exit FUNCTION1 exit_ +exp FUNCTION1 exp_ +expand FUNCTION1 expand_ +fill FUNCTION1 fill_ +filter FUNCTION1 filter_ +FloatDict KEYWORD5 FloatDict +add FUNCTION2 FloatDict_add_ +clear FUNCTION2 FloatDict_clear_ +div FUNCTION2 FloatDict_div_ +get FUNCTION2 FloatDict_get_ +hasKey FUNCTION2 FloatDict_hasKey_ +keyArray FUNCTION2 FloatDict_keyArray_ +keys FUNCTION2 FloatDict_keys_ +mult FUNCTION2 FloatDict_mult_ +remove FUNCTION2 FloatDict_remove_ +set FUNCTION2 FloatDict_set_ +size FUNCTION2 FloatDict_size_ +sortKeys FUNCTION2 FloatDict_sortKeys_ +sortKeysReverse FUNCTION2 FloatDict_sortKeysReverse_ +sortValues FUNCTION2 FloatDict_sortValues_ +sortValuesReverse FUNCTION2 FloatDict_sortValuesReverse_ +sub FUNCTION2 FloatDict_sub_ +valueArray FUNCTION2 FloatDict_valueArray_ +values FUNCTION2 FloatDict_values_ +FloatList KEYWORD5 FloatList +add FUNCTION2 FloatList_add_ +append FUNCTION2 FloatList_append_ +array FUNCTION2 FloatList_array_ +clear FUNCTION2 FloatList_clear_ +div FUNCTION2 FloatList_div_ +get FUNCTION2 FloatList_get_ +hasValue FUNCTION2 FloatList_hasValue_ +max FUNCTION2 FloatList_max_ +min FUNCTION2 FloatList_min_ +mult FUNCTION2 FloatList_mult_ +remove FUNCTION2 FloatList_remove_ +reverse FUNCTION2 FloatList_reverse_ +set FUNCTION2 FloatList_set_ +shuffle FUNCTION2 FloatList_shuffle_ +size FUNCTION2 FloatList_size_ +sort FUNCTION2 FloatList_sort_ +sortReverse FUNCTION2 FloatList_sortReverse_ +sub FUNCTION2 FloatList_sub_ +floor FUNCTION1 floor_ +focused KEYWORD4 focused +frameCount KEYWORD4 frameCount +frameRate KEYWORD4 frameRate +frameRate FUNCTION1 frameRate_ +frustum FUNCTION1 frustum_ +fullScreen FUNCTION1 fullScreen_ +get FUNCTION1 get_ +green FUNCTION1 green_ +HALF_PI LITERAL2 HALF_PI +hex FUNCTION1 hex_ +hint FUNCTION1 hint_ +hour FUNCTION1 hour_ +hue FUNCTION1 hue_ +image FUNCTION1 image_ +imageMode FUNCTION1 imageMode_ +IntDict KEYWORD5 IntDict +add FUNCTION2 IntDict_add_ +clear FUNCTION2 IntDict_clear_ +div FUNCTION2 IntDict_div_ +get FUNCTION2 IntDict_get_ +hasKey FUNCTION2 IntDict_hasKey_ +increment FUNCTION2 IntDict_increment_ +keyArray FUNCTION2 IntDict_keyArray_ +keys FUNCTION2 IntDict_keys_ +mult FUNCTION2 IntDict_mult_ +remove FUNCTION2 IntDict_remove_ +set FUNCTION2 IntDict_set_ +size FUNCTION2 IntDict_size_ +sortKeys FUNCTION2 IntDict_sortKeys_ +sortKeysReverse FUNCTION2 IntDict_sortKeysReverse_ +sortValues FUNCTION2 IntDict_sortValues_ +sortValuesReverse FUNCTION2 IntDict_sortValuesReverse_ +sub FUNCTION2 IntDict_sub_ +valueArray FUNCTION2 IntDict_valueArray_ +values FUNCTION2 IntDict_values_ +IntList KEYWORD5 IntList +add FUNCTION2 IntList_add_ +append FUNCTION2 IntList_append_ +array FUNCTION2 IntList_array_ +clear FUNCTION2 IntList_clear_ +div FUNCTION2 IntList_div_ +get FUNCTION2 IntList_get_ +hasValue FUNCTION2 IntList_hasValue_ +increment FUNCTION2 IntList_increment_ +max FUNCTION2 IntList_max_ +min FUNCTION2 IntList_min_ +mult FUNCTION2 IntList_mult_ +remove FUNCTION2 IntList_remove_ +reverse FUNCTION2 IntList_reverse_ +set FUNCTION2 IntList_set_ +shuffle FUNCTION2 IntList_shuffle_ +size FUNCTION2 IntList_size_ +sort FUNCTION2 IntList_sort_ +sortReverse FUNCTION2 IntList_sortReverse_ +sub FUNCTION2 IntList_sub_ +join FUNCTION1 join_ +JSONArray KEYWORD5 JSONArray +append FUNCTION2 JSONArray_append_ +getBoolean FUNCTION2 JSONArray_getBoolean_ +getFloat FUNCTION2 JSONArray_getFloat_ +getInt FUNCTION2 JSONArray_getInt_ +getIntArray FUNCTION2 JSONArray_getIntArray_ +getJSONArray FUNCTION2 JSONArray_getJSONArray_ +getJSONObject FUNCTION2 JSONArray_getJSONObject_ +getString FUNCTION2 JSONArray_getString_ +getStringArray FUNCTION2 JSONArray_getStringArray_ +isNull FUNCTION2 JSONArray_isNull_ +remove FUNCTION2 JSONArray_remove_ +setBoolean FUNCTION2 JSONArray_setBoolean_ +setFloat FUNCTION2 JSONArray_setFloat_ +setInt FUNCTION2 JSONArray_setInt_ +setJSONArray FUNCTION2 JSONArray_setJSONArray_ +setJSONObject FUNCTION2 JSONArray_setJSONObject_ +setString FUNCTION2 JSONArray_setString_ +size FUNCTION2 JSONArray_size_ +JSONObject KEYWORD5 JSONObject +getBoolean FUNCTION2 JSONObject_getBoolean_ +getFloat FUNCTION2 JSONObject_getFloat_ +getInt FUNCTION2 JSONObject_getInt_ +getJSONArray FUNCTION2 JSONObject_getJSONArray_ +getJSONObject FUNCTION2 JSONObject_getJSONObject_ +getString FUNCTION2 JSONObject_getString_ +isNull FUNCTION2 JSONObject_isNull_ +setBoolean FUNCTION2 JSONObject_setBoolean_ +setFloat FUNCTION2 JSONObject_setFloat_ +setInt FUNCTION2 JSONObject_setInt_ +setJSONArray FUNCTION2 JSONObject_setJSONArray_ +setJSONObject FUNCTION2 JSONObject_setJSONObject_ +setString FUNCTION2 JSONObject_setString_ +key KEYWORD4 key +keyCode KEYWORD4 keyCode +keyPressed FUNCTION4 keyPressed +keyPressed KEYWORD4 keyPressed +keyReleased FUNCTION4 keyReleased +keyTyped FUNCTION4 keyTyped +launch FUNCTION1 launch_ +lerp FUNCTION1 lerp_ +lerpColor FUNCTION1 lerpColor_ +lightFalloff FUNCTION1 lightFalloff_ +lights FUNCTION1 lights_ +lightSpecular FUNCTION1 lightSpecular_ +line FUNCTION1 line_ +loadBytes FUNCTION1 loadBytes_ +loadFont FUNCTION1 loadFont_ +loadImage FUNCTION1 loadImage_ +loadJSONArray FUNCTION1 loadJSONArray_ +loadJSONObject FUNCTION1 loadJSONObject_ +loadPixels FUNCTION1 loadPixels_ +loadShader FUNCTION1 loadShader_ +loadShape FUNCTION1 loadShape_ +loadStrings FUNCTION1 loadStrings_ +loadTable FUNCTION1 loadTable_ +loadXML FUNCTION1 loadXML_ +log FUNCTION1 log_ +loop FUNCTION1 loop_ +mag FUNCTION1 mag_ +map FUNCTION1 map_ +match FUNCTION1 match_ +matchAll FUNCTION1 matchAll_ +max FUNCTION1 max_ +millis FUNCTION1 millis_ +min FUNCTION1 min_ +minute FUNCTION1 minute_ +modelX FUNCTION1 modelX_ +modelY FUNCTION1 modelY_ +modelZ FUNCTION1 modelZ_ +month FUNCTION1 month_ +mouseButton KEYWORD4 mouseButton +mouseClicked FUNCTION4 mouseClicked +mouseDragged FUNCTION4 mouseDragged +mouseMoved FUNCTION4 mouseMoved +mousePressed FUNCTION4 mousePressed +mousePressed KEYWORD4 mousePressed +mouseReleased FUNCTION4 mouseReleased +mouseWheel FUNCTION4 mouseWheel +mouseX KEYWORD4 mouseX +mouseY KEYWORD4 mouseY +nf FUNCTION1 nf_ +nfc FUNCTION1 nfc_ +nfp FUNCTION1 nfp_ +nfs FUNCTION1 nfs_ +noClip FUNCTION1 noClip_ +noCursor FUNCTION1 noCursor_ +noFill FUNCTION1 noFill_ +noise FUNCTION1 noise_ +noiseDetail FUNCTION1 noiseDetail_ +noiseSeed FUNCTION1 noiseSeed_ +noLights FUNCTION1 noLights_ +noLoop FUNCTION1 noLoop_ +norm FUNCTION1 norm_ +normal FUNCTION1 normal_ +noSmooth FUNCTION1 noSmooth_ +noStroke FUNCTION1 noStroke_ +noTint FUNCTION1 noTint_ +ortho FUNCTION1 ortho_ +parseJSONArray FUNCTION1 parseJSONArray_ +parseJSONObject FUNCTION1 parseJSONObject_ +parseXML FUNCTION1 parseXML_ +perspective FUNCTION1 perspective_ +PFont KEYWORD5 PFont +list FUNCTION1 PFont_list_ +PGraphics KEYWORD5 PGraphics +beginDraw FUNCTION2 PGraphics_beginDraw_ +endDraw FUNCTION2 PGraphics_endDraw_ +PI LITERAL2 PI +PImage KEYWORD5 PImage +blend FUNCTION2 PImage_blend_ +copy FUNCTION2 PImage_copy_ +filter FUNCTION2 PImage_filter_ +get FUNCTION2 PImage_get_ +loadPixels FUNCTION2 PImage_loadPixels_ +mask FUNCTION2 PImage_mask_ +pixels KEYWORD2 PImage_pixels +resize FUNCTION2 PImage_resize_ +save FUNCTION2 PImage_save_ +set FUNCTION2 PImage_set_ +updatePixels FUNCTION2 PImage_updatePixels_ +pixelDensity FUNCTION1 pixelDensity_ +pixelHeight FUNCTION1 pixelHeight_ +pixels KEYWORD4 pixels +pixelWidth KEYWORD4 pixelWidth +pmouseX KEYWORD4 pmouseX +pmouseY KEYWORD4 pmouseY +point FUNCTION1 point_ +pointLight FUNCTION1 pointLight_ +popMatrix FUNCTION1 popMatrix_ +popStyle FUNCTION1 popStyle_ +pow FUNCTION1 pow_ +print FUNCTION1 print_ +printArray FUNCTION1 printArray_ +printCamera FUNCTION1 printCamera_ +println FUNCTION1 println_ +printMatrix FUNCTION1 printMatrix_ +printProjection FUNCTION1 printProjection_ +PShader KEYWORD5 PShader +PShader FUNCTION2 PShader_set_ +PShape KEYWORD5 PShape +addChild FUNCTION2 PShape_addChild_ +beginContour FUNCTION2 PShape_beginContour_ +beginShape FUNCTION2 PShape_beginShape_ +disableStyle FUNCTION2 PShape_disableStyle_ +enableStyle FUNCTION2 PShape_enableStyle_ +endContour FUNCTION2 PShape_endContour_ +endShape FUNCTION2 PShape_endShape_ +getChild FUNCTION2 PShape_getChild_ +getChildCount FUNCTION2 PShape_getChildCount_ +getVertex FUNCTION2 PShape_getVertex_ +getVertexCount FUNCTION2 PShape_getVertexCount_ +isVisible FUNCTION2 PShape_isVisible_ +resetMatrix FUNCTION2 PShape_resetMatrix_ +rotate FUNCTION2 PShape_rotate_ +rotateX FUNCTION2 PShape_rotateX_ +rotateY FUNCTION2 PShape_rotateY_ +rotateZ FUNCTION2 PShape_rotateZ_ +scale FUNCTION2 PShape_scale_ +setFill FUNCTION2 PShape_setFill_ +setStroke FUNCTION2 PShape_setStroke_ +setVertex FUNCTION2 PShape_setVertex_ +setVisible FUNCTION2 PShape_setVisible_ +translate FUNCTION2 PShape_translate_ +pushMatrix FUNCTION1 pushMatrix_ +pushStyle FUNCTION1 pushStyle_ +PVector KEYWORD5 PVector +add FUNCTION2 PVector_add_ +angleBetween FUNCTION2 PVector_angleBetween_ +array FUNCTION2 PVector_array_ +copy FUNCTION2 PVector_copy_ +cross FUNCTION2 PVector_cross_ +dist FUNCTION2 PVector_dist_ +div FUNCTION2 PVector_div_ +dot FUNCTION2 PVector_dot_ +fromAngle FUNCTION2 PVector_fromAngle_ +get FUNCTION2 PVector_get_ +heading FUNCTION2 PVector_heading_ +lerp FUNCTION2 PVector_lerp_ +limit FUNCTION2 PVector_limit_ +mag FUNCTION2 PVector_mag_ +magSq FUNCTION2 PVector_magSq_ +mult FUNCTION2 PVector_mult_ +normalize FUNCTION2 PVector_normalize_ +random2D FUNCTION2 PVector_random2D_ +random3D FUNCTION2 PVector_random3D_ +rotate FUNCTION2 PVector_rotate_ +set FUNCTION2 PVector_set_ +setMag FUNCTION2 PVector_setMag_ +sub FUNCTION2 PVector_sub_ +quad FUNCTION1 quad_ +quadraticVertex FUNCTION1 quadraticVertex_ +QUARTER_PI LITERAL2 QUARTER_PI +radians FUNCTION1 radians_ +random FUNCTION1 random_ +randomGaussian FUNCTION1 randomGaussian_ +randomSeed FUNCTION1 randomSeed_ +rect FUNCTION1 rect_ +rectMode FUNCTION1 rectMode_ +red FUNCTION1 red_ +redraw FUNCTION1 redraw_ +requestImage FUNCTION1 requestImage_ +resetMatrix FUNCTION1 resetMatrix_ +resetShader FUNCTION1 resetShader_ +reverse FUNCTION1 reverse_ +rotate FUNCTION1 rotate_ +rotateX FUNCTION1 rotateX_ +rotateY FUNCTION1 rotateY_ +rotateZ FUNCTION1 rotateZ_ +round FUNCTION1 round_ +saturation FUNCTION1 saturation_ +save FUNCTION1 save_ +saveBytes FUNCTION1 saveBytes_ +saveFrame FUNCTION1 saveFrame_ +saveJSONArray FUNCTION1 saveJSONArray_ +saveJSONObject FUNCTION1 saveJSONObject_ +saveStream FUNCTION1 saveStream_ +saveStrings FUNCTION1 saveStrings_ +saveTable FUNCTION1 saveTable_ +saveXML FUNCTION1 saveXML_ +scale FUNCTION1 scale_ +screenX FUNCTION1 screenX_ +screenY FUNCTION1 screenY_ +screenZ FUNCTION1 screenZ_ +second FUNCTION1 second_ +selectFolder FUNCTION1 selectFolder_ +selectInput FUNCTION1 selectInput_ +selectOutput FUNCTION1 selectOutput_ +set FUNCTION1 set_ +settings FUNCTION4 settings +setup FUNCTION4 setup +shader FUNCTION1 shader_ +shape FUNCTION1 shape_ +shapeMode FUNCTION1 shapeMode_ +shearX FUNCTION1 shearX_ +shearY FUNCTION1 shearY_ +shininess FUNCTION1 shininess_ +shorten FUNCTION1 shorten_ +sin FUNCTION1 sin_ +size FUNCTION1 size_ +smooth FUNCTION1 smooth_ +sort FUNCTION1 sort_ +specular FUNCTION1 specular_ +sphere FUNCTION1 sphere_ +sphereDetail FUNCTION1 sphereDetail_ +splice FUNCTION1 splice_ +split FUNCTION1 split_ +splitTokens FUNCTION1 splitTokens_ +spotLight FUNCTION1 spotLight_ +sq FUNCTION1 sq_ +sqrt FUNCTION1 sqrt_ +StringDict KEYWORD5 StringDict +clear FUNCTION2 StringDict_clear_ +get FUNCTION2 StringDict_get_ +hasKey FUNCTION2 StringDict_hasKey_ +keyArray FUNCTION2 StringDict_keyArray_ +keys FUNCTION2 StringDict_keys_ +remove FUNCTION2 StringDict_remove_ +set FUNCTION2 StringDict_set_ +size FUNCTION2 StringDict_size_ +sortKeys FUNCTION2 StringDict_sortKeys_ +sortKeysReverse FUNCTION2 StringDict_sortKeysReverse_ +sortValues FUNCTION2 StringDict_sortValues_ +sortValuesReverse FUNCTION2 StringDict_sortValuesReverse_ +valueArray FUNCTION2 StringDict_valueArray_ +values FUNCTION2 StringDict_values_ +StringList KEYWORD5 StringList +append FUNCTION2 StringList_append_ +array FUNCTION2 StringList_array_ +clear FUNCTION2 StringList_clear_ +get FUNCTION2 StringList_get_ +hasValue FUNCTION2 StringList_hasValue_ +lower FUNCTION2 StringList_lower_ +remove FUNCTION2 StringList_remove_ +reverse FUNCTION2 StringList_reverse_ +set FUNCTION2 StringList_set_ +shuffle FUNCTION2 StringList_shuffle_ +size FUNCTION2 StringList_size_ +sort FUNCTION2 StringList_sort_ +sortReverse FUNCTION2 StringList_sortReverse_ +upper FUNCTION2 StringList_upper_ +stroke FUNCTION1 stroke_ +strokeCap FUNCTION1 strokeCap_ +strokeJoin FUNCTION1 strokeJoin_ +strokeWeight FUNCTION1 strokeWeight_ +subset FUNCTION1 subset_ +Table KEYWORD5 Table +addColumn FUNCTION2 Table_addColumn_ +addRow FUNCTION2 Table_addRow_ +clearRows FUNCTION2 Table_clearRows_ +findRow FUNCTION2 Table_findRow_ +findRows FUNCTION2 Table_findRows_ +getColumnCount FUNCTION2 Table_getColumnCount_ +getFloat FUNCTION2 Table_getFloat_ +getInt FUNCTION2 Table_getInt_ +getRow FUNCTION2 Table_getRow_ +getRowCount FUNCTION2 Table_getRowCount_ +getString FUNCTION2 Table_getString_ +getStringColumn FUNCTION2 Table_getStringColumn_ +matchRow FUNCTION2 Table_matchRow_ +matchRows FUNCTION2 Table_matchRows_ +removeColumn FUNCTION2 Table_removeColumn_ +removeRow FUNCTION2 Table_removeRow_ +removeTokens FUNCTION2 Table_removeTokens_ +rows FUNCTION2 Table_rows_ +setFloat FUNCTION2 Table_setFloat_ +setInt FUNCTION2 Table_setInt_ +setString FUNCTION2 Table_setString_ +trim FUNCTION2 Table_trim_ +TableRow KEYWORD5 TableRow +getColumnCount FUNCTION2 TableRow_getColumnCount_ +getColumnTitle FUNCTION2 TableRow_getColumnTitle_ +getFloat FUNCTION2 TableRow_getFloat_ +getInt FUNCTION2 TableRow_getInt_ +getString FUNCTION2 TableRow_getString_ +setFloat FUNCTION2 TableRow_setFloat_ +setInt FUNCTION2 TableRow_setInt_ +setString FUNCTION2 TableRow_setString_ +tan FUNCTION1 tan_ +TAU LITERAL2 TAU +text FUNCTION1 text_ +textAlign FUNCTION1 textAlign_ +textAscent FUNCTION1 textAscent_ +textDescent FUNCTION1 textDescent_ +textFont FUNCTION1 textFont_ +textLeading FUNCTION1 textLeading_ +textMode FUNCTION1 textMode_ +textSize FUNCTION1 textSize_ +texture FUNCTION1 texture_ +textureMode FUNCTION1 textureMode_ +textureWrap FUNCTION1 textureWrap_ +textWidth FUNCTION1 textWidth_ +thread FUNCTION1 thread_ +tint FUNCTION1 tint_ +translate FUNCTION1 translate_ +triangle FUNCTION1 triangle_ +trim FUNCTION1 trim_ +TWO_PI LITERAL2 TWO_PI +unbinary FUNCTION1 unbinary_ +unhex FUNCTION1 unhex_ +updatePixels FUNCTION1 updatePixels_ +vertex FUNCTION1 vertex_ +XML KEYWORD5 XML +addChild FUNCTION2 XML_addChild_ +format FUNCTION2 XML_format_ +getAttributeCount FUNCTION2 XML_getAttributeCount_ +getChild FUNCTION2 XML_getChild_ +getChildren FUNCTION2 XML_getChildren_ +getContent FUNCTION2 XML_getContent_ +getFloat FUNCTION2 XML_getFloat_ +getContent FUNCTION2 XML_getFloatContent_ +getInt FUNCTION2 XML_getInt_ +getContent FUNCTION2 XML_getIntContent_ +getName FUNCTION2 XML_getName_ +getParent FUNCTION2 XML_getParent_ +getString FUNCTION2 XML_getString_ +hasAttribute FUNCTION2 XML_hasAttribute_ +hasChildren FUNCTION2 XML_hasChildren_ +listAttributes FUNCTION2 XML_listAttributes_ +listChildren FUNCTION2 XML_listChildren_ +removeChild FUNCTION2 XML_removeChild_ +setContent FUNCTION2 XML_setContent_ +setFloat FUNCTION2 XML_setFloat_ +setInt FUNCTION2 XML_setInt_ +setName FUNCTION2 XML_setName_ +setString FUNCTION2 XML_setString_ +toString FUNCTION2 XML_toString_ +year FUNCTION1 year_ \ No newline at end of file diff --git a/p5js/library/mode.properties b/p5js/library/mode.properties new file mode 100644 index 0000000000..e7a3c2c55d --- /dev/null +++ b/p5js/library/mode.properties @@ -0,0 +1,12 @@ +name=p5.js Mode POC +category=Unknown +authors=[Stef Tervelde](http://steftervel.de) +url=https://github.com/stefterv/p5js-mode +sentence=P5.js Mode for Processing +paragraph= +version=1 +prettyVersion=1 +lastUpdated=0 +minRevision=1290 +maxRevision=0 +imports= diff --git a/p5js/src/main/kotlin/p5js.kt b/p5js/src/main/kotlin/p5js.kt new file mode 100644 index 0000000000..1bf8af078d --- /dev/null +++ b/p5js/src/main/kotlin/p5js.kt @@ -0,0 +1,30 @@ +package processing.p5js + +import processing.app.Base +import processing.app.Mode +import processing.app.ui.Editor +import processing.app.ui.EditorState +import java.io.File + +class p5js(base: Base, folder: File): Mode(base, folder) { + override fun getTitle(): String { + return "p5.js" + } + + override fun createEditor(base: Base?, path: String?, state: EditorState?): Editor { + + return p5jsEditor(base!!, path, state, this) + } + + override fun getDefaultExtension(): String { + return "js" + } + + override fun getExtensions(): Array { + return arrayOf("js", "html") + } + + override fun getIgnorable(): Array { + return arrayOf("bak", "tmp") + } +} \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt new file mode 100644 index 0000000000..1e54ec0060 --- /dev/null +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -0,0 +1,236 @@ +package processing.p5js + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import processing.app.Base +import processing.app.Formatter +import processing.app.Mode +import processing.app.syntax.JEditTextArea +import processing.app.syntax.PdeInputHandler +import processing.app.syntax.PdeTextArea +import processing.app.syntax.PdeTextAreaDefaults +import processing.app.ui.Editor +import processing.app.ui.EditorState +import processing.app.ui.EditorToolbar +import java.io.BufferedReader +import java.io.File +import java.io.InputStreamReader +import javax.swing.JMenu + +class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): Editor(base, path, state, mode) { + + val scope = CoroutineScope(Dispatchers.Default) + init { + scope.launch { + val folder = sketch.folder + val name = sketch.name + + val packageJsonName = "package.json" + + val packageJson = loadPackageJson("$folder/$packageJsonName") + packageJson.devDependencies["electron"] = "^33.2.1" + packageJson.sketch = "$name.js" + savePackageJson("$folder/$packageJsonName", packageJson) + + runNpmActions(folder, TYPE.npm, listOf("install")) + + val indexHtml = """ + + + + + + + + + + + + + + + """.trimIndent() + + val mainJS = """ + const path = require('node:path') + const { app, BrowserWindow, globalShortcut, ipcMain } = require('electron') + + const createWindow = () => { + const win = new BrowserWindow({ + width: 400, + height: 400, + useContentSize: true, + autoHideMenuBar: true, + alwaysOnTop: true, + webPreferences: { + nodeIntegration: true, + preload: path.join(__dirname, "preload.js") + }, + }) + + win.loadFile('index.html') + + // Register the 'Escape' key shortcut + globalShortcut.register('Escape', () => { + win.close() + }) + + // Unregister the shortcut when window is closed + win.on('closed', () => { + globalShortcut.unregister('Escape') + }) + } + + app.on('window-all-closed', () => { + // Unregister all shortcuts when app is closing + globalShortcut.unregisterAll() + app.quit() + }) + + app.whenReady().then(() => { + ipcMain.on("send-message", (event, message) => { + console.log(message); + }); + createWindow() + }) + """.trimIndent() + + val preloadJS = """ + const { contextBridge, ipcRenderer } = require("electron"); + + contextBridge.exposeInMainWorld("electron", { + sendMessage: (message) => ipcRenderer.send("send-message", message) + }); + """.trimIndent() + + val rendererJS = """ + const sendToMainHandler = { + get(target, prop) { + const consoleMethod = target[prop]; + // Only intercept methods, return properties + if (typeof consoleMethod !== "function") { + return Reflect.get(...arguments); + } + return new Proxy(consoleMethod, { + apply(target, thisArg, args) { + // Notify main process via own API through contextBridge + window.electron.sendMessage({ + level: prop, + msgArgs: args + }); + // Retain original behavior + return Reflect.apply(...arguments); + } + }); + } + }; + window.console = new Proxy(console, sendToMainHandler); + """.trimIndent() + + File("$folder/index.html").writeText(indexHtml) + File("$folder/main.js").writeText(mainJS) + File("$folder/preload.js").writeText(preloadJS) + File("$folder/renderer.js").writeText(rendererJS) + } + } + + override fun createTextArea(): JEditTextArea { + return PdeTextArea(PdeTextAreaDefaults(), p5jsInputHandler(this), this) + } + + override fun createToolbar(): EditorToolbar { + return p5jsEditorToolbar(this) + } + + override fun createFormatter(): Formatter { + return p5jsFormatter() + } + + override fun buildFileMenu(): JMenu { + return super.buildFileMenu(arrayOf()) + } + + override fun buildSketchMenu(): JMenu { + return super.buildSketchMenu(arrayOf()) + } + + override fun handleImportLibrary(name: String?) { +// TODO("Not yet implemented") + } + + override fun buildHelpMenu(): JMenu { + return JMenu() + } + + override fun handleOpenInternal(path: String?) { + super.handleOpenInternal(path) + } + + override fun getCommentPrefix(): String { + return "// " + } + + override fun internalCloseRunner() { + processes.forEach { it.destroy() } + } + + + override fun deactivateRun() { + processes.forEach { it.destroy() } + } + + enum class TYPE{ + npm, npx + } + + val processes = mutableListOf() + fun runNpmActions(directory: File, type: TYPE, actions: List, onFinished: () -> Unit = {}) { + + + // Wait for previous processes to finish + processes.forEach { it.waitFor() } + + val processBuilder = ProcessBuilder() + // Set the command based on the operating system + val command = if (System.getProperty("os.name").lowercase().contains("windows")) { + listOf("cmd", "/c", type.name , *actions.toTypedArray()) + } else { + listOf(type.name, *actions.toTypedArray()) + } + + processBuilder.command(command) + processBuilder.directory(directory) + + try { + val process = processBuilder.start() + processes.add(process) + + // Handle output stream + val reader = BufferedReader(InputStreamReader(process.inputStream)) + var line: String? + while (reader.readLine().also { line = it } != null) { + println(line) + } + + + // Wait for the process to complete + val exitCode = process.waitFor() + processes.remove(process) + onFinished() + if (exitCode != 0) { + throw RuntimeException("npm install failed with exit code $exitCode") + } + } catch (e: Exception) { + throw RuntimeException("Failed to run npm install", e) + } + } +} \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditorToolbar.kt b/p5js/src/main/kotlin/p5jsEditorToolbar.kt new file mode 100644 index 0000000000..9f2cab137f --- /dev/null +++ b/p5js/src/main/kotlin/p5jsEditorToolbar.kt @@ -0,0 +1,26 @@ +package processing.p5js + +import kotlinx.coroutines.launch +import processing.app.ui.Editor +import processing.app.ui.EditorToolbar + +class p5jsEditorToolbar(editor: p5jsEditor?) : EditorToolbar(editor) { + override fun handleRun(modifiers: Int) { + val editor = editor as p5jsEditor + + editor.scope.launch { + editor.sketch.save() + + runButton.setSelected(true) + editor.runNpmActions(editor.sketch.folder, p5jsEditor.TYPE.npx, listOf("electron", ".")){ + runButton.setSelected(false) + } + + } + } + + override fun handleStop() { + val editor = editor as p5jsEditor + editor.processes.forEach { it.destroy() } + } +} \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsFormatter.kt b/p5js/src/main/kotlin/p5jsFormatter.kt new file mode 100644 index 0000000000..4d44eb958d --- /dev/null +++ b/p5js/src/main/kotlin/p5jsFormatter.kt @@ -0,0 +1,9 @@ +package processing.p5js + +import processing.app.Formatter + +class p5jsFormatter: Formatter { + override fun format(text: String?): String { + return text!! + } +} \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsInputHandler.kt b/p5js/src/main/kotlin/p5jsInputHandler.kt new file mode 100644 index 0000000000..7ee11606c7 --- /dev/null +++ b/p5js/src/main/kotlin/p5jsInputHandler.kt @@ -0,0 +1,24 @@ +package processing.p5js + +import processing.app.syntax.InputHandler +import processing.app.syntax.PdeInputHandler +import java.awt.event.KeyEvent + +class p5jsInputHandler(editor: p5jsEditor): PdeInputHandler(editor) { + init{ + this.addKeyBinding("ENTER", InputHandler.INSERT_BREAK) + this.addKeyBinding("TAB", InputHandler.INSERT_TAB) + } + + override fun handlePressed(event: KeyEvent?): Boolean { + val c = event!!.keyChar + val code = event.keyCode + + if ((code == KeyEvent.VK_BACK_SPACE) || (code == KeyEvent.VK_TAB) || + (code == KeyEvent.VK_ENTER) || ((c.code >= 32) && (c.code < 128)) + ) { + editor.sketch.isModified = true + } + return super.handlePressed(event) + } +} \ No newline at end of file diff --git a/p5js/src/main/kotlin/packageJSON.kt b/p5js/src/main/kotlin/packageJSON.kt new file mode 100644 index 0000000000..2ab6fdb5ea --- /dev/null +++ b/p5js/src/main/kotlin/packageJSON.kt @@ -0,0 +1,38 @@ +package processing.p5js + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import java.io.File + +@Serializable +data class PackageJson( + val name: String, + val version: String, + val main: String = "main.js", + val dependencies: MutableMap = mutableMapOf(), + val devDependencies: MutableMap = mutableMapOf(), + var sketch: String = "sketch.js" +) + +fun loadPackageJson(path: String): PackageJson { + if(!File(path).exists()) { + return PackageJson("p5js", "1.0.0") + } + val jsonString = File(path).readText() + return Json.decodeFromString(jsonString) +} + +@OptIn(ExperimentalSerializationApi::class) +fun savePackageJson(path: String, packageJson: PackageJson) { + val json = Json { + prettyPrint = true + prettyPrintIndent = " " // Use 2 spaces for indentation (npm standard) + encodeDefaults = true // Include default values in output + explicitNulls = false // Don't include null values in output + ignoreUnknownKeys = true // Don't fail on unknown keys during serialization + } + val jsonString = json.encodeToString(PackageJson.serializer(), packageJson) + File(path).writeText(jsonString) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 7eacb06877..2992acb236 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,4 +12,7 @@ include( "java:libraries:pdf", "java:libraries:serial", "java:libraries:svg", -) \ No newline at end of file + "p5js", +) +// TODO: Does extra include make a difference? +//include("p5js") \ No newline at end of file From ff472ecdc78aa8ccb24b2512986121551d89356a Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Sun, 31 Aug 2025 09:32:35 +0200 Subject: [PATCH 02/31] Organize JS scaffolding, add packages via UI - Put JavaScript into dedicated project folder and use Gradle to copy it into resources to use for new p5.js sketches - First iteration of Compose UI to add packages from npm registry via pnpm --- app/build.gradle.kts | 2 +- app/src/processing/app/Base.java | 18 +- p5js/build.gradle.kts | 92 ++--- p5js/js/index.html | 22 ++ p5js/js/main.js | 41 +++ p5js/js/package.json | 8 + p5js/js/pnpm-lock.yaml | 566 +++++++++++++++++++++++++++++ p5js/js/preload.js | 5 + p5js/js/renderer.js | 21 ++ p5js/library/mode.properties | 12 - p5js/src/main/kotlin/p5jsEditor.kt | 186 +++++----- settings.gradle.kts | 4 +- 12 files changed, 813 insertions(+), 164 deletions(-) create mode 100644 p5js/js/index.html create mode 100644 p5js/js/main.js create mode 100644 p5js/js/package.json create mode 100644 p5js/js/pnpm-lock.yaml create mode 100644 p5js/js/preload.js create mode 100644 p5js/js/renderer.js delete mode 100644 p5js/library/mode.properties diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 48d49eea20..7107645591 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -419,7 +419,7 @@ tasks.register("includeProcessingResources"){ "includeJavaMode", "includeSharedAssets", "includeProcessingExamples", - "includeProcessingWebsiteExamples", +// "includeProcessingWebsiteExamples", "includeJavaModeResources", "renameWindres" ) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index a083d139a0..53f4291334 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -110,6 +110,7 @@ public class Base { /** Only one built-in Mode these days, removing the extra fluff. */ private Mode coreMode; + private Mode p5jsMode; // TODO can these be Set objects, or are they expected to be in order? private List contribModes; @@ -729,6 +730,7 @@ public void tallyUpdatesAvailable() { public List getModeList() { List outgoing = new ArrayList<>(); outgoing.add(coreMode); + outgoing.add(p5jsMode); if (contribModes != null) { for (ModeContribution contrib : contribModes) { outgoing.add(contrib.getMode()); @@ -739,19 +741,25 @@ public List getModeList() { void buildCoreModes() { - ModeContribution javaModeContrib = - ModeContribution.load(this, Platform.getContentFile("modes/java"), - getDefaultModeIdentifier()); + ModeContribution javaModeContrib = ModeContribution.load(this, Platform.getContentFile("modes/java"), getDefaultModeIdentifier()); + ModeContribution p5jsModeContrib = ModeContribution.load(this, Platform.getContentFile("modes/p5js"), "processing.p5js.p5js"); if (javaModeContrib == null) { Messages.showError("Startup Error", - "Could not load Java Mode, please reinstall Processing.", - new Exception("ModeContribution.load() was null")); + "Could not load Java Mode, please reinstall Processing.", + new Exception("ModeContribution.load() was null")); } else { // PDE X calls getModeList() while it's loading, so coreModes must be set //coreModes = new Mode[] { javaModeContrib.getMode() }; coreMode = javaModeContrib.getMode(); } + if (p5jsModeContrib == null) { + Messages.showError("Startup Error", + "Could not load p5.js Mode, please reinstall Processing.", + new Exception("ModeContribution.load() was null")); + } else { + p5jsMode = p5jsModeContrib.getMode(); + } } diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index e4a0dd1345..1d66f14771 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -1,10 +1,11 @@ plugins { - kotlin("jvm") version "2.0.20" + kotlin("jvm") version libs.versions.kotlin kotlin("plugin.serialization") version "1.9.0" -} -group = "org.processing" -version = "1.0-SNAPSHOT" + // TODO Unclear whether the whole Compose dependency is necessary + alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrainsCompose) +} repositories { mavenCentral() @@ -13,62 +14,49 @@ repositories { } dependencies { -// compileOnly(files("/Applications/Processing.app/Contents/Java/pde.jar/**/")) + compileOnly(project(":app")) implementation(project(":core")) - implementation(project(":app")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") - testImplementation(kotlin("test")) + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) + implementation(compose.ui) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) } -project(":app").tasks.named("run").configure { - dependsOn(tasks.named("installLibrary")) -} -tasks.create("copyJars") { - group = "processing" - dependsOn(tasks.jar) - from(layout.buildDirectory.dir("libs")){ - include("**/*.jar") +tasks.register("createMode") { + dependsOn("jar") + into(layout.buildDirectory.dir("mode")) + // TODO Why is there a duplicate in the first place? + duplicatesStrategy = DuplicatesStrategy.WARN + + from(layout.projectDirectory.dir("library")) { + include ("**") + } + + from(layout.projectDirectory) { + include("js/**") + } + + from(configurations.runtimeClasspath) { + into("mode") + } + + from(tasks.jar) { + into("mode") } - from(configurations.compileClasspath) - into(layout.buildDirectory.dir("library/mode")) - duplicatesStrategy = DuplicatesStrategy.INCLUDE -} -tasks.create("createLibrary") { - group = "processing" - from("library") - into(layout.buildDirectory.dir("library")) -} -tasks.create("installLibrary") { - group = "processing" - dependsOn(tasks.named("createLibrary")) - dependsOn(tasks.named("copyJars")) - from(layout.buildDirectory.dir("library")) - into("${System.getProperty("user.home")}/sketchbook/modes/p5js") -} -//tasks.register("runProcessing") { -// dependsOn(tasks.named("installLibrary")) -// group = "processing" -// classpath = files(fileTree("/Applications/Processing.app/Contents/Java/"){ -// include("*.jar") -// }) -// mainClass.set("processing.app.Base") // Your main class -// -// // Optional: Add arguments if needed -// args = listOf("") -// -// // Optional: Add JVM arguments if needed -// jvmArgs = listOf("-Xmx2g") -//} -tasks.jar { - archiveVersion.set("") - archiveBaseName.set("p5js") } -tasks.test { - useJUnitPlatform() + +tasks.register("includeMode") { + dependsOn("createMode") + from(tasks.named("createMode")) + into(project(":app").layout.buildDirectory.dir("resources-bundled/common/modes/p5js")) } -kotlin { - jvmToolchain(17) + +project(":app").tasks.named("includeProcessingResources").configure { + dependsOn(tasks.named("includeMode")) } \ No newline at end of file diff --git a/p5js/js/index.html b/p5js/js/index.html new file mode 100644 index 0000000000..386d56e9f1 --- /dev/null +++ b/p5js/js/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/p5js/js/main.js b/p5js/js/main.js new file mode 100644 index 0000000000..074b8a1768 --- /dev/null +++ b/p5js/js/main.js @@ -0,0 +1,41 @@ +const path = require('node:path'); +const { app, BrowserWindow, globalShortcut, ipcMain } = require('electron'); + +const createWindow = () => { + const win = new BrowserWindow({ + width: 400, + height: 400, + useContentSize: true, + autoHideMenuBar: true, + alwaysOnTop: true, + webPreferences: { + nodeIntegration: true, + preload: path.join(__dirname, "preload.js") + } + }); + + win.loadFile('index.html'); + + // Register the 'Escape' key shortcut + globalShortcut.register('Escape', () => { + win.close(); + }); + + // Unregister the shortcut when window is closed + win.on('closed', () => { + globalShortcut.unregister('Escape'); + }); +} + +app.on('window-all-closed', () => { + // Unregister all shortcuts when app is closing + globalShortcut.unregisterAll(); + app.quit(); +}); + +app.whenReady().then(() => { + ipcMain.on("send-message", (event, message) => { + console.log(message); + }); + createWindow(); +}); diff --git a/p5js/js/package.json b/p5js/js/package.json new file mode 100644 index 0000000000..cb06cf2ddb --- /dev/null +++ b/p5js/js/package.json @@ -0,0 +1,8 @@ +{ + "name": "p5js-mode-scaffold", + "version": "0.1.0", + "main": "main.js", + "devDependencies": { + "electron": "^37.4.0" + } +} diff --git a/p5js/js/pnpm-lock.yaml b/p5js/js/pnpm-lock.yaml new file mode 100644 index 0000000000..c287237dd6 --- /dev/null +++ b/p5js/js/pnpm-lock.yaml @@ -0,0 +1,566 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + electron: + specifier: ^37.4.0 + version: 37.4.0 + +packages: + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@22.18.0': + resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + electron@37.4.0: + resolution: {integrity: sha512-HhsSdWowE5ODOeWNc/323Ug2C52mq/TqNBG+4uMeOA3G2dMXNc/nfyi0RYu1rJEgiaJLEjtHveeZZaYRYFsFCQ==} + engines: {node: '>= 12.20.55'} + hasBin: true + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + +snapshots: + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.1 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.18.0 + '@types/responselike': 1.0.3 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.18.0 + + '@types/node@22.18.0': + dependencies: + undici-types: 6.21.0 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.18.0 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.18.0 + optional: true + + boolean@3.2.0: + optional: true + + buffer-crc32@0.2.13: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + detect-node@2.1.0: + optional: true + + electron@37.4.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 22.18.0 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: + optional: true + + es-errors@1.3.0: + optional: true + + es6-error@4.1.1: + optional: true + + escape-string-regexp@4.0.0: + optional: true + + extract-zip@2.0.1: + dependencies: + debug: 4.4.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.2 + serialize-error: 7.0.1 + optional: true + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: + optional: true + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + http-cache-semantics@4.2.0: {} + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + json-buffer@3.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lowercase-keys@2.0.0: {} + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + ms@2.1.3: {} + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-cancelable@2.1.1: {} + + pend@1.2.0: {} + + progress@2.0.3: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + quick-lru@5.1.1: {} + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.2: + optional: true + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + sprintf-js@1.1.3: + optional: true + + sumchecker@3.0.1: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + type-fest@0.13.1: + optional: true + + undici-types@6.21.0: {} + + universalify@0.1.2: {} + + wrappy@1.0.2: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 diff --git a/p5js/js/preload.js b/p5js/js/preload.js new file mode 100644 index 0000000000..424bc373af --- /dev/null +++ b/p5js/js/preload.js @@ -0,0 +1,5 @@ +const { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("electron", { + sendMessage: (message) => ipcRenderer.send("send-message", message) +}); diff --git a/p5js/js/renderer.js b/p5js/js/renderer.js new file mode 100644 index 0000000000..9edb83a3e5 --- /dev/null +++ b/p5js/js/renderer.js @@ -0,0 +1,21 @@ +const sendToMainHandler = { + get(target, prop) { + const consoleMethod = target[prop]; + // Only intercept methods, return properties + if (typeof consoleMethod !== "function") { + return Reflect.get(...arguments); + } + return new Proxy(consoleMethod, { + apply(target, thisArg, args) { + // Notify main process via own API through contextBridge + window.electron.sendMessage({ + level: prop, + msgArgs: args + }); + // Retain original behavior + return Reflect.apply(...arguments); + } + }); + } +}; +window.console = new Proxy(console, sendToMainHandler); diff --git a/p5js/library/mode.properties b/p5js/library/mode.properties deleted file mode 100644 index e7a3c2c55d..0000000000 --- a/p5js/library/mode.properties +++ /dev/null @@ -1,12 +0,0 @@ -name=p5.js Mode POC -category=Unknown -authors=[Stef Tervelde](http://steftervel.de) -url=https://github.com/stefterv/p5js-mode -sentence=P5.js Mode for Processing -paragraph= -version=1 -prettyVersion=1 -lastUpdated=0 -minRevision=1290 -maxRevision=0 -imports= diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index 1e54ec0060..07ec3b4caa 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -1,23 +1,48 @@ package processing.p5js +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.Button +import androidx.compose.material.Divider +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.awt.ComposePanel +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import processing.app.Base import processing.app.Formatter import processing.app.Mode +import processing.app.Platform import processing.app.syntax.JEditTextArea -import processing.app.syntax.PdeInputHandler import processing.app.syntax.PdeTextArea import processing.app.syntax.PdeTextAreaDefaults import processing.app.ui.Editor +import processing.app.ui.EditorFooter import processing.app.ui.EditorState import processing.app.ui.EditorToolbar +import processing.app.ui.theme.ProcessingTheme import java.io.BufferedReader import java.io.File import java.io.InputStreamReader +import java.net.URL import javax.swing.JMenu + class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): Editor(base, path, state, mode) { val scope = CoroutineScope(Dispatchers.Default) @@ -26,15 +51,11 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E val folder = sketch.folder val name = sketch.name - val packageJsonName = "package.json" - - val packageJson = loadPackageJson("$folder/$packageJsonName") - packageJson.devDependencies["electron"] = "^33.2.1" - packageJson.sketch = "$name.js" - savePackageJson("$folder/$packageJsonName", packageJson) - - runNpmActions(folder, TYPE.npm, listOf("install")) + // TODO: `getContentFile` is deprecated; what is the suggested "built-in JAR Resources system"? + var javascriptFolder = Platform.getContentFile("modes/p5js/js") + javascriptFolder.listFiles().forEach { it.copyTo(File(folder, it.name), true) } + // TODO: Find a better way to load actual sketch file val indexHtml = """ @@ -55,91 +76,14 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E - + """.trimIndent() - - val mainJS = """ - const path = require('node:path') - const { app, BrowserWindow, globalShortcut, ipcMain } = require('electron') - - const createWindow = () => { - const win = new BrowserWindow({ - width: 400, - height: 400, - useContentSize: true, - autoHideMenuBar: true, - alwaysOnTop: true, - webPreferences: { - nodeIntegration: true, - preload: path.join(__dirname, "preload.js") - }, - }) - - win.loadFile('index.html') - - // Register the 'Escape' key shortcut - globalShortcut.register('Escape', () => { - win.close() - }) - - // Unregister the shortcut when window is closed - win.on('closed', () => { - globalShortcut.unregister('Escape') - }) - } - - app.on('window-all-closed', () => { - // Unregister all shortcuts when app is closing - globalShortcut.unregisterAll() - app.quit() - }) - - app.whenReady().then(() => { - ipcMain.on("send-message", (event, message) => { - console.log(message); - }); - createWindow() - }) - """.trimIndent() - - val preloadJS = """ - const { contextBridge, ipcRenderer } = require("electron"); - - contextBridge.exposeInMainWorld("electron", { - sendMessage: (message) => ipcRenderer.send("send-message", message) - }); - """.trimIndent() - - val rendererJS = """ - const sendToMainHandler = { - get(target, prop) { - const consoleMethod = target[prop]; - // Only intercept methods, return properties - if (typeof consoleMethod !== "function") { - return Reflect.get(...arguments); - } - return new Proxy(consoleMethod, { - apply(target, thisArg, args) { - // Notify main process via own API through contextBridge - window.electron.sendMessage({ - level: prop, - msgArgs: args - }); - // Retain original behavior - return Reflect.apply(...arguments); - } - }); - } - }; - window.console = new Proxy(console, sendToMainHandler); - """.trimIndent() - File("$folder/index.html").writeText(indexHtml) - File("$folder/main.js").writeText(mainJS) - File("$folder/preload.js").writeText(preloadJS) - File("$folder/renderer.js").writeText(rendererJS) + + // --dangerously-allow-all-builds allows electron in particular to install properly + runNpmActions(folder, TYPE.pnpm, listOf("install", "--dangerously-allow-all-builds")) } } @@ -188,8 +132,68 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E processes.forEach { it.destroy() } } + override fun createFooter(): EditorFooter { + val footer = super.createFooter() + val composePanel = ComposePanel() + composePanel.setContent { + ProcessingTheme { + var packageToInstall by remember { mutableStateOf("") } + var packagesSearched by remember { mutableStateOf(listOf()) } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + ) { + Column { + Text("Add packages", fontWeight = FontWeight.Bold) + // TODO Do not forget localization! + Text("Search for and use JavaScript packages from npm here. By selecting a package, pnpm will add it to the dependencies of this sketch. It is then ready for you to import and use.") + Row { + OutlinedTextField( + packageToInstall, + singleLine = true, + // TODO Hot mess—apologies! (Look into ViewModel, LaunchedEffect, debounce the onValueChange handler!) + onValueChange = { + packageToInstall = it + if (packageToInstall.length > 1) { + val npmConn = + URL("https://registry.npmjs.org/-/v1/search?text=$packageToInstall") + .openConnection() + val npmResponseRaw = npmConn.getInputStream().readAllBytes().decodeToString() + val npmResponse: JsonObject = Json.decodeFromString(npmResponseRaw) + val npmPackages = npmResponse["objects"]!!.jsonArray + packagesSearched = npmPackages.map { it.jsonObject["package"]!!.jsonObject["name"]!!.jsonPrimitive.content } + packageToInstall = packagesSearched[0] + } + }) + Spacer(modifier = Modifier.width(8.dp)) + Button(onClick = { + if (packageToInstall.isNotBlank()) { + // TODO Better error handling + runNpmActions(sketch.folder, TYPE.pnpm, listOf("add", packageToInstall)) + packageToInstall = "" + } + }) { + Text("Add") + } + } + } + Spacer(Modifier.width(16.dp)) + LazyColumn { + itemsIndexed(packagesSearched) { index, pkg -> + Text(text = pkg, fontWeight = if (index == 0) FontWeight.Bold else FontWeight.Normal, modifier = Modifier.fillMaxWidth().padding(4.dp)) + Divider() + } + } + } + } + } + footer.addPanel(composePanel, "NPM") + return footer + } + enum class TYPE{ - npm, npx + pnpm, npx } val processes = mutableListOf() diff --git a/settings.gradle.kts b/settings.gradle.kts index 2992acb236..23ad62b8d5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,6 +13,4 @@ include( "java:libraries:serial", "java:libraries:svg", "p5js", -) -// TODO: Does extra include make a difference? -//include("p5js") \ No newline at end of file +) \ No newline at end of file From e610a8f0b4f7cd574bc7055712b9f8678c251233 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Tue, 2 Sep 2025 02:31:15 +0200 Subject: [PATCH 03/31] Prepare demo for next cohort check-in --- p5js/js/index.html | 8 +- p5js/js/main.js | 4 +- p5js/js/package.json | 6 +- p5js/js/pnpm-lock.yaml | 1123 +++++++++++++++++++++++++++- p5js/js/preload.js | 2 +- p5js/js/renderer.js | 38 +- p5js/src/main/kotlin/p5jsEditor.kt | 41 +- 7 files changed, 1166 insertions(+), 56 deletions(-) diff --git a/p5js/js/index.html b/p5js/js/index.html index 386d56e9f1..26814c980c 100644 --- a/p5js/js/index.html +++ b/p5js/js/index.html @@ -1,8 +1,8 @@ - - + + - + + + + + + - - - - + + + + """.trimIndent() File("$folder/index.html").writeText(indexHtml) @@ -155,7 +155,8 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E // TODO Hot mess—apologies! (Look into ViewModel, LaunchedEffect, debounce the onValueChange handler!) onValueChange = { packageToInstall = it - if (packageToInstall.length > 1) { + // TODO Need a better debounce + if (packageToInstall.length > 4) { val npmConn = URL("https://registry.npmjs.org/-/v1/search?text=$packageToInstall") .openConnection() @@ -170,7 +171,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E Button(onClick = { if (packageToInstall.isNotBlank()) { // TODO Better error handling - runNpmActions(sketch.folder, TYPE.pnpm, listOf("add", packageToInstall)) + runNpmActions(sketch.folder, TYPE.pnpm, listOf("add", packageToInstall, "--dangerously-allow-all-builds")) packageToInstall = "" } }) { From 1120122bf230e2fbf643ac5c715bee3df83e6582 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Fri, 19 Sep 2025 07:21:33 +0200 Subject: [PATCH 04/31] =?UTF-8?q?First=20na=C3=AFve=20try=20to=20build=20a?= =?UTF-8?q?=20*.pdex=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- p5js/build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index 1d66f14771..f3b9784315 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -51,6 +51,15 @@ tasks.register("createMode") { } } +tasks.register("createPdex") { + dependsOn("createMode") + from(tasks.named("createMode")) + + archiveBaseName.set("p5js_mode") + archiveExtension.set("pdex") + destinationDirectory.set(layout.buildDirectory) +} + tasks.register("includeMode") { dependsOn("createMode") from(tasks.named("createMode")) From 68e45bd0c0a96e7f23e474eb890f1f5362342689 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Fri, 19 Sep 2025 20:53:28 +0200 Subject: [PATCH 05/31] Prepare *.pdex and make install work --- p5js/build.gradle.kts | 1 - p5js/library/mode.properties | 12 ++++++++++++ p5js/src/main/kotlin/p5jsEditor.kt | 10 ++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 p5js/library/mode.properties diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index f3b9784315..0afb9cf1ab 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -55,7 +55,6 @@ tasks.register("createPdex") { dependsOn("createMode") from(tasks.named("createMode")) - archiveBaseName.set("p5js_mode") archiveExtension.set("pdex") destinationDirectory.set(layout.buildDirectory) } diff --git a/p5js/library/mode.properties b/p5js/library/mode.properties new file mode 100644 index 0000000000..8f60d00941 --- /dev/null +++ b/p5js/library/mode.properties @@ -0,0 +1,12 @@ +name=p5.js Mode POC +category=Unknown +authors=[Stef Tervelde](http://steftervel.de) +url=https://github.com/stefterv/p5js-mode +sentence=P5.js Mode for Processing +paragraph= +version=1 +prettyVersion=1 +lastUpdated=0 +minRevision=0 +maxRevision=0 +imports= diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index 0515185e90..d8465d8574 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -51,9 +51,10 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E val folder = sketch.folder val name = sketch.name - // TODO: `getContentFile` is deprecated; what is the suggested "built-in JAR Resources system"? - var javascriptFolder = Platform.getContentFile("modes/p5js/js") - javascriptFolder.listFiles().forEach { it.copyTo(File(folder, it.name), true) } + // TODO: `getContentFile` is deprecated; move to JAR resource system if time allows + var javascriptFolder = mode?.getContentFile("js") + // TODO: Better error handling in case Electron scaffolding is not found + javascriptFolder?.listFiles()?.forEach { it.copyTo(File(folder, it.name), true) } // TODO: Find a better way to load actual sketch file val indexHtml = """ @@ -82,6 +83,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E """.trimIndent() File("$folder/index.html").writeText(indexHtml) + runNpmActions(folder, TYPE.npm, listOf("install", "-g", "pnpm")) // --dangerously-allow-all-builds allows electron in particular to install properly runNpmActions(folder, TYPE.pnpm, listOf("install", "--dangerously-allow-all-builds")) } @@ -194,7 +196,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E } enum class TYPE{ - pnpm, npx + npm, pnpm, npx } val processes = mutableListOf() From 88613925126dd6b7be7eecf13314dd2b5ef24a7d Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Fri, 19 Sep 2025 21:06:10 +0200 Subject: [PATCH 06/31] Create README.md for p5.js mode --- p5js/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 p5js/README.md diff --git a/p5js/README.md b/p5js/README.md new file mode 100644 index 0000000000..3d4dea451b --- /dev/null +++ b/p5js/README.md @@ -0,0 +1,7 @@ +# p5.js Mode + +## Installation + +Currently, installing by double-clicking the released `.pdex` file is not working. (Tested with Processing 4.4.7 on MacOS; error says `Could not find mode in the downloaded file.`) But you can rename `p5js.pdex` to `p5js.zip` and unpack that archive into the Processing sketchbook folder; `~/Documents/Processing/modes/p5js` under MacOS. Next time you start the PDE, you have a new p5.js mode in the dropdown. + +The console of the PDE is not very vocal about what is happening behind the scenes of the p5.js mode, at the moment. That’s why I suggest to start the PDE via the command line with `DEBUG=true /Applications/Processing.app/Contents/MacOS/Processing` to get the full debug logs. Once the console says `Done in … with pnpm` you can start running your p5.js sketches inside Processing. From 8253586320cef072fea65df67693e52649164c27 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 24 Sep 2025 16:04:06 +0200 Subject: [PATCH 07/31] Add keywords for syntax highlighting Fix *.pdes creation (top-level folder named after project in *.zip file necessary for pdex installation in PDE) --- p5js/build.gradle.kts | 1 + p5js/library/keywords.txt | 1775 ++++++++++++++-------------- p5js/src/main/kotlin/p5jsEditor.kt | 1 + 3 files changed, 887 insertions(+), 890 deletions(-) diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index 0afb9cf1ab..f39af66883 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -54,6 +54,7 @@ tasks.register("createMode") { tasks.register("createPdex") { dependsOn("createMode") from(tasks.named("createMode")) + into(project.name) archiveExtension.set("pdex") destinationDirectory.set(layout.buildDirectory) diff --git a/p5js/library/keywords.txt b/p5js/library/keywords.txt index 16400d61d0..8a510b3d64 100644 --- a/p5js/library/keywords.txt +++ b/p5js/library/keywords.txt @@ -4,336 +4,247 @@ # For an explanation of these tags, see Token.java # trunk/processing/app/src/processing/app/syntax/Token.java -ADD LITERAL2 blend_ -ALIGN_CENTER LITERAL2 -ALIGN_LEFT LITERAL2 -ALIGN_RIGHT LITERAL2 -ALPHA LITERAL2 -ALPHA_MASK LITERAL2 -ALT LITERAL2 -AMBIENT LITERAL2 -ARC LITERAL2 createShape_ -ARROW LITERAL2 cursor_ -ARGB LITERAL2 -BACKSPACE LITERAL2 keyCode -BASELINE LITERAL2 textAlign_ -BEVEL LITERAL2 strokeJoin_ -BLEND LITERAL2 blend_ -BLUE_MASK LITERAL2 -BLUR LITERAL2 filter_ -BOTTOM LITERAL2 textAlign_ -BOX LITERAL2 createShape_ -BURN LITERAL2 blend_ -CENTER LITERAL2 -CHATTER LITERAL2 -CHORD LITERAL2 arc_ +# p5 constants + +ADD LITERAL2 +ALT LITERAL2 +ARROW LITERAL2 +AUTO LITERAL2 +AXES LITERAL2 +BACKSPACE LITERAL2 +BASELINE LITERAL2 +BEVEL LITERAL2 +BEZIER LITERAL2 +BLEND LITERAL2 +BLUR LITERAL2 +BOLDITALIC LITERAL2 +BOLD LITERAL2 +BOTTOM LITERAL2 +BURN LITERAL2 +CENTER LITERAL2 +CHAR LITERAL2 +CHORD LITERAL2 CLAMP LITERAL2 -CLICK LITERAL2 -CLOSE LITERAL2 -CMYK LITERAL2 -CODED LITERAL2 key -COMPLAINT LITERAL2 -COMPOSITE LITERAL2 -COMPONENT LITERAL2 -CONCAVE_POLYGON LITERAL2 -CONTROL LITERAL2 -CONVEX_POLYGON LITERAL2 -CORNER LITERAL2 textAlign_ -CORNERS LITERAL2 -CROSS LITERAL2 cursor_ -CUSTOM LITERAL2 -DARKEST LITERAL2 blend_ -DEGREES LITERAL2 -DEG_TO_RAD LITERAL2 -DELETE LITERAL2 -DIAMETER LITERAL2 -DIFFERENCE LITERAL2 blend_ -DIFFUSE LITERAL2 -DILATE LITERAL2 filter_ -DIRECTIONAL LITERAL2 -DISABLE_ACCURATE_2D LITERAL2 -DISABLE_DEPTH_MASK LITERAL2 -DISABLE_DEPTH_SORT LITERAL2 -DISABLE_DEPTH_TEST LITERAL2 -DISABLE_NATIVE_FONTS LITERAL2 -DISABLE_OPENGL_ERRORS LITERAL2 -DISABLE_PURE_STROKE LITERAL2 -DISABLE_TEXTURE_MIPMAPS LITERAL2 -DISABLE_TRANSFORM_CACHE LITERAL2 -DISABLE_STROKE_PERSPECTIVE LITERAL2 -DISABLED LITERAL2 -DODGE LITERAL2 blend_ -DOWN LITERAL2 keyCode -DRAG LITERAL2 -DXF LITERAL2 size_ -ELLIPSE LITERAL2 createShape_ -ENABLE_ACCURATE_2D LITERAL2 -ENABLE_DEPTH_MASK LITERAL2 -ENABLE_DEPTH_SORT LITERAL2 -ENABLE_DEPTH_TEST LITERAL2 -ENABLE_NATIVE_FONTS LITERAL2 -ENABLE_OPENGL_ERRORS LITERAL2 -ENABLE_PURE_STROKE LITERAL2 -ENABLE_TEXTURE_MIPMAPS LITERAL2 -ENABLE_TRANSFORM_CACHE LITERAL2 -ENABLE_STROKE_PERSPECTIVE LITERAL2 -ENTER LITERAL2 keyCode -EPSILON LITERAL2 -ERODE LITERAL2 filter_ -ESC LITERAL2 keyCode -EXCLUSION LITERAL2 blend_ -EXIT LITERAL2 -FX2D LITERAL2 size_ -GIF LITERAL2 -GRAY LITERAL2 filter_ -GREEN_MASK LITERAL2 -GROUP LITERAL2 -HALF LITERAL2 -HALF_PI LITERAL2 HALF_PI -HAND LITERAL2 cursor_ -HARD_LIGHT LITERAL2 blend_ -HINT_COUNT LITERAL2 -HSB LITERAL2 colorMode_ -IMAGE LITERAL2 textureMode_ -INVERT LITERAL2 filter_ -JAVA2D LITERAL2 size_ -JPEG LITERAL2 -LEFT LITERAL2 keyCode -LIGHTEST LITERAL2 blend_ -LINE LITERAL2 createShape_ -LINES LITERAL2 beginShape_ -LINUX LITERAL2 -MACOSX LITERAL2 -MAX_FLOAT LITERAL2 -MAX_INT LITERAL2 -MIN_FLOAT LITERAL2 -MIN_INT LITERAL2 -MITER LITERAL2 stokeJoin_ -MODEL LITERAL2 textMode_ -MOVE LITERAL2 cursor_ -MULTIPLY LITERAL2 blend_ -NORMAL LITERAL2 -NORMALIZED LITERAL2 textureMode_ -NO_DEPTH_TEST LITERAL2 -NTSC LITERAL2 -ONE LITERAL2 -OPAQUE LITERAL2 filter_ -OPEN LITERAL2 -ORTHOGRAPHIC LITERAL2 -OVERLAY LITERAL2 blend_ -PAL LITERAL2 -PDF LITERAL2 size_ -P2D LITERAL2 size_ -P3D LITERAL2 size_ -PERSPECTIVE LITERAL2 -PI LITERAL2 PI -PIE LITERAL2 -PIXEL_CENTER LITERAL2 -POINT LITERAL2 -POINTS LITERAL2 -POSTERIZE LITERAL2 filter_ -PRESS LITERAL2 -PROBLEM LITERAL2 -PROJECT LITERAL2 strokeCap_ -QUAD LITERAL2 createShape_ -QUAD_STRIP LITERAL2 beginShape_ -QUADS LITERAL2 beginShape_ -QUARTER_PI LITERAL2 QUARTER_PI -RAD_TO_DEG LITERAL2 -RADIUS LITERAL2 -RADIANS LITERAL2 -RECT LITERAL2 -RED_MASK LITERAL2 -RELEASE LITERAL2 -REPEAT LITERAL2 -REPLACE LITERAL2 -RETURN LITERAL2 -RGB LITERAL2 colorMode_ -RIGHT LITERAL2 keyCode -ROUND LITERAL2 strokeCap_ -SCREEN LITERAL2 blend_ -SECAM LITERAL2 -SHAPE LITERAL2 textMode_ -SHIFT LITERAL2 -SPAN LITERAL2 fullScreen_ -SPECULAR LITERAL2 -SPHERE LITERAL2 createShape_ -SOFT_LIGHT LITERAL2 blend_ -SQUARE LITERAL2 strokeCap_ -SUBTRACT LITERAL2 blend_ -SVG LITERAL2 -SVIDEO LITERAL2 -TAB LITERAL2 keyCode -TARGA LITERAL2 -TAU LITERAL2 TAU -TEXT LITERAL2 cursor_ -TFF LITERAL2 -THIRD_PI LITERAL2 -THRESHOLD LITERAL2 filter_ -TIFF LITERAL2 -TOP LITERAL2 textAlign_ -TRIANGLE LITERAL2 createShape_ -TRIANGLE_FAN LITERAL2 beginShape_ -TRIANGLES LITERAL2 beginShape_ -TRIANGLE_STRIP LITERAL2 beginShape_ -TUNER LITERAL2 -TWO LITERAL2 -TWO_PI LITERAL2 TWO_PI -UP LITERAL2 keyCode -WAIT LITERAL2 cursor_ -WHITESPACE LITERAL2 - - -# Java keywords (void, import, , etc.) - -abstract KEYWORD1 -break KEYWORD1 break -class KEYWORD1 class -continue KEYWORD1 continue -default KEYWORD1 default -enum KEYWORD1 -extends KEYWORD1 extends +CLOSE LITERAL2 +CONTAIN LITERAL2 +CONTROL LITERAL2 +CORNER LITERAL2 +CORNERS LITERAL2 +COVER LITERAL2 +CROSS LITERAL2 +CURVE LITERAL2 +DARKEST LITERAL2 +DEGREES LITERAL2 +DELETE LITERAL2 +DIFFERENCE LITERAL2 +DILATE LITERAL2 +DODGE LITERAL2 +DOWN_ARROW LITERAL2 +ENTER LITERAL2 +ERODE LITERAL2 +ESCAPE LITERAL2 +EXCLUSION LITERAL2 +FALLBACK LITERAL2 +FILL LITERAL2 +FLAT LITERAL2 +FLOAT LITERAL2 +GRAY LITERAL2 +GRID LITERAL2 +HALF_FLOAT LITERAL2 +HALF_PI LITERAL2 +HAND LITERAL2 +HARD_LIGHT LITERAL2 +HSB LITERAL2 +HSL LITERAL2 +IMAGE LITERAL2 +IMMEDIATE LITERAL2 +INVERT LITERAL2 +ITALIC LITERAL2 +LABEL LITERAL2 +LANDSCAPE LITERAL2 +LEFT_ARROW LITERAL2 +LEFT LITERAL2 +LIGHTEST LITERAL2 +LINEAR LITERAL2 +LINE_LOOP LITERAL2 +LINES LITERAL2 +LINE_STRIP LITERAL2 +MIRROR LITERAL2 +MITER LITERAL2 +MOVE LITERAL2 +MULTIPLY LITERAL2 +NEAREST LITERAL2 +NORMAL LITERAL2 +OPAQUE LITERAL2 +OPEN LITERAL2 +OPTION LITERAL2 +OVERLAY LITERAL2 +P2D LITERAL2 +PIE LITERAL2 +PI LITERAL2 +POINTS LITERAL2 +PORTRAIT LITERAL2 +POSTERIZE LITERAL2 +PROJECT LITERAL2 +QUADRATIC LITERAL2 +QUADS LITERAL2 +QUAD_STRIP LITERAL2 +QUARTER_PI LITERAL2 +RADIANS LITERAL2 +RADIUS LITERAL2 +REMOVE LITERAL2 +REPEAT LITERAL2 +REPLACE LITERAL2 +RETURN LITERAL2 +RGBA LITERAL2 +RGB LITERAL2 +RIGHT_ARROW LITERAL2 +RIGHT LITERAL2 +ROUND LITERAL2 +SCREEN LITERAL2 +SHIFT LITERAL2 +SMOOTH LITERAL2 +SOFT_LIGHT LITERAL2 +SQUARE LITERAL2 +STROKE LITERAL2 +SUBTRACT LITERAL2 +TAB LITERAL2 +TAU LITERAL2 +TESS LITERAL2 +TEXT LITERAL2 +TEXTURE LITERAL2 +THRESHOLD LITERAL2 +TOP LITERAL2 +TRIANGLE_FAN LITERAL2 +TRIANGLES LITERAL2 +TRIANGLE_STRIP LITERAL2 +TWO_PI LITERAL2 +UNSIGNED_BYTE LITERAL2 +UNSIGNED_INT LITERAL2 +UP_ARROW LITERAL2 +VERSION LITERAL2 +WAIT LITERAL2 +WEBGL2 LITERAL2 +WEBGL LITERAL2 +WORD LITERAL2 + +# JavaScript keywords + +await KEYWORD1 +break KEYWORD1 +case KEYWORD1 +catch KEYWORD3 +class KEYWORD1 +const KEYWORD1 +continue KEYWORD1 +debugger KEYWORD1 +default KEYWORD1 +delete KEYWORD1 +do KEYWORD3 +else KEYWORD3 +export KEYWORD1 +extends KEYWORD1 +false KEYWORD1 +finally KEYWORD1 +for KEYWORD3 function KEYWORD1 -false KEYWORD1 false -final KEYWORD1 final -finally KEYWORD1 -implements KEYWORD1 implements -import KEYWORD1 import -instanceof KEYWORD1 -interface KEYWORD1 +if KEYWORD3 +import KEYWORD1 +Infinity KEYWORD1 +in KEYWORD1 +instanceof KEYWORD1 let KEYWORD1 -const KEYWORD1 -native KEYWORD1 -new KEYWORD1 new -null KEYWORD1 null -package KEYWORD1 -private KEYWORD1 private -protected KEYWORD1 -public KEYWORD1 public -static KEYWORD1 static -strictfp KEYWORD1 -throws KEYWORD1 -transient KEYWORD1 -true KEYWORD1 true -void KEYWORD1 void -volatile KEYWORD1 - - -# Java keywords which can be followed by a parenthesis - -assert KEYWORD6 -case KEYWORD6 case -return KEYWORD6 return -super KEYWORD6 super -this KEYWORD6 this -throw KEYWORD6 - - -# Datatypes - -Array KEYWORD5 Array -ArrayList KEYWORD5 ArrayList -Boolean KEYWORD5 -Byte KEYWORD5 -BufferedReader KEYWORD5 BufferedReader -Character KEYWORD5 -Class KEYWORD5 class -Double KEYWORD5 -Float KEYWORD5 -Integer KEYWORD5 -HashMap KEYWORD5 HashMap -PrintWriter KEYWORD5 PrintWriter -String KEYWORD5 String -StringBuffer KEYWORD5 -StringBuilder KEYWORD5 -Thread KEYWORD5 -boolean KEYWORD5 boolean -byte KEYWORD5 byte -char KEYWORD5 char -color KEYWORD5 color_datatype -double KEYWORD5 double -float KEYWORD5 float -int KEYWORD5 int -long KEYWORD5 long -short KEYWORD5 - - -# Flow structures - -catch KEYWORD3 catch -do KEYWORD3 -for KEYWORD3 for -if KEYWORD3 if -else KEYWORD3 else -switch KEYWORD3 switch -synchronized KEYWORD3 -while KEYWORD3 while -try KEYWORD3 try - -catch FUNCTION3 catch -do FUNCTION3 -for FUNCTION3 for -if FUNCTION3 if -#else FUNCTION3 else -switch FUNCTION3 switch -synchronized FUNCTION3 -while FUNCTION3 while -#try FUNCTION3 try - - -# These items are a part of Processing but, but pages don't generate - -boolean FUNCTION1 booleanconvert_ -byte FUNCTION1 byteconvert_ -cache FUNCTION2 -char FUNCTION1 charconvert_ -start FUNCTION1 -stop FUNCTION1 -breakShape FUNCTION1 -createPath FUNCTION1 -float FUNCTION1 floatconvert_ -int FUNCTION1 intconvert_ -str FUNCTION1 strconvert_ -loadMatrix FUNCTION1 -parseBoolean FUNCTION1 -parseByte FUNCTION1 -parseChar FUNCTION1 -parseFloat FUNCTION1 -parseInt FUNCTION1 -saveFile FUNCTION1 -savePath FUNCTION1 -sketchFile FUNCTION1 -sketchPath FUNCTION1 - -readLine FUNCTION2 BufferedReader_readLine_ -close FUNCTION2 PrintWriter_close_ -flush FUNCTION2 PrintWriter_flush_ -print FUNCTION2 PrintWriter_print_ -println FUNCTION2 PrintWriter_println_ -charAt FUNCTION2 String_charAt_ -equals FUNCTION2 String_equals_ -indexOf FUNCTION2 String_indexOf_ -length FUNCTION2 String_length_ -substring FUNCTION2 String_substring_ -toLowerCase FUNCTION2 String_toLowerCase_ -toUpperCase FUNCTION2 String_toUpperCase_ - -getDouble FUNCTION2 -getLong FUNCTION2 -getColumnTitles FUNCTION2 -getColumnTypes FUNCTION2 -getColumnType FUNCTION2 -setDouble FUNCTION2 -setLong FUNCTION2 - -length KEYWORD2 String - - -# Temporary additions 3 September 2012 as the reference is getting updated -#end FUNCTION1 -#addChild FUNCTION1 +NaN KEYWORD1 +new KEYWORD1 +null KEYWORD1 +return KEYWORD1 +super KEYWORD1 +switch KEYWORD3 +this KEYWORD1 +throw KEYWORD1 +true KEYWORD1 +try KEYWORD3 +typeof KEYWORD1 +undefined KEYWORD1 +var KEYWORD1 +void KEYWORD1 +while KEYWORD3 +with KEYWORD1 +yield KEYWORD1 + +# p5.js properties + +amplitude KEYWORD2 +attack KEYWORD2 +attackLevel KEYWORD2 +attackTime KEYWORD2 +AudioVoice KEYWORD2 +bands KEYWORD2 +biquadFilter KEYWORD2 +bpm KEYWORD2 +centerX KEYWORD2 +centerY KEYWORD2 +centerZ KEYWORD2 +color KEYWORD2 +columns KEYWORD2 +compressor KEYWORD2 +convolverNode KEYWORD2 +currentSource KEYWORD2 +data KEYWORD2 +decay KEYWORD2 +decayLevel KEYWORD2 +decayTime KEYWORD2 +depth KEYWORD2 +elt KEYWORD2 +enabled KEYWORD2 +eyeX KEYWORD2 +eyeY KEYWORD2 +eyeZ KEYWORD2 +faces KEYWORD2 +file KEYWORD2 +font KEYWORD2 +height KEYWORD2 +impulses KEYWORD2 +input KEYWORD2 +interval KEYWORD2 +iterations KEYWORD2 +leftDelay KEYWORD2 +maxIterations KEYWORD2 +mediaStream KEYWORD2 +musicalTimeMode KEYWORD2 +name KEYWORD2 +notes KEYWORD2 +output KEYWORD2 +panner KEYWORD2 +pixels KEYWORD2 +polyvalue KEYWORD2 +release KEYWORD2 +releaseLevel KEYWORD2 +releaseTime KEYWORD2 +rightDelay KEYWORD2 +rows KEYWORD2 +sequence KEYWORD2 +size KEYWORD2 +src KEYWORD2 +stream KEYWORD2 +subtype KEYWORD2 +sustain KEYWORD2 +timeSignature KEYWORD2 +type KEYWORD2 +upX KEYWORD2 +upY KEYWORD2 +upZ KEYWORD2 +uvs KEYWORD2 +vertexNormals KEYWORD2 +vertices KEYWORD2 +WaveShaperNode KEYWORD2 +width KEYWORD2 +x KEYWORD2 +y KEYWORD2 +z KEYWORD2 # Operators are without KEYWORDS +# TODO: Not 100% why/how they are treated separately += addassign + addition @@ -371,568 +282,652 @@ length KEYWORD2 String ; semicolon -= subtractassign -# Suppressed from Generate to avoid conflicts with variables inside methods - -width KEYWORD4 width_ -height KEYWORD4 height_ - -PVector FUNCTION1 PVector -ArrayList FUNCTION1 ArrayList -HashMap FUNCTION1 HashMap - -# pixelHeight is not generating correctly: https://github.com/processing/processing-docs/issues/260 - -pixelHeight KEYWORD4 pixelHeight - - -# THE TEXT ABOVE IS HAND-WRITTEN AND FOUND IN THE FILE "keywords_base.txt" in processing/processing-docs/generate -# -# THE TEXT BELOW IS AUTO-GENERATED -# -# SO -# DON'T -# TOUCH -# IT - - -abs FUNCTION1 abs_ -acos FUNCTION1 acos_ -alpha FUNCTION1 alpha_ -ambient FUNCTION1 ambient_ -ambientLight FUNCTION1 ambientLight_ -append FUNCTION1 append_ -applyMatrix FUNCTION1 applyMatrix_ -arc FUNCTION1 arc_ -arrayCopy FUNCTION1 arrayCopy_ -asin FUNCTION1 asin_ -atan FUNCTION1 atan_ -atan2 FUNCTION1 atan2_ -background FUNCTION1 background_ -beginCamera FUNCTION1 beginCamera_ -beginContour FUNCTION1 beginContour_ -beginRaw FUNCTION1 beginRaw_ -beginRecord FUNCTION1 beginRecord_ -beginShape FUNCTION1 beginShape_ -bezier FUNCTION1 bezier_ -bezierDetail FUNCTION1 bezierDetail_ -bezierPoint FUNCTION1 bezierPoint_ -bezierTangent FUNCTION1 bezierTangent_ -bezierVertex FUNCTION1 bezierVertex_ -binary FUNCTION1 binary_ -blend FUNCTION1 blend_ -blendColor FUNCTION1 blendColor_ -blendMode FUNCTION1 blendMode_ -blue FUNCTION1 blue_ -box FUNCTION1 box_ -brightness FUNCTION1 brightness_ -camera FUNCTION1 camera_ -ceil FUNCTION1 ceil_ -clear FUNCTION1 clear_ -clip FUNCTION1 clip_ -color FUNCTION1 color_ -colorMode FUNCTION1 colorMode_ -concat FUNCTION1 concat_ -constrain FUNCTION1 constrain_ -copy FUNCTION1 copy_ -cos FUNCTION1 cos_ -createFont FUNCTION1 createFont_ -createGraphics FUNCTION1 createGraphics_ -createImage FUNCTION1 createImage_ -createInput FUNCTION1 createInput_ -createOutput FUNCTION1 createOutput_ -createReader FUNCTION1 createReader_ -createShape FUNCTION1 createShape_ -createWriter FUNCTION1 createWriter_ -cursor FUNCTION1 cursor_ -curve FUNCTION1 curve_ -curveDetail FUNCTION1 curveDetail_ -curvePoint FUNCTION1 curvePoint_ -curveTangent FUNCTION1 curveTangent_ -curveTightness FUNCTION1 curveTightness_ -curveVertex FUNCTION1 curveVertex_ -createCanvas FUNCTION1 createCanvas_ -day FUNCTION1 day_ -degrees FUNCTION1 degrees_ -delay FUNCTION1 delay_ -directionalLight FUNCTION1 directionalLight_ -displayDensity FUNCTION1 displayDensity_ -displayHeight KEYWORD4 displayHeight -displayWidth KEYWORD4 displayWidth -dist FUNCTION1 dist_ -draw FUNCTION4 draw -ellipse FUNCTION1 ellipse_ -ellipseMode FUNCTION1 ellipseMode_ -emissive FUNCTION1 emissive_ -endCamera FUNCTION1 endCamera_ -endContour FUNCTION1 endContour_ -endRaw FUNCTION1 endRaw_ -endRecord FUNCTION1 endRecord_ -endShape FUNCTION1 endShape_ -exit FUNCTION1 exit_ -exp FUNCTION1 exp_ -expand FUNCTION1 expand_ -fill FUNCTION1 fill_ -filter FUNCTION1 filter_ -FloatDict KEYWORD5 FloatDict -add FUNCTION2 FloatDict_add_ -clear FUNCTION2 FloatDict_clear_ -div FUNCTION2 FloatDict_div_ -get FUNCTION2 FloatDict_get_ -hasKey FUNCTION2 FloatDict_hasKey_ -keyArray FUNCTION2 FloatDict_keyArray_ -keys FUNCTION2 FloatDict_keys_ -mult FUNCTION2 FloatDict_mult_ -remove FUNCTION2 FloatDict_remove_ -set FUNCTION2 FloatDict_set_ -size FUNCTION2 FloatDict_size_ -sortKeys FUNCTION2 FloatDict_sortKeys_ -sortKeysReverse FUNCTION2 FloatDict_sortKeysReverse_ -sortValues FUNCTION2 FloatDict_sortValues_ -sortValuesReverse FUNCTION2 FloatDict_sortValuesReverse_ -sub FUNCTION2 FloatDict_sub_ -valueArray FUNCTION2 FloatDict_valueArray_ -values FUNCTION2 FloatDict_values_ -FloatList KEYWORD5 FloatList -add FUNCTION2 FloatList_add_ -append FUNCTION2 FloatList_append_ -array FUNCTION2 FloatList_array_ -clear FUNCTION2 FloatList_clear_ -div FUNCTION2 FloatList_div_ -get FUNCTION2 FloatList_get_ -hasValue FUNCTION2 FloatList_hasValue_ -max FUNCTION2 FloatList_max_ -min FUNCTION2 FloatList_min_ -mult FUNCTION2 FloatList_mult_ -remove FUNCTION2 FloatList_remove_ -reverse FUNCTION2 FloatList_reverse_ -set FUNCTION2 FloatList_set_ -shuffle FUNCTION2 FloatList_shuffle_ -size FUNCTION2 FloatList_size_ -sort FUNCTION2 FloatList_sort_ -sortReverse FUNCTION2 FloatList_sortReverse_ -sub FUNCTION2 FloatList_sub_ -floor FUNCTION1 floor_ -focused KEYWORD4 focused -frameCount KEYWORD4 frameCount -frameRate KEYWORD4 frameRate -frameRate FUNCTION1 frameRate_ -frustum FUNCTION1 frustum_ -fullScreen FUNCTION1 fullScreen_ -get FUNCTION1 get_ -green FUNCTION1 green_ -HALF_PI LITERAL2 HALF_PI -hex FUNCTION1 hex_ -hint FUNCTION1 hint_ -hour FUNCTION1 hour_ -hue FUNCTION1 hue_ -image FUNCTION1 image_ -imageMode FUNCTION1 imageMode_ -IntDict KEYWORD5 IntDict -add FUNCTION2 IntDict_add_ -clear FUNCTION2 IntDict_clear_ -div FUNCTION2 IntDict_div_ -get FUNCTION2 IntDict_get_ -hasKey FUNCTION2 IntDict_hasKey_ -increment FUNCTION2 IntDict_increment_ -keyArray FUNCTION2 IntDict_keyArray_ -keys FUNCTION2 IntDict_keys_ -mult FUNCTION2 IntDict_mult_ -remove FUNCTION2 IntDict_remove_ -set FUNCTION2 IntDict_set_ -size FUNCTION2 IntDict_size_ -sortKeys FUNCTION2 IntDict_sortKeys_ -sortKeysReverse FUNCTION2 IntDict_sortKeysReverse_ -sortValues FUNCTION2 IntDict_sortValues_ -sortValuesReverse FUNCTION2 IntDict_sortValuesReverse_ -sub FUNCTION2 IntDict_sub_ -valueArray FUNCTION2 IntDict_valueArray_ -values FUNCTION2 IntDict_values_ -IntList KEYWORD5 IntList -add FUNCTION2 IntList_add_ -append FUNCTION2 IntList_append_ -array FUNCTION2 IntList_array_ -clear FUNCTION2 IntList_clear_ -div FUNCTION2 IntList_div_ -get FUNCTION2 IntList_get_ -hasValue FUNCTION2 IntList_hasValue_ -increment FUNCTION2 IntList_increment_ -max FUNCTION2 IntList_max_ -min FUNCTION2 IntList_min_ -mult FUNCTION2 IntList_mult_ -remove FUNCTION2 IntList_remove_ -reverse FUNCTION2 IntList_reverse_ -set FUNCTION2 IntList_set_ -shuffle FUNCTION2 IntList_shuffle_ -size FUNCTION2 IntList_size_ -sort FUNCTION2 IntList_sort_ -sortReverse FUNCTION2 IntList_sortReverse_ -sub FUNCTION2 IntList_sub_ -join FUNCTION1 join_ -JSONArray KEYWORD5 JSONArray -append FUNCTION2 JSONArray_append_ -getBoolean FUNCTION2 JSONArray_getBoolean_ -getFloat FUNCTION2 JSONArray_getFloat_ -getInt FUNCTION2 JSONArray_getInt_ -getIntArray FUNCTION2 JSONArray_getIntArray_ -getJSONArray FUNCTION2 JSONArray_getJSONArray_ -getJSONObject FUNCTION2 JSONArray_getJSONObject_ -getString FUNCTION2 JSONArray_getString_ -getStringArray FUNCTION2 JSONArray_getStringArray_ -isNull FUNCTION2 JSONArray_isNull_ -remove FUNCTION2 JSONArray_remove_ -setBoolean FUNCTION2 JSONArray_setBoolean_ -setFloat FUNCTION2 JSONArray_setFloat_ -setInt FUNCTION2 JSONArray_setInt_ -setJSONArray FUNCTION2 JSONArray_setJSONArray_ -setJSONObject FUNCTION2 JSONArray_setJSONObject_ -setString FUNCTION2 JSONArray_setString_ -size FUNCTION2 JSONArray_size_ -JSONObject KEYWORD5 JSONObject -getBoolean FUNCTION2 JSONObject_getBoolean_ -getFloat FUNCTION2 JSONObject_getFloat_ -getInt FUNCTION2 JSONObject_getInt_ -getJSONArray FUNCTION2 JSONObject_getJSONArray_ -getJSONObject FUNCTION2 JSONObject_getJSONObject_ -getString FUNCTION2 JSONObject_getString_ -isNull FUNCTION2 JSONObject_isNull_ -setBoolean FUNCTION2 JSONObject_setBoolean_ -setFloat FUNCTION2 JSONObject_setFloat_ -setInt FUNCTION2 JSONObject_setInt_ -setJSONArray FUNCTION2 JSONObject_setJSONArray_ -setJSONObject FUNCTION2 JSONObject_setJSONObject_ -setString FUNCTION2 JSONObject_setString_ -key KEYWORD4 key -keyCode KEYWORD4 keyCode -keyPressed FUNCTION4 keyPressed -keyPressed KEYWORD4 keyPressed -keyReleased FUNCTION4 keyReleased -keyTyped FUNCTION4 keyTyped -launch FUNCTION1 launch_ -lerp FUNCTION1 lerp_ -lerpColor FUNCTION1 lerpColor_ -lightFalloff FUNCTION1 lightFalloff_ -lights FUNCTION1 lights_ -lightSpecular FUNCTION1 lightSpecular_ -line FUNCTION1 line_ -loadBytes FUNCTION1 loadBytes_ -loadFont FUNCTION1 loadFont_ -loadImage FUNCTION1 loadImage_ -loadJSONArray FUNCTION1 loadJSONArray_ -loadJSONObject FUNCTION1 loadJSONObject_ -loadPixels FUNCTION1 loadPixels_ -loadShader FUNCTION1 loadShader_ -loadShape FUNCTION1 loadShape_ -loadStrings FUNCTION1 loadStrings_ -loadTable FUNCTION1 loadTable_ -loadXML FUNCTION1 loadXML_ -log FUNCTION1 log_ -loop FUNCTION1 loop_ -mag FUNCTION1 mag_ -map FUNCTION1 map_ -match FUNCTION1 match_ -matchAll FUNCTION1 matchAll_ -max FUNCTION1 max_ -millis FUNCTION1 millis_ -min FUNCTION1 min_ -minute FUNCTION1 minute_ -modelX FUNCTION1 modelX_ -modelY FUNCTION1 modelY_ -modelZ FUNCTION1 modelZ_ -month FUNCTION1 month_ -mouseButton KEYWORD4 mouseButton -mouseClicked FUNCTION4 mouseClicked -mouseDragged FUNCTION4 mouseDragged -mouseMoved FUNCTION4 mouseMoved -mousePressed FUNCTION4 mousePressed -mousePressed KEYWORD4 mousePressed -mouseReleased FUNCTION4 mouseReleased -mouseWheel FUNCTION4 mouseWheel -mouseX KEYWORD4 mouseX -mouseY KEYWORD4 mouseY -nf FUNCTION1 nf_ -nfc FUNCTION1 nfc_ -nfp FUNCTION1 nfp_ -nfs FUNCTION1 nfs_ -noClip FUNCTION1 noClip_ -noCursor FUNCTION1 noCursor_ -noFill FUNCTION1 noFill_ -noise FUNCTION1 noise_ -noiseDetail FUNCTION1 noiseDetail_ -noiseSeed FUNCTION1 noiseSeed_ -noLights FUNCTION1 noLights_ -noLoop FUNCTION1 noLoop_ -norm FUNCTION1 norm_ -normal FUNCTION1 normal_ -noSmooth FUNCTION1 noSmooth_ -noStroke FUNCTION1 noStroke_ -noTint FUNCTION1 noTint_ -ortho FUNCTION1 ortho_ -parseJSONArray FUNCTION1 parseJSONArray_ -parseJSONObject FUNCTION1 parseJSONObject_ -parseXML FUNCTION1 parseXML_ -perspective FUNCTION1 perspective_ -PFont KEYWORD5 PFont -list FUNCTION1 PFont_list_ -PGraphics KEYWORD5 PGraphics -beginDraw FUNCTION2 PGraphics_beginDraw_ -endDraw FUNCTION2 PGraphics_endDraw_ -PI LITERAL2 PI -PImage KEYWORD5 PImage -blend FUNCTION2 PImage_blend_ -copy FUNCTION2 PImage_copy_ -filter FUNCTION2 PImage_filter_ -get FUNCTION2 PImage_get_ -loadPixels FUNCTION2 PImage_loadPixels_ -mask FUNCTION2 PImage_mask_ -pixels KEYWORD2 PImage_pixels -resize FUNCTION2 PImage_resize_ -save FUNCTION2 PImage_save_ -set FUNCTION2 PImage_set_ -updatePixels FUNCTION2 PImage_updatePixels_ -pixelDensity FUNCTION1 pixelDensity_ -pixelHeight FUNCTION1 pixelHeight_ -pixels KEYWORD4 pixels -pixelWidth KEYWORD4 pixelWidth -pmouseX KEYWORD4 pmouseX -pmouseY KEYWORD4 pmouseY -point FUNCTION1 point_ -pointLight FUNCTION1 pointLight_ -popMatrix FUNCTION1 popMatrix_ -popStyle FUNCTION1 popStyle_ -pow FUNCTION1 pow_ -print FUNCTION1 print_ -printArray FUNCTION1 printArray_ -printCamera FUNCTION1 printCamera_ -println FUNCTION1 println_ -printMatrix FUNCTION1 printMatrix_ -printProjection FUNCTION1 printProjection_ -PShader KEYWORD5 PShader -PShader FUNCTION2 PShader_set_ -PShape KEYWORD5 PShape -addChild FUNCTION2 PShape_addChild_ -beginContour FUNCTION2 PShape_beginContour_ -beginShape FUNCTION2 PShape_beginShape_ -disableStyle FUNCTION2 PShape_disableStyle_ -enableStyle FUNCTION2 PShape_enableStyle_ -endContour FUNCTION2 PShape_endContour_ -endShape FUNCTION2 PShape_endShape_ -getChild FUNCTION2 PShape_getChild_ -getChildCount FUNCTION2 PShape_getChildCount_ -getVertex FUNCTION2 PShape_getVertex_ -getVertexCount FUNCTION2 PShape_getVertexCount_ -isVisible FUNCTION2 PShape_isVisible_ -resetMatrix FUNCTION2 PShape_resetMatrix_ -rotate FUNCTION2 PShape_rotate_ -rotateX FUNCTION2 PShape_rotateX_ -rotateY FUNCTION2 PShape_rotateY_ -rotateZ FUNCTION2 PShape_rotateZ_ -scale FUNCTION2 PShape_scale_ -setFill FUNCTION2 PShape_setFill_ -setStroke FUNCTION2 PShape_setStroke_ -setVertex FUNCTION2 PShape_setVertex_ -setVisible FUNCTION2 PShape_setVisible_ -translate FUNCTION2 PShape_translate_ -pushMatrix FUNCTION1 pushMatrix_ -pushStyle FUNCTION1 pushStyle_ -PVector KEYWORD5 PVector -add FUNCTION2 PVector_add_ -angleBetween FUNCTION2 PVector_angleBetween_ -array FUNCTION2 PVector_array_ -copy FUNCTION2 PVector_copy_ -cross FUNCTION2 PVector_cross_ -dist FUNCTION2 PVector_dist_ -div FUNCTION2 PVector_div_ -dot FUNCTION2 PVector_dot_ -fromAngle FUNCTION2 PVector_fromAngle_ -get FUNCTION2 PVector_get_ -heading FUNCTION2 PVector_heading_ -lerp FUNCTION2 PVector_lerp_ -limit FUNCTION2 PVector_limit_ -mag FUNCTION2 PVector_mag_ -magSq FUNCTION2 PVector_magSq_ -mult FUNCTION2 PVector_mult_ -normalize FUNCTION2 PVector_normalize_ -random2D FUNCTION2 PVector_random2D_ -random3D FUNCTION2 PVector_random3D_ -rotate FUNCTION2 PVector_rotate_ -set FUNCTION2 PVector_set_ -setMag FUNCTION2 PVector_setMag_ -sub FUNCTION2 PVector_sub_ -quad FUNCTION1 quad_ -quadraticVertex FUNCTION1 quadraticVertex_ -QUARTER_PI LITERAL2 QUARTER_PI -radians FUNCTION1 radians_ -random FUNCTION1 random_ -randomGaussian FUNCTION1 randomGaussian_ -randomSeed FUNCTION1 randomSeed_ -rect FUNCTION1 rect_ -rectMode FUNCTION1 rectMode_ -red FUNCTION1 red_ -redraw FUNCTION1 redraw_ -requestImage FUNCTION1 requestImage_ -resetMatrix FUNCTION1 resetMatrix_ -resetShader FUNCTION1 resetShader_ -reverse FUNCTION1 reverse_ -rotate FUNCTION1 rotate_ -rotateX FUNCTION1 rotateX_ -rotateY FUNCTION1 rotateY_ -rotateZ FUNCTION1 rotateZ_ -round FUNCTION1 round_ -saturation FUNCTION1 saturation_ -save FUNCTION1 save_ -saveBytes FUNCTION1 saveBytes_ -saveFrame FUNCTION1 saveFrame_ -saveJSONArray FUNCTION1 saveJSONArray_ -saveJSONObject FUNCTION1 saveJSONObject_ -saveStream FUNCTION1 saveStream_ -saveStrings FUNCTION1 saveStrings_ -saveTable FUNCTION1 saveTable_ -saveXML FUNCTION1 saveXML_ -scale FUNCTION1 scale_ -screenX FUNCTION1 screenX_ -screenY FUNCTION1 screenY_ -screenZ FUNCTION1 screenZ_ -second FUNCTION1 second_ -selectFolder FUNCTION1 selectFolder_ -selectInput FUNCTION1 selectInput_ -selectOutput FUNCTION1 selectOutput_ -set FUNCTION1 set_ -settings FUNCTION4 settings -setup FUNCTION4 setup -shader FUNCTION1 shader_ -shape FUNCTION1 shape_ -shapeMode FUNCTION1 shapeMode_ -shearX FUNCTION1 shearX_ -shearY FUNCTION1 shearY_ -shininess FUNCTION1 shininess_ -shorten FUNCTION1 shorten_ -sin FUNCTION1 sin_ -size FUNCTION1 size_ -smooth FUNCTION1 smooth_ -sort FUNCTION1 sort_ -specular FUNCTION1 specular_ -sphere FUNCTION1 sphere_ -sphereDetail FUNCTION1 sphereDetail_ -splice FUNCTION1 splice_ -split FUNCTION1 split_ -splitTokens FUNCTION1 splitTokens_ -spotLight FUNCTION1 spotLight_ -sq FUNCTION1 sq_ -sqrt FUNCTION1 sqrt_ -StringDict KEYWORD5 StringDict -clear FUNCTION2 StringDict_clear_ -get FUNCTION2 StringDict_get_ -hasKey FUNCTION2 StringDict_hasKey_ -keyArray FUNCTION2 StringDict_keyArray_ -keys FUNCTION2 StringDict_keys_ -remove FUNCTION2 StringDict_remove_ -set FUNCTION2 StringDict_set_ -size FUNCTION2 StringDict_size_ -sortKeys FUNCTION2 StringDict_sortKeys_ -sortKeysReverse FUNCTION2 StringDict_sortKeysReverse_ -sortValues FUNCTION2 StringDict_sortValues_ -sortValuesReverse FUNCTION2 StringDict_sortValuesReverse_ -valueArray FUNCTION2 StringDict_valueArray_ -values FUNCTION2 StringDict_values_ -StringList KEYWORD5 StringList -append FUNCTION2 StringList_append_ -array FUNCTION2 StringList_array_ -clear FUNCTION2 StringList_clear_ -get FUNCTION2 StringList_get_ -hasValue FUNCTION2 StringList_hasValue_ -lower FUNCTION2 StringList_lower_ -remove FUNCTION2 StringList_remove_ -reverse FUNCTION2 StringList_reverse_ -set FUNCTION2 StringList_set_ -shuffle FUNCTION2 StringList_shuffle_ -size FUNCTION2 StringList_size_ -sort FUNCTION2 StringList_sort_ -sortReverse FUNCTION2 StringList_sortReverse_ -upper FUNCTION2 StringList_upper_ -stroke FUNCTION1 stroke_ -strokeCap FUNCTION1 strokeCap_ -strokeJoin FUNCTION1 strokeJoin_ -strokeWeight FUNCTION1 strokeWeight_ -subset FUNCTION1 subset_ -Table KEYWORD5 Table -addColumn FUNCTION2 Table_addColumn_ -addRow FUNCTION2 Table_addRow_ -clearRows FUNCTION2 Table_clearRows_ -findRow FUNCTION2 Table_findRow_ -findRows FUNCTION2 Table_findRows_ -getColumnCount FUNCTION2 Table_getColumnCount_ -getFloat FUNCTION2 Table_getFloat_ -getInt FUNCTION2 Table_getInt_ -getRow FUNCTION2 Table_getRow_ -getRowCount FUNCTION2 Table_getRowCount_ -getString FUNCTION2 Table_getString_ -getStringColumn FUNCTION2 Table_getStringColumn_ -matchRow FUNCTION2 Table_matchRow_ -matchRows FUNCTION2 Table_matchRows_ -removeColumn FUNCTION2 Table_removeColumn_ -removeRow FUNCTION2 Table_removeRow_ -removeTokens FUNCTION2 Table_removeTokens_ -rows FUNCTION2 Table_rows_ -setFloat FUNCTION2 Table_setFloat_ -setInt FUNCTION2 Table_setInt_ -setString FUNCTION2 Table_setString_ -trim FUNCTION2 Table_trim_ -TableRow KEYWORD5 TableRow -getColumnCount FUNCTION2 TableRow_getColumnCount_ -getColumnTitle FUNCTION2 TableRow_getColumnTitle_ -getFloat FUNCTION2 TableRow_getFloat_ -getInt FUNCTION2 TableRow_getInt_ -getString FUNCTION2 TableRow_getString_ -setFloat FUNCTION2 TableRow_setFloat_ -setInt FUNCTION2 TableRow_setInt_ -setString FUNCTION2 TableRow_setString_ -tan FUNCTION1 tan_ -TAU LITERAL2 TAU -text FUNCTION1 text_ -textAlign FUNCTION1 textAlign_ -textAscent FUNCTION1 textAscent_ -textDescent FUNCTION1 textDescent_ -textFont FUNCTION1 textFont_ -textLeading FUNCTION1 textLeading_ -textMode FUNCTION1 textMode_ -textSize FUNCTION1 textSize_ -texture FUNCTION1 texture_ -textureMode FUNCTION1 textureMode_ -textureWrap FUNCTION1 textureWrap_ -textWidth FUNCTION1 textWidth_ -thread FUNCTION1 thread_ -tint FUNCTION1 tint_ -translate FUNCTION1 translate_ -triangle FUNCTION1 triangle_ -trim FUNCTION1 trim_ -TWO_PI LITERAL2 TWO_PI -unbinary FUNCTION1 unbinary_ -unhex FUNCTION1 unhex_ -updatePixels FUNCTION1 updatePixels_ -vertex FUNCTION1 vertex_ -XML KEYWORD5 XML -addChild FUNCTION2 XML_addChild_ -format FUNCTION2 XML_format_ -getAttributeCount FUNCTION2 XML_getAttributeCount_ -getChild FUNCTION2 XML_getChild_ -getChildren FUNCTION2 XML_getChildren_ -getContent FUNCTION2 XML_getContent_ -getFloat FUNCTION2 XML_getFloat_ -getContent FUNCTION2 XML_getFloatContent_ -getInt FUNCTION2 XML_getInt_ -getContent FUNCTION2 XML_getIntContent_ -getName FUNCTION2 XML_getName_ -getParent FUNCTION2 XML_getParent_ -getString FUNCTION2 XML_getString_ -hasAttribute FUNCTION2 XML_hasAttribute_ -hasChildren FUNCTION2 XML_hasChildren_ -listAttributes FUNCTION2 XML_listAttributes_ -listChildren FUNCTION2 XML_listChildren_ -removeChild FUNCTION2 XML_removeChild_ -setContent FUNCTION2 XML_setContent_ -setFloat FUNCTION2 XML_setFloat_ -setInt FUNCTION2 XML_setInt_ -setName FUNCTION2 XML_setName_ -setString FUNCTION2 XML_setString_ -toString FUNCTION2 XML_toString_ -year FUNCTION1 year_ \ No newline at end of file +# p5.js variables + +accelerationX KEYWORD4 +accelerationY KEYWORD4 +accelerationZ KEYWORD4 +deltaTime KEYWORD4 +deviceOrientation KEYWORD4 +disableFriendlyErrors KEYWORD4 +displayHeight KEYWORD4 +displayWidth KEYWORD4 +drawingContext KEYWORD4 +focused KEYWORD4 +frameCount KEYWORD4 +height KEYWORD4 +keyCode KEYWORD4 +keyIsPressed KEYWORD4 +key KEYWORD4 +mouseButton KEYWORD4 +mouseIsPressed KEYWORD4 +mouseX KEYWORD4 +mouseY KEYWORD4 +movedX KEYWORD4 +movedY KEYWORD4 +pAccelerationX KEYWORD4 +pAccelerationY KEYWORD4 +pAccelerationZ KEYWORD4 +pixels KEYWORD4 +pmouseX KEYWORD4 +pmouseY KEYWORD4 +pRotationX KEYWORD4 +pRotationY KEYWORD4 +pRotationZ KEYWORD4 +pwinMouseX KEYWORD4 +pwinMouseY KEYWORD4 +rotationX KEYWORD4 +rotationY KEYWORD4 +rotationZ KEYWORD4 +soundOut KEYWORD4 +touches KEYWORD4 +turnAxis KEYWORD4 +webglVersion KEYWORD4 +width KEYWORD4 +windowHeight KEYWORD4 +windowWidth KEYWORD4 +winMouseX KEYWORD4 +winMouseY KEYWORD4 + +# p5.js functions + +abs FUNCTION1 +acos FUNCTION1 +alpha FUNCTION1 +ambientLight FUNCTION1 +ambientMaterial FUNCTION1 +angleMode FUNCTION1 +append FUNCTION1 +applyMatrix FUNCTION1 +arc FUNCTION1 +arrayCopy FUNCTION1 +asin FUNCTION1 +atan2 FUNCTION1 +atan FUNCTION1 +background FUNCTION1 +baseColorShader FUNCTION1 +baseMaterialShader FUNCTION1 +baseNormalShader FUNCTION1 +baseStrokeShader FUNCTION1 +beginClip FUNCTION1 +beginContour FUNCTION1 +beginGeometry FUNCTION1 +beginShape FUNCTION1 +bezierDetail FUNCTION1 +bezier FUNCTION1 +bezierPoint FUNCTION1 +bezierTangent FUNCTION1 +bezierVertex FUNCTION1 +blend FUNCTION1 +blendMode FUNCTION1 +blue FUNCTION1 +boolean FUNCTION1 +box FUNCTION1 +brightness FUNCTION1 +buildGeometry FUNCTION1 +byte FUNCTION1 +camera FUNCTION1 +ceil FUNCTION1 +changed FUNCTION1 +char FUNCTION1 +circle FUNCTION1 +clearDepth FUNCTION1 +clear FUNCTION1 +clearStorage FUNCTION1 +clip FUNCTION1 +color FUNCTION1 +colorMode FUNCTION1 +concat FUNCTION1 +cone FUNCTION1 +constrain FUNCTION1 +copy FUNCTION1 +cos FUNCTION1 +createA FUNCTION1 +createAudio FUNCTION1 +createButton FUNCTION1 +createCamera FUNCTION1 +createCanvas FUNCTION1 +createCapture FUNCTION1 +createCheckbox FUNCTION1 +createColorPicker FUNCTION1 +createConvolver FUNCTION1 +createDiv FUNCTION1 +createElement FUNCTION1 +createFileInput FUNCTION1 +createFilterShader FUNCTION1 +createFramebuffer FUNCTION1 +createGraphics FUNCTION1 +createImage FUNCTION1 +createImg FUNCTION1 +createInput FUNCTION1 +createModel FUNCTION1 +createNumberDict FUNCTION1 +createP FUNCTION1 +createRadio FUNCTION1 +createSelect FUNCTION1 +createShader FUNCTION1 +createSlider FUNCTION1 +createSpan FUNCTION1 +createStringDict FUNCTION1 +createVector FUNCTION1 +createVideo FUNCTION1 +createWriter FUNCTION1 +cursor FUNCTION1 +curveDetail FUNCTION1 +curve FUNCTION1 +curvePoint FUNCTION1 +curveTangent FUNCTION1 +curveTightness FUNCTION1 +curveVertex FUNCTION1 +cylinder FUNCTION1 +day FUNCTION1 +debugMode FUNCTION1 +degrees FUNCTION1 +describeElement FUNCTION1 +describe FUNCTION1 +deviceMoved FUNCTION1 +deviceShaken FUNCTION1 +deviceTurned FUNCTION1 +directionalLight FUNCTION1 +displayDensity FUNCTION1 +dist FUNCTION1 +doubleClicked FUNCTION1 +draw FUNCTION1 +ellipse FUNCTION1 +ellipseMode FUNCTION1 +ellipsoid FUNCTION1 +emissiveMaterial FUNCTION1 +endClip FUNCTION1 +endContour FUNCTION1 +endGeometry FUNCTION1 +endShape FUNCTION1 +erase FUNCTION1 +exitPointerLock FUNCTION1 +exp FUNCTION1 +fill FUNCTION1 +filter FUNCTION1 +float FUNCTION1 +floor FUNCTION1 +fract FUNCTION1 +frameRate FUNCTION1 +freeGeometry FUNCTION1 +freqToMidi FUNCTION1 +frustum FUNCTION1 +fullscreen FUNCTION1 +getAudioContext FUNCTION1 +get FUNCTION1 +getItem FUNCTION1 +getOutputVolume FUNCTION1 +getTargetFrameRate FUNCTION1 +getURL FUNCTION1 +getURLParams FUNCTION1 +getURLPath FUNCTION1 +green FUNCTION1 +gridOutput FUNCTION1 +hex FUNCTION1 +hour FUNCTION1 +httpDo FUNCTION1 +httpGet FUNCTION1 +httpPost FUNCTION1 +hue FUNCTION1 +image FUNCTION1 +imageLight FUNCTION1 +imageMode FUNCTION1 +input FUNCTION1 +int FUNCTION1 +isLooping FUNCTION1 +join FUNCTION1 +keyIsDown FUNCTION1 +keyPressed FUNCTION1 +keyReleased FUNCTION1 +keyTyped FUNCTION1 +lerpColor FUNCTION1 +lerp FUNCTION1 +lightFalloff FUNCTION1 +lightness FUNCTION1 +lights FUNCTION1 +line FUNCTION1 +linePerspective FUNCTION1 +loadBytes FUNCTION1 +loadFont FUNCTION1 +loadImage FUNCTION1 +loadJSON FUNCTION1 +loadModel FUNCTION1 +loadPixels FUNCTION1 +loadShader FUNCTION1 +loadSound FUNCTION1 +loadStrings FUNCTION1 +loadTable FUNCTION1 +loadXML FUNCTION1 +log FUNCTION1 +loop FUNCTION1 +mag FUNCTION1 +map FUNCTION1 +matchAll FUNCTION1 +match FUNCTION1 +max FUNCTION1 +metalness FUNCTION1 +midiToFreq FUNCTION1 +millis FUNCTION1 +min FUNCTION1 +minute FUNCTION1 +model FUNCTION1 +month FUNCTION1 +mouseClicked FUNCTION1 +mouseDragged FUNCTION1 +mouseMoved FUNCTION1 +mousePressed FUNCTION1 +mouseReleased FUNCTION1 +mouseWheel FUNCTION1 +nfc FUNCTION1 +nf FUNCTION1 +nfp FUNCTION1 +nfs FUNCTION1 +noCanvas FUNCTION1 +noCursor FUNCTION1 +noDebugMode FUNCTION1 +noErase FUNCTION1 +noFill FUNCTION1 +noiseDetail FUNCTION1 +noise FUNCTION1 +noiseSeed FUNCTION1 +noLights FUNCTION1 +noLoop FUNCTION1 +normal FUNCTION1 +normalMaterial FUNCTION1 +norm FUNCTION1 +noSmooth FUNCTION1 +noStroke FUNCTION1 +noTint FUNCTION1 +orbitControl FUNCTION1 +ortho FUNCTION1 +outputVolume FUNCTION1 +p5 FUNCTION1 +paletteLerp FUNCTION1 +panorama FUNCTION1 +perspective FUNCTION1 +pixelDensity FUNCTION1 +plane FUNCTION1 +point FUNCTION1 +pointLight FUNCTION1 +pop FUNCTION1 +pow FUNCTION1 +preload FUNCTION1 +print FUNCTION1 +push FUNCTION1 +quad FUNCTION1 +quadraticVertex FUNCTION1 +radians FUNCTION1 +random FUNCTION1 +randomGaussian FUNCTION1 +randomSeed FUNCTION1 +rect FUNCTION1 +rectMode FUNCTION1 +red FUNCTION1 +redraw FUNCTION1 +removeElements FUNCTION1 +remove FUNCTION1 +removeItem FUNCTION1 +requestPointerLock FUNCTION1 +resetMatrix FUNCTION1 +resetShader FUNCTION1 +resizeCanvas FUNCTION1 +reverse FUNCTION1 +rotate FUNCTION1 +rotateX FUNCTION1 +rotateY FUNCTION1 +rotateZ FUNCTION1 +round FUNCTION1 +sampleRate FUNCTION1 +saturation FUNCTION1 +saveCanvas FUNCTION1 +saveFrames FUNCTION1 +save FUNCTION1 +saveGif FUNCTION1 +saveJSON FUNCTION1 +saveSound FUNCTION1 +saveStrings FUNCTION1 +saveTable FUNCTION1 +scale FUNCTION1 +second FUNCTION1 +selectAll FUNCTION1 +select FUNCTION1 +setAttributes FUNCTION1 +setBPM FUNCTION1 +setCamera FUNCTION1 +set FUNCTION1 +setMoveThreshold FUNCTION1 +setShakeThreshold FUNCTION1 +setup FUNCTION1 +shader FUNCTION1 +shearX FUNCTION1 +shearY FUNCTION1 +shininess FUNCTION1 +shorten FUNCTION1 +shuffle FUNCTION1 +sin FUNCTION1 +smooth FUNCTION1 +sort FUNCTION1 +soundFormats FUNCTION1 +specularColor FUNCTION1 +specularMaterial FUNCTION1 +sphere FUNCTION1 +splice FUNCTION1 +split FUNCTION1 +splitTokens FUNCTION1 +spotLight FUNCTION1 +sq FUNCTION1 +sqrt FUNCTION1 +square FUNCTION1 +storeItem FUNCTION1 +str FUNCTION1 +strokeCap FUNCTION1 +stroke FUNCTION1 +strokeJoin FUNCTION1 +strokeWeight FUNCTION1 +subset FUNCTION1 +tan FUNCTION1 +textAlign FUNCTION1 +textAscent FUNCTION1 +textDescent FUNCTION1 +textFont FUNCTION1 +text FUNCTION1 +textLeading FUNCTION1 +textOutput FUNCTION1 +textSize FUNCTION1 +textStyle FUNCTION1 +texture FUNCTION1 +textureMode FUNCTION1 +textureWrap FUNCTION1 +textWidth FUNCTION1 +textWrap FUNCTION1 +tint FUNCTION1 +torus FUNCTION1 +touchEnded FUNCTION1 +touchMoved FUNCTION1 +touchStarted FUNCTION1 +translate FUNCTION1 +triangle FUNCTION1 +trim FUNCTION1 +unchar FUNCTION1 +unhex FUNCTION1 +updatePixels FUNCTION1 +userStartAudio FUNCTION1 +vertex FUNCTION1 +windowResized FUNCTION1 +year FUNCTION1 + +# p5.js methods + +addChild FUNCTION2 +addClass FUNCTION2 +addColumn FUNCTION2 +addCue FUNCTION2 +add FUNCTION2 +addImpulse FUNCTION2 +addPhrase FUNCTION2 +addRow FUNCTION2 +amp FUNCTION2 +analyze FUNCTION2 +angleBetween FUNCTION2 +array FUNCTION2 +attack FUNCTION2 +attribute FUNCTION2 +autoplay FUNCTION2 +autoSized FUNCTION2 +begin FUNCTION2 +blend FUNCTION2 +calculateBoundingBox FUNCTION2 +camera FUNCTION2 +center FUNCTION2 +chain FUNCTION2 +channels FUNCTION2 +child FUNCTION2 +clampToZero FUNCTION2 +class FUNCTION2 +clearColors FUNCTION2 +clearCues FUNCTION2 +clear FUNCTION2 +clearRows FUNCTION2 +close FUNCTION2 +computeFaces FUNCTION2 +computeNormals FUNCTION2 +connect FUNCTION2 +copy FUNCTION2 +copyToContext FUNCTION2 +createCamera FUNCTION2 +createFramebuffer FUNCTION2 +create FUNCTION2 +cross FUNCTION2 +currentTime FUNCTION2 +delay FUNCTION2 +delayTime FUNCTION2 +disconnect FUNCTION2 +dispose FUNCTION2 +dist FUNCTION2 +div FUNCTION2 +dot FUNCTION2 +doubleClicked FUNCTION2 +draggable FUNCTION2 +dragLeave FUNCTION2 +dragOver FUNCTION2 +draw FUNCTION2 +drop FUNCTION2 +drywet FUNCTION2 +duration FUNCTION2 +end FUNCTION2 +equals FUNCTION2 +feedback FUNCTION2 +filter FUNCTION2 +findRow FUNCTION2 +findRows FUNCTION2 +flipU FUNCTION2 +flipV FUNCTION2 +frames FUNCTION2 +freq FUNCTION2 +fromAngle FUNCTION2 +fromAngles FUNCTION2 +frustum FUNCTION2 +gain FUNCTION2 +getAmount FUNCTION2 +getAmp FUNCTION2 +getArray FUNCTION2 +getAttributeCount FUNCTION2 +getBlob FUNCTION2 +getBPM FUNCTION2 +getCentroid FUNCTION2 +getChild FUNCTION2 +getChildren FUNCTION2 +getColumnCount FUNCTION2 +getColumn FUNCTION2 +getContent FUNCTION2 +getCurrentFrame FUNCTION2 +getEnergy FUNCTION2 +getFreq FUNCTION2 +get FUNCTION2 +getLevel FUNCTION2 +getName FUNCTION2 +getNum FUNCTION2 +getObject FUNCTION2 +getOctaveBands FUNCTION2 +getOversample FUNCTION2 +getPan FUNCTION2 +getParent FUNCTION2 +getPeaks FUNCTION2 +getPhrase FUNCTION2 +getRowCount FUNCTION2 +getRow FUNCTION2 +getRows FUNCTION2 +getSources FUNCTION2 +getString FUNCTION2 +getType FUNCTION2 +hasAttribute FUNCTION2 +hasChildren FUNCTION2 +hasClass FUNCTION2 +hasKey FUNCTION2 +heading FUNCTION2 +hideControls FUNCTION2 +hide FUNCTION2 +html FUNCTION2 +id FUNCTION2 +inspectHooks FUNCTION2 +isLoaded FUNCTION2 +isLooping FUNCTION2 +isPaused FUNCTION2 +isPlaying FUNCTION2 +jump FUNCTION2 +knee FUNCTION2 +lerp FUNCTION2 +limit FUNCTION2 +linAverages FUNCTION2 +listAttributes FUNCTION2 +listChildren FUNCTION2 +loadPixels FUNCTION2 +logAverages FUNCTION2 +lookAt FUNCTION2 +loop FUNCTION2 +mag FUNCTION2 +magSq FUNCTION2 +mask FUNCTION2 +matchRow FUNCTION2 +matchRows FUNCTION2 +maxDist FUNCTION2 +maxKey FUNCTION2 +maxValue FUNCTION2 +minKey FUNCTION2 +minValue FUNCTION2 +modify FUNCTION2 +mouseClicked FUNCTION2 +mouseMoved FUNCTION2 +mouseOut FUNCTION2 +mouseOver FUNCTION2 +mousePressed FUNCTION2 +mouseReleased FUNCTION2 +mouseWheel FUNCTION2 +move FUNCTION2 +mult FUNCTION2 +noLoop FUNCTION2 +normalize FUNCTION2 +noteADSR FUNCTION2 +noteAttack FUNCTION2 +noteRelease FUNCTION2 +numFrames FUNCTION2 +onended FUNCTION2 +onPeak FUNCTION2 +onStep FUNCTION2 +orient FUNCTION2 +orientX FUNCTION2 +orientY FUNCTION2 +orientZ FUNCTION2 +ortho FUNCTION2 +pan FUNCTION2 +parent FUNCTION2 +pause FUNCTION2 +perspective FUNCTION2 +phase FUNCTION2 +pixelDensity FUNCTION2 +play FUNCTION2 +playMode FUNCTION2 +position FUNCTION2 +positionX FUNCTION2 +positionY FUNCTION2 +positionZ FUNCTION2 +print FUNCTION2 +process FUNCTION2 +ramp FUNCTION2 +random2D FUNCTION2 +random3D FUNCTION2 +rate FUNCTION2 +ratio FUNCTION2 +record FUNCTION2 +reduction FUNCTION2 +reflect FUNCTION2 +release FUNCTION2 +rem FUNCTION2 +removeAttribute FUNCTION2 +removeChild FUNCTION2 +removeClass FUNCTION2 +removeColumn FUNCTION2 +removeCue FUNCTION2 +remove FUNCTION2 +removePhrase FUNCTION2 +removeRow FUNCTION2 +removeTokens FUNCTION2 +replaceSequence FUNCTION2 +reset FUNCTION2 +resetImpulse FUNCTION2 +res FUNCTION2 +resize FUNCTION2 +reverseBuffer FUNCTION2 +roll FUNCTION2 +rollof FUNCTION2 +rotate FUNCTION2 +sampleRate FUNCTION2 +save FUNCTION2 +saveJSON FUNCTION2 +saveObj FUNCTION2 +saveStl FUNCTION2 +saveTable FUNCTION2 +scale FUNCTION2 +serialize FUNCTION2 +setADSR FUNCTION2 +setAlpha FUNCTION2 +setAttribute FUNCTION2 +setBlue FUNCTION2 +setBPM FUNCTION2 +setBuffer FUNCTION2 +setContent FUNCTION2 +setExp FUNCTION2 +setFalloff FUNCTION2 +setFrame FUNCTION2 +set FUNCTION2 +setGreen FUNCTION2 +setHeading FUNCTION2 +setInput FUNCTION2 +setLoop FUNCTION2 +setMag FUNCTION2 +setName FUNCTION2 +setNum FUNCTION2 +setPath FUNCTION2 +setPosition FUNCTION2 +setRange FUNCTION2 +setRed FUNCTION2 +setSource FUNCTION2 +setString FUNCTION2 +setType FUNCTION2 +setUniform FUNCTION2 +setVolume FUNCTION2 +showControls FUNCTION2 +show FUNCTION2 +size FUNCTION2 +slerp FUNCTION2 +smooth FUNCTION2 +speed FUNCTION2 +start FUNCTION2 +stop FUNCTION2 +style FUNCTION2 +sub FUNCTION2 +syncedStart FUNCTION2 +textBounds FUNCTION2 +textToPoints FUNCTION2 +threshold FUNCTION2 +tilt FUNCTION2 +time FUNCTION2 +toggleClass FUNCTION2 +toggle FUNCTION2 +toggleImpulse FUNCTION2 +toggleNormalize FUNCTION2 +toString FUNCTION2 +touchEnded FUNCTION2 +touchMoved FUNCTION2 +touchStarted FUNCTION2 +triggerAttack FUNCTION2 +triggerRelease FUNCTION2 +trim FUNCTION2 +update FUNCTION2 +updatePixels FUNCTION2 +value FUNCTION2 +volume FUNCTION2 +waveform FUNCTION2 +width FUNCTION2 +write FUNCTION2 \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index d8465d8574..09aae712c1 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -83,6 +83,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E """.trimIndent() File("$folder/index.html").writeText(indexHtml) + // TODO: Install `pnpm` automatically, stand-alone, and use as Node manager runNpmActions(folder, TYPE.npm, listOf("install", "-g", "pnpm")) // --dangerously-allow-all-builds allows electron in particular to install properly runNpmActions(folder, TYPE.pnpm, listOf("install", "--dangerously-allow-all-builds")) From 42a055a230aaf9f688932adf4cc8164e33d7bb12 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 24 Sep 2025 20:40:47 +0200 Subject: [PATCH 08/31] Add first round of error reporting --- p5js/js/index.html | 6 ++-- p5js/js/main.js | 3 +- p5js/js/preload.js | 10 ++++-- p5js/js/renderer.js | 54 ++++++++++++++++++++---------- p5js/src/main/kotlin/p5jsEditor.kt | 38 ++++++++++++--------- 5 files changed, 72 insertions(+), 39 deletions(-) diff --git a/p5js/js/index.html b/p5js/js/index.html index 26814c980c..7a6862119b 100644 --- a/p5js/js/index.html +++ b/p5js/js/index.html @@ -1,8 +1,6 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/p5js/js/package.json b/p5js/js/package.json index 013d5ba9c9..5e642aabe2 100644 --- a/p5js/js/package.json +++ b/p5js/js/package.json @@ -1,7 +1,7 @@ { - "name": "p5js-mode-scaffold", + "name": "sketch", "version": "0.1.0", - "main": "main.js", + "main": "electron/main.js", "build": { "appId": "org.processing.user.p5mode", "electronLanguages": [], diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/4bf74c6ffbbb1552-AssetGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/4bf74c6ffbbb1552-AssetGraph new file mode 100644 index 0000000000000000000000000000000000000000..420f4bf10a4f31beca363496bc236f7427328e65 GIT binary patch literal 524 zcmbV}K}*9x5QVpCl0%`0c<~~_u;4{X_241Bw5Ui>q||_yLRqsz5@|DWcheH`<8_-h zMGs!Omsw`t_n3M6eL~O^TBCVVqDTpR&P`PyoZb#@?gqnPa(Dxeb0szrcx$mNk-*DI zqMmdJoJ@j09xEaPZiBnceWx7OUCuht7xGiYn8(#ircH~_{RfBbPG?__Dd3?@P|y9S zbvwr8Kc;q|w_WJfE*#2`!Pz3F++c2=v5IKd9<>pKEO4x1n@%Vrx<4pKmfXi=6>chY zI;{P=3;j41d4jSDTaN+;=YKj=MTJO&$tb_NW^l3pFe(fEo|$xpD_WzR3S}qK3%D#4 ht}`n2TebS25K{{yeNdG`PS literal 0 HcmV?d00001 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/5b6b910c9a62bee1-BundleGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/5b6b910c9a62bee1-BundleGraph new file mode 100644 index 0000000000000000000000000000000000000000..c0f775f600ab485e7c354f841c92d4062a54c777 GIT binary patch literal 10454 zcmeGiO>g7IRhIQ-%d%DN2N1MHoT-YmL161!vfP8cyVhE5cDq=~2nrMyhU8FUmLeGr zMVddo4#9COSu$35oQV~>06Kj@`>k3-57X=RN?(&nH6Ml*cx&6}Aw@4b1W zng8sVBrnYjMQ0CfYE4X%DVLo~i;+@ouiDzHbnjguNxEFN>GL5;Ur>FaO^2jBJ}Iv*T2$P1LGnvxIQHd;TTIqejoIBHbUBc1&2sh}?zh~D z5c%Db!Xoi)*|crOEz?jmWBinTI%C`+KNpQ{@wv#~O^H$XG^(bvZmr#tXuHm;GHZ0I zEy*9lreK34^I7Nc>j`xx(UIgWDnFxRflIhaa{bWWb*MdN&L|jLwCiAa#fBnxRN8K+ zveaqRo2_6>3bUA@Fhjnaj|t@-r{968u0wos9KY(g)9tU|IHKfxs&l1+{O(Q-7?pn8w2>!v&+>&&~{3A`WDav4*Pt2LFpd6;!OV%Sr0T{@p#ZFC) zJ43P|cs!z(=_Z7r+&oE5nL`nf5lUf_lmQY4IMoc2RiNnu%_cdfGug3002>JML{G9v zvj@Z5ux663$!E4s*7iN=pXa?EK%{eB-SU+a8UUL#hyEPsO$X8Ub0j01`fO_S?}FCC z@+oml*G;N-IJA*lA~}Vr3`|_;Q@vFAHcJMBKg z#mi49e-Mn^-SQ3Mpw^T-Ex92nYLhjq)VJw0MR_iobBuHY6;g8?rVK+18*zte@PFW1 z<0f0uxbWozO9v)s+(W4QodTvpwxIHm8O){*dWfyLm(m!ld{L?4jO7DaQ5&^N4R#ODXGOtaC&8vb zl2#McE%>~Fqw2+H9XP69+);(CBPzrN^GMFkV>eB#-|3l<5{k0}!Vaz{B4E{ov#U+81o!1+ZF2ll^Z9O~fwzF$AeS z*tu}eb0Ew}!7j}nComn2j!25bmfin%36yreQNhIXTvOPIs=@#`?A|j&1IG%E4)!Zc zpFzX|TOYVgRU3<~uOL2v!ruxZKEOEdo^DD#_Z=~If4}ngs%v+p9x26lB^drPe<`Bu z&AGRY#DxDx|9bw51%G({?*G;Sp1*e^?{dTF;zLlkg>^ZE=uCLp%CZ2Xw=BSbNMeDP z7kQjn5O-XAmbnvML@&T_^UM6;GL<<0^-W``_-w%G4jso@!)jy^rSb6QHs7W0P{U!Av{8UycQp1Ik86aCgHh5b*RKP2>%i?rl1@^9pSHh7?xi_{u^Y3V;xgaj-ZZkM=V?rDzEI);e{bHZ5Lginej`YX_Q&3_(3HhH`ffSTjM>wVc z_Al}2!C(9Jpu|t44`_nYCtDRikOWAY!5=6b%(DDfV7dL4Y`=hZU%qAAZ{D(9(Cn+A z;+KIceinhh&FAOWH2T_yeRmD+CZIt5Z$cZU37f#HFycq3e+xX(>@fwU_`3QqS7IJcr62bCWOZ->e*|^h)3R8$k!$0jrhO~Mrja-X<2*ZpM$)t zJ>sz~(p;B}yEVFcL@+c3_%L`62KeuP_SH`YuePpz zk=0MdUpVzM@jt)eHB0QVL4PxTi`?HLZ@yOOZ$rb#fB*erw**tgf2#Y+(7cZin!I-t zhcHF|@f*zL4UkFxy>zcN#e@@uYJA89#N5zVpWn_YQ5d)G!B~WiXy?C+0TNDf_s<# sg$z6siB8b(s+)9E@V=rTPw+{R;?eU%xRfe*L-Sw#@#91}k#N`l3nF!LkpKVy literal 0 HcmV?d00001 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/ad1b0593f5b37dda-AssetGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/ad1b0593f5b37dda-AssetGraph new file mode 100644 index 0000000000000000000000000000000000000000..11b93fce8b002dce929be6d986a8d5ee48a6efe2 GIT binary patch literal 5317 zcmeHL>u=l05tn7^VcCjR=YbxshXi|SuedundcWKP&cjM{P0}EikuQf6mfWSZ7mCYr zDJL%f#r{S8($4TDin1^M&<|JO7FaDgvs%u~&irO}|8powg(}6p7cO-ck`(K8@5a@+ z6}LV2YNi}+2vcx(G=(pn8?JD?V^2l@Jj_grK1ZsXlkXYQb-8k+&4fLF$N#b7$|GNf ze|E#y&GmgPlp>mA3X6|g{hm(yZQe9^XVC2Fkqnh^8Jv=6TgJDy)LUdF*>|Y%fzCr- z&d-zUMSJK`ch0?8EL--|v3Ru(GX^H@cT7VcblTlsEED4nw;8vMt3)QW`}X|3#K2im zs|g2rJR4u2_y@}^`jT;nx$q@N27Oth3 z@CR6?px}ERe9Z#WPs*fdNNcsUClA1DVf)xNXXNMoUB5`Gp&kJmOxP^84aUQa>_Z?* z>ynRQ(`KaLQhUy4q@=Evy0p{@+4&a00(^vmq~C_h&qz_I_ndy11|m0nZIlOZ6b?tx zX8sW=Gj4JSaW)1!d&-b%&I(m(px4)q3c`Uhq5CufDtMfsd(P5vPW{3BqnBEVN zcQ$wB%1MH{Y*0H`VV2s*4EhxS?f^;2z7mX|nI^c2ni9$-(TM?yUf0P5VaU=hSEuz`o+n#b@BFvs@(#;-`N&Dwga*==;q9w7a| zfPkh>!08&zc7yUZY>e5{2SZW>2m(%n9Kgd1ZgZD<2!00%01FOIU1KfO*cckj?6ev! zNQi-wSu#LCobO29=|UvMueZS9@y!@K-p1f`;Ab6XBl7b}+32A50s<(JcH`t)x9#YLOaCsZ_00xlMw>VKU2wXV8M#iDoOYdiPWQ1T^v9GjX{*Oh_n67$ufmzM#F?^Y zT66yLD{-a~mOOEixnX-o8Yv5P9_D^h35$c5R4qtNH)*?x4&7|G8_i}ny%?51fVxqn z1W=H5Q&M42sTiKPwc=p5j*(Z!Is7$I5wVp7dcc{9; z0^>cD>SIXCn9e<@pfo5z_?sNI)7dG}6jURVe;+zD_cMk0ic6a>{u%( z#vrQ$WSU|gX7y_L0yCm452X*5uumJN%Jg&Tg+BH5c{#g9iZVmjj9Q7|?ybJvy z^glxX4tf)MANpUR-=^)rBwXXm)QJB>IyU5Ci$|p6+^|K+QtNj|FKNBQ1}9myXw907Vr2{UUK%9x?l@6BM%*y!%fplg=IzR-)F8XU6@e~R*0_q)RSC2 Im-CDN1)nc@$p8QV literal 0 HcmV?d00001 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/c9bdc1ca4c3eaea6-RequestGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/c9bdc1ca4c3eaea6-RequestGraph new file mode 100644 index 0000000000000000000000000000000000000000..e117ddf18b697425f74f5085e83d268a27390171 GIT binary patch literal 146798 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 CN5WVD literal 0 HcmV?d00001 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/data.mdb b/p5js/library/examples/Demos/TypeScript/.parcel-cache/data.mdb new file mode 100644 index 0000000000000000000000000000000000000000..3e7c365fbba828d08fd93e41517f15c3a58ce965 GIT binary patch literal 53248 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 literal 0 HcmV?d00001 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/lock.mdb b/p5js/library/examples/Demos/TypeScript/.parcel-cache/lock.mdb new file mode 100644 index 0000000000000000000000000000000000000000..49c82838388ece3d8e0b74e08a0e884199ec1d82 GIT binary patch literal 8272 zcmeIu!3{t_5Cu>iL@^R4{pdgk+>|9M(Sj1NL9$LFad3EZnVn?*?&i(YGG this.getColorVector(x)); + ; + let colours = new Array(); + for (var i = 0; i < total; i++) { + var colorPosition = i / total; + var scaledColorPosition = colorPosition * (rainbowColors.length - 1); + var colorIndex = Math.floor(scaledColorPosition); + var colorPercentage = scaledColorPosition - colorIndex; + var nameColor = this.getColorByPercentage(rainbowColors[colorIndex], rainbowColors[colorIndex + 1], colorPercentage); + colours.push(color(nameColor.x, nameColor.y, nameColor.z)); + } + return colours; + } + static getColorByPercentage(firstColor, secondColor, percentage) { + var firstColorCopy = firstColor.copy(); + var secondColorCopy = secondColor.copy(); + var deltaColor = secondColorCopy.sub(firstColorCopy); + var scaledDeltaColor = deltaColor.mult(percentage); + return firstColorCopy.add(scaledDeltaColor); + } +} +class PolygonHelper { + static draw(numberOfSides, width) { + push(); + const angle = TWO_PI / numberOfSides; + const radius = width / 2; + beginShape(); + for (let a = 0; a < TWO_PI; a += angle) { + let sx = cos(a) * radius; + let sy = sin(a) * radius; + vertex(sx, sy); + } + endShape(CLOSE); + pop(); + } +} +let numberOfShapesControl; +function setup() { + console.log("🚀 - Setup initialized - P5 is running"); + createCanvas(windowWidth, windowHeight); + rectMode(CENTER).noFill().frameRate(30); + numberOfShapesControl = createSlider(1, 30, 15, 1).position(10, 10).style("width", "100px"); +} +function windowResized() { + resizeCanvas(windowWidth, windowHeight); +} +function draw() { + background(0); + translate(width / 2, height / 2); + const numberOfShapes = numberOfShapesControl.value(); + const colours = ColorHelper.getColorsArray(numberOfShapes); + const speed = (frameCount / (numberOfShapes * 30)) * 2; + for (var i = 0; i < numberOfShapes; i++) { + push(); + const lineWidth = 8; + const spin = speed * (numberOfShapes - i); + const numberOfSides = 3 + i; + const width = 40 * i; + strokeWeight(lineWidth); + stroke(colours[i]); + rotate(spin); + PolygonHelper.draw(numberOfSides, width); + pop(); + } +} +//# sourceMappingURL=TypeScript.js.map \ No newline at end of file diff --git a/p5js/library/examples/Demos/TypeScript/TypeScript.js.map b/p5js/library/examples/Demos/TypeScript/TypeScript.js.map new file mode 100644 index 0000000000..c7f1b91f1c --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/TypeScript.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TypeScript.js","sourceRoot":"","sources":["sketch/ColorHelper.ts","sketch/PolygonHelper.ts","sketch/sketch.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/p5js/library/examples/Demos/TypeScript/global.d.ts b/p5js/library/examples/Demos/TypeScript/global.d.ts new file mode 100644 index 0000000000..2a7fc7817d --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/global.d.ts @@ -0,0 +1,4 @@ +import * as p5Global from 'p5/global' +import module = require('p5'); +export = module; +export as namespace p5; diff --git a/p5js/library/examples/Demos/TypeScript/package.json b/p5js/library/examples/Demos/TypeScript/package.json new file mode 100644 index 0000000000..0b1a0754b3 --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/package.json @@ -0,0 +1,37 @@ +{ + "name": "p5js-mode-demo-typescript", + "version": "0.1.0", + "main": "electron/main.js", + "build": { + "appId": "org.processing.user.p5mode", + "electronLanguages": [], + "linux": { + "target": [ + "AppImage" + ] + }, + "mac": { + "target": [ + "dmg" + ] + }, + "win": { + "target": [ + "portable" + ] + } + }, + "scripts": { + "sketch:start": "tsc && electron .", + "app:pack": "electron-builder" + }, + "devDependencies": { + "@types/p5": "^1.7.6", + "electron": "^37.4.0", + "electron-builder": "24.6.3", + "typescript": "^5.9.3" + }, + "dependencies": { + "p5": "^1.11.10" + } +} diff --git a/p5js/library/examples/Demos/TypeScript/pnpm-lock.yaml b/p5js/library/examples/Demos/TypeScript/pnpm-lock.yaml new file mode 100644 index 0000000000..4ae7477002 --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/pnpm-lock.yaml @@ -0,0 +1,2037 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + p5: + specifier: ^1.11.10 + version: 1.11.10 + devDependencies: + '@types/p5': + specifier: ^1.7.6 + version: 1.7.6 + electron: + specifier: ^37.4.0 + version: 37.7.0 + electron-builder: + specifier: 24.6.3 + version: 24.6.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + +packages: + + 7zip-bin@5.1.1: + resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@1.2.4': + resolution: {integrity: sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.3.4': + resolution: {integrity: sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==} + engines: {node: '>=8.6'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.18.11': + resolution: {integrity: sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==} + + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} + + '@types/p5@1.7.6': + resolution: {integrity: sha512-6pLTOo0V3N5jZb5nTwjiv3lPHLK3Z/TjbhQUj8CTWXocUk1Z/f6OHTp3Pcwi1BhWnf5gqKUcyEb1gP0KIJuQgw==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.6.3: + resolution: {integrity: sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==} + engines: {node: '>=14.0.0'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.1: + resolution: {integrity: sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==} + engines: {node: '>=12.0.0'} + + builder-util@24.5.0: + resolution: {integrity: sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dmg-builder@24.6.3: + resolution: {integrity: sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder@24.6.3: + resolution: {integrity: sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.5.0: + resolution: {integrity: sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==} + + electron@37.7.0: + resolution: {integrity: sha512-LBzvfrS0aalynOsnC11AD7zeoU8eOois090mzLpQM3K8yZ2N04i2ZW9qmHOTFLrXlKvrwRc7EbyQf1u8XHMl6Q==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.6: + resolution: {integrity: sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p5@1.11.10: + resolution: {integrity: sha512-lFe18Af+SUxyZyPkgza0DYhIV+Ymr1oD4w6Y0Bjhbi5TCaIktRys8xu847eH7epL/GZ1jATFekqW71/v4PvNGA==} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + +snapshots: + + 7zip-bin@5.1.1: {} + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@1.2.4': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.3.4': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.18.11 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 24.8.1 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.18.11 + + '@types/ms@2.1.0': {} + + '@types/node@22.18.11': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.8.1': + dependencies: + undici-types: 7.14.0 + + '@types/p5@1.7.6': {} + + '@types/plist@3.0.5': + dependencies: + '@types/node': 24.8.1 + xmlbuilder: 15.1.1 + optional: true + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.18.11 + + '@types/verror@1.10.11': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.18.11 + optional: true + + '@xmldom/xmldom@0.8.11': {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.6.3: + dependencies: + 7zip-bin: 5.1.1 + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 1.2.4 + '@electron/osx-sign': 1.3.3 + '@electron/universal': 1.3.4 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chromium-pickle-js: 0.2.0 + debug: 4.4.3 + ejs: 3.1.10 + electron-publish: 24.5.0 + form-data: 4.0.4 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.6 + js-yaml: 4.1.0 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.3 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + argparse@2.0.1: {} + + assert-plus@1.0.0: + optional: true + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + + builder-util-runtime@9.2.1: + dependencies: + debug: 4.4.3 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + builder-util@24.5.0: + dependencies: + 7zip-bin: 5.1.1 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.0 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + concat-map@0.0.1: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.4.5 + typescript: 5.9.3 + + core-util-is@1.0.2: + optional: true + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: + optional: true + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 + + dmg-builder@24.6.3: + dependencies: + app-builder-lib: 24.6.3 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.0 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder@24.6.3: + dependencies: + app-builder-lib: 24.6.3 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + dmg-builder: 24.6.3 + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + electron-publish@24.5.0: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron@37.7.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 22.18.11 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es6-error@4.1.1: + optional: true + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: + optional: true + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + optional: true + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: + optional: true + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-fullwidth-code-point@3.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.6: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lazy-val@1.0.5: {} + + lodash@4.17.21: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + node-addon-api@1.7.2: + optional: true + + normalize-url@6.1.0: {} + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-cancelable@2.1.1: {} + + p5@1.11.10: {} + + package-json-from-dist@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + progress@2.0.3: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + quick-lru@5.1.1: {} + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.1: {} + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.3: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.3 + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.1.3: + optional: true + + stat-mode@1.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + type-fest@0.13.1: + optional: true + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + undici-types@7.14.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf8-byte-length@1.0.5: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 diff --git a/p5js/library/examples/Demos/TypeScript/sketch/ColorHelper.ts b/p5js/library/examples/Demos/TypeScript/sketch/ColorHelper.ts new file mode 100644 index 0000000000..94ec7e0b3c --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/sketch/ColorHelper.ts @@ -0,0 +1,56 @@ +class ColorHelper { + private static getColorVector(c: p5.Color) { + return createVector( + red(c), + green(c), + blue(c) + ); + } + + public static rainbowColorBase() { + return [ + color('red'), + color('orange'), + color('yellow'), + color('green'), + color(38, 58, 150), // blue + color('indigo'), + color('violet') + ]; + } + + public static getColorsArray(total: number, baseColorArray: p5.Color[] = null): p5.Color[] { + + if (baseColorArray == null) { + baseColorArray = ColorHelper.rainbowColorBase(); + } + var rainbowColors = baseColorArray.map(x => this.getColorVector(x));; + + let colours = new Array(); + for (var i = 0; i < total; i++) { + var colorPosition = i / total; + var scaledColorPosition = colorPosition * (rainbowColors.length - 1); + + var colorIndex = Math.floor(scaledColorPosition); + var colorPercentage = scaledColorPosition - colorIndex; + + var nameColor = this.getColorByPercentage(rainbowColors[colorIndex], + rainbowColors[colorIndex + 1], + colorPercentage); + + colours.push(color(nameColor.x, nameColor.y, nameColor.z)) + } + + return colours; + } + + private static getColorByPercentage(firstColor: p5.Vector, secondColor: p5.Vector, percentage: number) { + // assumes colors are p5js vectors + var firstColorCopy = firstColor.copy(); + var secondColorCopy = secondColor.copy(); + + var deltaColor = secondColorCopy.sub(firstColorCopy); + var scaledDeltaColor = deltaColor.mult(percentage); + return firstColorCopy.add(scaledDeltaColor); + } +} \ No newline at end of file diff --git a/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts b/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts new file mode 100644 index 0000000000..2ca077eee2 --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts @@ -0,0 +1,15 @@ +class PolygonHelper { + public static draw(numberOfSides: number, width: number) { + push(); + const angle = TWO_PI / numberOfSides; + const radius = width / 2; + beginShape(); + for (let a = 0; a < TWO_PI; a += angle) { + let sx = cos(a) * radius; + let sy = sin(a) * radius; + vertex(sx, sy); + } + endShape(CLOSE); + pop(); + } +} diff --git a/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts b/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts new file mode 100644 index 0000000000..ae18184251 --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts @@ -0,0 +1,47 @@ +// GLOBAL VARS & TYPES +let numberOfShapesControl: p5.Element; + +// P5 WILL AUTOMATICALLY USE GLOBAL MODE IF A DRAW() FUNCTION IS DEFINED +function setup() { + console.log("🚀 - Setup initialized - P5 is running"); + + createCanvas(windowWidth, windowHeight) + rectMode(CENTER).noFill().frameRate(30); + // NUMBER OF SHAPES SLIDER + numberOfShapesControl = createSlider(1, 30, 15, 1).position(10, 10).style("width", "100px"); +} + +// p5 WILL AUTO RUN THIS FUNCTION IF THE BROWSER WINDOW SIZE CHANGES +function windowResized() { + resizeCanvas(windowWidth, windowHeight); +} + +// p5 WILL HANDLE REQUESTING ANIMATION FRAMES FROM THE BROWSER AND WIL RUN DRAW() EACH ANIMATION FROME +function draw() { + + // CLEAR BACKGROUND + background(0); + + // CENTER OF SCREEN + translate(width / 2,height / 2); + + const numberOfShapes = numberOfShapesControl.value(); + const colours = ColorHelper.getColorsArray(numberOfShapes); + + // CONSISTENT SPEED REGARDLESS OF FRAMERATE + const speed = (frameCount / (numberOfShapes * 30)) * 2; + + // DRAW ALL SHAPES + for (var i = 0; i < numberOfShapes; i++) { + push(); + const lineWidth = 8; + const spin = speed * (numberOfShapes - i); + const numberOfSides = 3 + i; + const width = 40 * i; + strokeWeight(lineWidth); + stroke(colours[i]); + rotate(spin); + PolygonHelper.draw(numberOfSides, width) + pop(); + } +} \ No newline at end of file diff --git a/p5js/library/examples/Demos/TypeScript/tsconfig.json b/p5js/library/examples/Demos/TypeScript/tsconfig.json new file mode 100644 index 0000000000..8a0272c26f --- /dev/null +++ b/p5js/library/examples/Demos/TypeScript/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "none", + "noImplicitAny": true, + "outFile": "TypeScript.js", + "preserveConstEnums": true, + "removeComments": true, + "rootDir": "./sketch/", + "sourceMap": true, + "target": "ESNext", + "moduleResolution": "node" + } +} diff --git a/p5js/src/main/kotlin/p5js.kt b/p5js/src/main/kotlin/p5js.kt index 1bf8af078d..074e92b4b8 100644 --- a/p5js/src/main/kotlin/p5js.kt +++ b/p5js/src/main/kotlin/p5js.kt @@ -21,10 +21,10 @@ class p5js(base: Base, folder: File): Mode(base, folder) { } override fun getExtensions(): Array { - return arrayOf("js", "html") + return arrayOf("js", "ts") } override fun getIgnorable(): Array { - return arrayOf("bak", "tmp") + return arrayOf("node_modules") } } \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index b7cbcecb0e..8dfde3e44f 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -17,11 +17,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.withContext +import kotlinx.html.dom.createHTMLDocument +import kotlinx.html.dom.serialize +import kotlinx.html.* import kotlinx.serialization.json.* import processing.app.* import processing.app.syntax.JEditTextArea @@ -37,7 +36,15 @@ import java.io.InputStreamReader import java.net.URL import javax.swing.JMenu import javax.swing.JMenuItem -import kotlin.jvm.optionals.getOrNull +import kotlin.text.charset +import kotlin.text.contains +import kotlin.text.decodeToString +import kotlin.text.isNotBlank +import kotlin.text.lowercase +import kotlin.text.split +import kotlin.text.startsWith +import kotlin.text.toInt +import kotlin.text.trimIndent class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): Editor(base, path, state, mode) { @@ -49,42 +56,18 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E init { scope.launch { val folder = sketch.folder - val name = sketch.name - - // TODO: `getContentFile` is deprecated; move to JAR resource system if time allows - var javascriptFolder = mode?.getContentFile("js") - // TODO: Better error handling in case Electron scaffolding is not found - javascriptFolder?.listFiles()?.forEach { it.copyTo(File(folder, it.name), true) } - - // TODO: Find a better way to load actual sketch file - val indexHtml = """ - - - - - - - - - - - - - - - """.trimIndent() - File("$folder/index.html").writeText(indexHtml) - - // TODO: refactor into functions - // Check whether `pnpm` is already installed; horrible code—my apologies! + + // Copy all Electron scaffolding mode’s `js` folder + var electronFolder = mode?.getContentFile("js/electron") + electronFolder?.copyTo(folder, true) + + // Only copy `package.json` and `pnpm-lock.yaml` if not existent + mode?.getContentFile("js/package.json")?.copyTo(folder) + mode?.getContentFile("js/pnpm-lock.yaml")?.copyTo(folder) + + createIndexHtml() + + // TODO: refactor into functions, pick up crucial information from stdout statusNotice("Looking for pnpm…") try { runCommand("pnpm -v") @@ -105,10 +88,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E } } - // --dangerously-allow-all-builds allows electron in particular to install properly - runCommand("pnpm install --dangerously-allow-all-builds") { - statusNotice("All done! Enjoy p5.js mode.") - } + statusNotice("All done! Enjoy p5.js mode.") } } @@ -254,8 +234,30 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E return footer } - private fun filenameToCodeIndex(filename: String) { + fun createIndexHtml() { + val htmlCode = createHTMLDocument().html { + comment("This file is managed by the p5.js mode. Do not change manually!") + head { + meta { charset = "utf-8" } + meta { + name = "viewport" + content = "width=device-width, initial-scale=1" + } + title { +sketch.mainName } + link(href = "style.css", rel = "stylesheet") + } + body { + script(src = "renderer.js") {} + script(src = "../node_modules/p5/lib/p5.min.js") {} + script(src = "../node_modules/p5/lib/addons/p5.sound.js") {} + sketch.code.forEach { code -> + script(src = "../${code.file.name}") {} + } + script(src = "resizer.js") {} + } + }.serialize(true) + sketch.folder.resolve("electron/index.html").writeText(htmlCode) } fun runCommand(action: String, directory: File = sketch.folder, onFinished: () -> Unit = {}) { diff --git a/p5js/src/main/kotlin/p5jsEditorToolbar.kt b/p5js/src/main/kotlin/p5jsEditorToolbar.kt index 55202bd4a3..b8dea474e2 100644 --- a/p5js/src/main/kotlin/p5jsEditorToolbar.kt +++ b/p5js/src/main/kotlin/p5jsEditorToolbar.kt @@ -8,12 +8,18 @@ import processing.app.ui.EditorToolbar class p5jsEditorToolbar(editor: p5jsEditor) : EditorToolbar(editor) { override fun handleRun(modifiers: Int) { val editor = editor as p5jsEditor - editor.sketch.save() + + // TODO: Re-create index.html here instead of on saveAs/rename/delete of code? + editor.createIndexHtml() + activateRun() editor.statusNotice("Starting up sketch…") editor.scope.launch { + // TODO: Smarter way to only install deps when needed? + // --dangerously-allow-all-builds allows electron in particular to install properly + editor.runCommand("pnpm install --dangerously-allow-all-builds") editor.runCommand("pnpm sketch:start") { deactivateRun() editor.statusEmpty() From ca7b10e4abb012caaeb8d41b187fac762cda4062 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 22 Oct 2025 11:33:59 +0200 Subject: [PATCH 19/31] Fix bugs towards a better editor experience --- p5js/js/electron/main.js | 2 ++ p5js/src/main/kotlin/p5jsEditor.kt | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/p5js/js/electron/main.js b/p5js/js/electron/main.js index c41443c99d..1698758bd0 100644 --- a/p5js/js/electron/main.js +++ b/p5js/js/electron/main.js @@ -3,6 +3,7 @@ const { app, BrowserWindow, globalShortcut, ipcMain } = require('electron'); const createWindow = () => { const win = new BrowserWindow({ + show: false, width: 400, height: 400, useContentSize: true, @@ -45,5 +46,6 @@ app.whenReady().then(() => { ipcMain.on("resize", (event, {width, height}) => { win.setSize(width, height); + win.show(); }); }); \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index 8dfde3e44f..82cbc24d54 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -58,12 +58,12 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E val folder = sketch.folder // Copy all Electron scaffolding mode’s `js` folder - var electronFolder = mode?.getContentFile("js/electron") - electronFolder?.copyTo(folder, true) + var javascriptFolder = mode?.getContentFile("js") + javascriptFolder?.resolve("electron")?.copyRecursively(folder.resolve("electron"), true) // Only copy `package.json` and `pnpm-lock.yaml` if not existent - mode?.getContentFile("js/package.json")?.copyTo(folder) - mode?.getContentFile("js/pnpm-lock.yaml")?.copyTo(folder) + javascriptFolder?.resolve("package.json")?.copyTo(folder.resolve("package.json")) + javascriptFolder?.resolve("pnpm-lock.yaml")?.copyTo(folder.resolve("pnpm-lock.yaml")) createIndexHtml() @@ -293,7 +293,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E while (reader.readLine().also { line = it } != null) { // TODO: so much refactoring! // Only check for errors when running the sketch - if (action.startsWith("npx") && line.startsWith("error")) { + if (action == "pnpm sketch:start" && line.startsWith("error")) { // TODO: more robust data exchange, double-check with @Stef // TODO: `statusError` does not do anything with column of a SketchException val ( msgType, msgText, msgFile, msgLine, msgCol ) = line.split("|") From 824fd705904e9ff1bf6a021b742437e70ed05f64 Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 22 Oct 2025 14:38:14 +0200 Subject: [PATCH 20/31] Fix #2: Use CSS over device pixels for window size --- p5js/js/electron/resizer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/p5js/js/electron/resizer.js b/p5js/js/electron/resizer.js index 893a74f59a..156d647e75 100644 --- a/p5js/js/electron/resizer.js +++ b/p5js/js/electron/resizer.js @@ -7,7 +7,10 @@ const observer = new MutationObserver((mutationList) => { mutation => mutation.addedNodes[0]?.nodeName === "MAIN" ).length > 0; if (p5Ready) { - const { width, height } = document.querySelector("canvas"); + // Choose CSS over device pixels for proper window size across all screens + const { style } = document.querySelector("canvas"); + const width = parseInt(style.width); + const height = parseInt(style.height); pde.resize({ width, height From c671703f38679233b5e78da2f9c4d6151a047b9d Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 22 Oct 2025 16:26:55 +0200 Subject: [PATCH 21/31] Fix TypeScript example, examples run w/o saving --- p5js/js/pnpm-lock.yaml | 1869 +-- .../.parcel-cache/4bf74c6ffbbb1552-AssetGraph | Bin 524 -> 0 bytes .../5b6b910c9a62bee1-BundleGraph | Bin 10454 -> 0 bytes .../.parcel-cache/ad1b0593f5b37dda-AssetGraph | Bin 5317 -> 0 bytes .../c9bdc1ca4c3eaea6-RequestGraph | Bin 146798 -> 0 bytes .../Demos/TypeScript/.parcel-cache/data.mdb | Bin 53248 -> 0 bytes .../Demos/TypeScript/.parcel-cache/lock.mdb | Bin 8272 -> 0 bytes .../snapshot-c9bdc1ca4c3eaea6.txt | 11091 ---------------- .../examples/Demos/TypeScript/TypeScript.js | 1 - .../Demos/TypeScript/TypeScript.js.map | 2 +- .../{sketch/ColorHelper.ts => TypeScript.ts} | 64 +- .../examples/Demos/TypeScript/package.json | 1 + .../Demos/TypeScript/sketch/PolygonHelper.ts | 15 - .../Demos/TypeScript/sketch/sketch.ts | 47 - .../examples/Demos/TypeScript/tsconfig.json | 1 - p5js/src/main/kotlin/p5jsEditor.kt | 49 +- 16 files changed, 1201 insertions(+), 11939 deletions(-) delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/4bf74c6ffbbb1552-AssetGraph delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/5b6b910c9a62bee1-BundleGraph delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/ad1b0593f5b37dda-AssetGraph delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/c9bdc1ca4c3eaea6-RequestGraph delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/data.mdb delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/lock.mdb delete mode 100644 p5js/library/examples/Demos/TypeScript/.parcel-cache/snapshot-c9bdc1ca4c3eaea6.txt rename p5js/library/examples/Demos/TypeScript/{sketch/ColorHelper.ts => TypeScript.ts} (51%) delete mode 100644 p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts delete mode 100644 p5js/library/examples/Demos/TypeScript/sketch/sketch.ts diff --git a/p5js/js/pnpm-lock.yaml b/p5js/js/pnpm-lock.yaml index d80d77249c..b60c3af1c3 100644 --- a/p5js/js/pnpm-lock.yaml +++ b/p5js/js/pnpm-lock.yaml @@ -9,31 +9,62 @@ importers: .: dependencies: p5: - specifier: ^2.0.5 - version: 2.0.5 - p5.sound: - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^1.11.10 + version: 1.11.11 devDependencies: electron: specifier: ^37.4.0 version: 37.4.0 + electron-builder: + specifier: 24.6.3 + version: 24.6.3 packages: - '@babel/runtime@7.28.3': - resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} - engines: {node: '>=6.9.0'} + 7zip-bin@5.1.1: + resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} - '@davepagurek/bezier-path@0.0.2': - resolution: {integrity: sha512-4L9ddgzZc9DRGyl1RrS3z5nwnVJoyjsAelVG4X1jh4tVxryEHr4H9QavhxW/my6Rn3669Qz6mhv8gd5O/WeFTA==} + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true '@electron/get@2.0.3': resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} - '@japont/unicode-range@1.0.0': - resolution: {integrity: sha512-BckHvA2XdjRBVAWe2uceNuRf78lBeI28kyWEbfr/Q2pE17POkwuZ6WWY/UMv8FL9iBxhW4xfDoNLM9UVZaTeUQ==} + '@electron/notarize@1.2.4': + resolution: {integrity: sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.3.4': + resolution: {integrity: sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==} + engines: {node: '>=8.6'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -43,86 +74,148 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.18.0': resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + app-builder-lib@24.6.3: + resolution: {integrity: sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==} + engines: {node: '>=14.0.0'} - asn1@0.1.11: - resolution: {integrity: sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==} - engines: {node: '>=0.4.9'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - assert-plus@0.1.5: - resolution: {integrity: sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - async@0.9.2: - resolution: {integrity: sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} - automation-events@7.1.12: - resolution: {integrity: sha512-JDdPQoV58WPm15/L3ABtIEiqyxLoW+yTYIEqYtrKZ7VizLSRXhMKRZbQ8CYc2mFq/lMRKUvqOj0OcT3zANFiXA==} - engines: {node: '>=18.2.0'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - aws-sign2@0.5.0: - resolution: {integrity: sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - boom@0.4.2: - resolution: {integrity: sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==} - engines: {node: '>=0.8.0'} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.1: + resolution: {integrity: sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==} + engines: {node: '>=12.0.0'} + + builder-util@24.5.0: + resolution: {integrity: sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -136,54 +229,66 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - colorjs.io@0.5.2: - resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - combined-stream@0.0.7: - resolution: {integrity: sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==} - engines: {node: '>= 0.8'} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} - cryptiles@0.2.2: - resolution: {integrity: sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==} - engines: {node: '>=0.8.0'} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - ctype@0.5.3: - resolution: {integrity: sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==} - engines: {node: '>= 0.4'} + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} @@ -210,47 +315,66 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@0.0.5: - resolution: {integrity: sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dmg-builder@24.6.3: + resolution: {integrity: sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder@24.6.3: + resolution: {integrity: sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.5.0: + resolution: {integrity: sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==} electron@37.4.0: resolution: {integrity: sha512-HhsSdWowE5ODOeWNc/323Ug2C52mq/TqNBG+4uMeOA3G2dMXNc/nfyi0RYu1rJEgiaJLEjtHveeZZaYRYFsFCQ==} engines: {node: '>= 12.20.55'} hasBin: true - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - entities@1.1.2: - resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -267,82 +391,76 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} hasBin: true - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} - file-saver@1.3.8: - resolution: {integrity: sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - forever-agent@0.5.2: - resolution: {integrity: sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - form-data@0.1.4: - resolution: {integrity: sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==} - engines: {node: '>= 0.8'} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -355,8 +473,9 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - gifenc@1.0.3: - resolution: {integrity: sha512-xdr6AdrfGBcfzncONUOlXMBuc5wJDtOueE3c5rdG0oNgtINLD+f2iFZltrBRZYzACRbKr+mSVU/x98zv2u3jmw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -381,6 +500,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -388,45 +511,45 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hawk@1.1.1: - resolution: {integrity: sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==} - engines: {node: '>=0.8.0'} - deprecated: This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues. - - hoek@0.9.1: - resolution: {integrity: sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==} - engines: {node: '>=0.8.0'} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-signature@0.10.1: - resolution: {integrity: sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==} - engines: {node: '>=0.8'} + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - i18next-browser-languagedetector@4.3.1: - resolution: {integrity: sha512-KIToAzf8zwWvacgnRwJp63ase26o24AuNUlfNVJ5YZAFmdGhsJpmFClxXPuk9rv1FMI4lnc8zLSqgZPEZMrW4g==} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} - i18next@19.9.2: - resolution: {integrity: sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg==} + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -434,27 +557,62 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.6: + resolution: {integrity: sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - libtess@1.2.2: - resolution: {integrity: sha512-Nps8HPeVVcsmJxUvFLKVJcCgcz+1ajPTXDVAVPs6+giOQP4AHV31uZFFkh+CKow/bkB7GbZWKmwmit7myaqDSw==} - - linkify-it@1.2.4: - resolution: {integrity: sha512-eGHwtlABkp1NOJSiKUNqBf3SYAS5jPHtvRXPAgNaQwTqmkTahjtiLH9NtxdR5IOPhNvwNMN/diswSfZKzUkhGg==} + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -463,9 +621,12 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - markdown-it@4.4.0: - resolution: {integrity: sha512-Rl8dHHeLuAh3E72OPY0tY7CLvlxgHiLhlshIYswAAabAg4YDBLa6e/LTgNkkxBO2K61ESzoquPQFMw/iMrT1PA==} - hasBin: true + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} @@ -475,41 +636,17 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-links@0.1.0: - resolution: {integrity: sha512-m+gI2Hrgro1O0SwqHd9cFkqN8VGzP56eprB63gxu6z9EFQDMeaR083wcNqMVADIbgiMP/TOCCe0ZIXHLBv2tUg==} - - mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-types@1.0.2: - resolution: {integrity: sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==} - engines: {node: '>= 0.8.0'} - mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.2.11: - resolution: {integrity: sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} hasBin: true mimic-response@1.0.1: @@ -523,43 +660,52 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - node-uuid@1.4.8: - resolution: {integrity: sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==} - deprecated: Use uuid module instead + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - oauth-sign@0.3.0: - resolution: {integrity: sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - omggif@1.0.10: - resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -567,71 +713,56 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} - p5.sound@0.2.0: - resolution: {integrity: sha512-0NDimegAS97BRC/1Hib5btwzZs0GZuC+TGpj5WYzIkjJY2wLmqqvye/jQOkckELIyDwiZa9ywPbl9qenhtrmBg==} - - p5@2.0.5: - resolution: {integrity: sha512-JeBIHvxmCK2TcKZiyqe0z6rPcSiSID1tbeFwo5FDBiwrmiGtAvLXRLjWtTDGEVHcr/EICe8hEmNwWIQ+xIzKeQ==} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + p5@1.11.11: + resolution: {integrity: sha512-k58mfexvavFb+KNRpi70PbkKE2gCNiWQkzS4kVOyC2F9SKGgYy1jSO+JXZ24ikXV9OvZIAxGusiSVWEijYrmNg==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - pixelmatch@7.1.0: - resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} - hasBin: true + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - pngjs@7.0.0: - resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} - engines: {node: '>=14.19.0'} + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - qs@1.0.2: - resolution: {integrity: sha512-tHuOP9TN/1VmDM/ylApGK1QF3PSIP8I6bHDEfoKNQeViREQ/sfu1bAUrA1hoDun8p8Tpm7jcsz47g+3PiGoYdg==} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} - request@2.40.0: - resolution: {integrity: sha512-waNoGB4Z7bPn+lgqPk7l7hhze4Vd68jKccnwLeS7vr9GMxz0iWQbYTbBNWzfIk87Urx7V44pu29qjF/omej+Fw==} - engines: {'0': node >= 0.8.0} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -639,21 +770,19 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - roarr@2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -666,100 +795,97 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - sntp@0.2.4: - resolution: {integrity: sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==} - engines: {node: '>=0.8.0'} - deprecated: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues. + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - standardized-audio-context@25.3.77: - resolution: {integrity: sha512-Ki9zNz6pKcC5Pi+QPjPyVsD9GwJIJWgryji0XL9cAJXMGyn+dPOf6Qik1AHei0+UNVcc4BOCa0hWLBzlwqsW/A==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - stringstream@0.0.6: - resolution: {integrity: sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - tldts-core@7.0.12: - resolution: {integrity: sha512-3K76aXywJFduGRsOYoY5JzINLs/WMlOkeDwPL+8OCPq2Rh39gkSDtWAxdJQlWjpun/xF/LHf29yqCi6VC/rHDA==} - - tldts@7.0.12: - resolution: {integrity: sha512-M9ZQBPp6FyqhMcl233vHYyYRkxXOA1SKGlnq13S0mJdUhRSwr2w6I8rlchPL73wBwRlyIZpFvpu2VcdSMWLYXw==} - hasBin: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} - tone@15.1.22: - resolution: {integrity: sha512-TCScAGD4sLsama5DjvTUXlLDXSqPealhL64nsdV1hhr6frPWve0DeSo63AKnSJwgfg55fhvxj0iPPRwPN5o0ag==} + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} - tunnel-agent@0.4.3: - resolution: {integrity: sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -768,41 +894,72 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} - yui@3.18.1: - resolution: {integrity: sha512-M4/mHnq5uGvpwKEpRBh3SclL70cpDEus9LNGnrK5ZBzp4HOoueY7EkXfgtRBd+9VOQHWlFukXL2udHE53N4Wqw==} - engines: {node: '>=0.8.0'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - yuidocjs@0.10.2: - resolution: {integrity: sha512-g0ZrXsaCmQL9zsvkgD+RxWDsMNkHne5tK72iWYodro9JQlfKxePcV1dwbGhKMy/fl1XCIW3R3erZudohU+PcEw==} - engines: {node: '>=0.10.0'} - hasBin: true + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} snapshots: - '@babel/runtime@7.28.3': {} + 7zip-bin@5.1.1: {} + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) - '@davepagurek/bezier-path@0.0.2': {} + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 '@electron/get@2.0.3': dependencies: @@ -818,14 +975,69 @@ snapshots: transitivePeerDependencies: - supports-color - '@japont/unicode-range@1.0.0': {} - - '@sindresorhus/is@4.6.0': {} - - '@szmarczak/http-timer@4.0.6': + '@electron/notarize@1.2.4': dependencies: - defer-to-connect: 2.0.1 - + debug: 4.4.1 + fs-extra: 9.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.1 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.3.4': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.1 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.1 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 @@ -833,84 +1045,135 @@ snapshots: '@types/node': 22.18.0 '@types/responselike': 1.0.3 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 22.18.0 + '@types/http-cache-semantics@4.0.4': {} '@types/keyv@3.1.4': dependencies: '@types/node': 22.18.0 + '@types/ms@2.1.0': {} + '@types/node@22.18.0': dependencies: undici-types: 6.21.0 + '@types/plist@3.0.5': + dependencies: + '@types/node': 22.18.0 + xmlbuilder: 15.1.1 + optional: true + '@types/responselike@1.0.3': dependencies: '@types/node': 22.18.0 + '@types/verror@1.10.11': + optional: true + '@types/yauzl@2.10.3': dependencies: '@types/node': 22.18.0 optional: true - accepts@1.3.8: + '@xmldom/xmldom@0.8.11': {} + + agent-base@6.0.2: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 - acorn-walk@8.3.4: + ajv@6.12.6: dependencies: - acorn: 8.15.0 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - acorn@8.15.0: {} + ansi-regex@5.0.1: {} - argparse@1.0.10: + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: dependencies: - sprintf-js: 1.0.3 + color-convert: 2.0.1 - array-flatten@1.1.1: {} + ansi-styles@6.2.3: {} - asn1@0.1.11: - optional: true + app-builder-bin@4.0.0: {} + + app-builder-lib@24.6.3: + dependencies: + 7zip-bin: 5.1.1 + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 1.2.4 + '@electron/osx-sign': 1.3.3 + '@electron/universal': 1.3.4 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chromium-pickle-js: 0.2.0 + debug: 4.4.1 + ejs: 3.1.10 + electron-publish: 24.5.0 + form-data: 4.0.4 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.6 + js-yaml: 4.1.0 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.2 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + argparse@2.0.1: {} - assert-plus@0.1.5: + assert-plus@1.0.0: optional: true - async@0.9.2: + astral-regex@2.0.0: optional: true - automation-events@7.1.12: - dependencies: - '@babel/runtime': 7.28.3 - tslib: 2.8.1 + async-exit-hook@2.0.1: {} - aws-sign2@0.5.0: - optional: true + async@3.2.6: {} - balanced-match@1.0.2: {} + asynckit@0.4.0: {} - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + at-least-node@1.0.0: {} - boolean@3.2.0: - optional: true + balanced-match@1.0.2: {} - boom@0.4.2: + base64-js@1.5.1: {} + + bluebird-lst@1.0.9: dependencies: - hoek: 0.9.1 + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: optional: true brace-expansion@1.1.12: @@ -918,9 +1181,49 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + buffer-crc32@0.2.13: {} - bytes@3.1.2: {} + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + + builder-util-runtime@9.2.1: + dependencies: + debug: 4.4.1 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + builder-util@24.5.0: + dependencies: + 7zip-bin: 5.1.1 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.0 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color cacheable-lookup@5.0.4: {} @@ -939,45 +1242,67 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bound@1.0.4: + chalk@4.1.2: dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - colorjs.io@0.5.2: {} - - combined-stream@0.0.7: + color-convert@2.0.1: dependencies: - delayed-stream: 0.0.5 - optional: true + color-name: 1.1.4 - concat-map@0.0.1: {} + color-name@1.1.4: {} - content-disposition@0.5.4: + combined-stream@1.0.8: dependencies: - safe-buffer: 5.2.1 + delayed-stream: 1.0.0 - content-type@1.0.5: {} + commander@5.1.0: {} - cookie-signature@1.0.6: {} + compare-version@0.1.2: {} - cookie@0.7.1: {} + concat-map@0.0.1: {} - cryptiles@0.2.2: + config-file-ts@0.2.6: dependencies: - boom: 0.4.2 + glob: 10.4.5 + typescript: 5.9.3 + + core-util-is@1.0.2: optional: true - ctype@0.5.3: + crc@3.8.0: + dependencies: + buffer: 5.7.1 optional: true - debug@2.6.9: + cross-spawn@7.0.6: dependencies: - ms: 2.0.0 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 debug@4.4.1: dependencies: @@ -1003,23 +1328,84 @@ snapshots: object-keys: 1.1.1 optional: true - delayed-stream@0.0.5: + delayed-stream@1.0.0: {} + + detect-node@2.1.0: optional: true - depd@2.0.0: {} + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 - destroy@1.2.0: {} + dmg-builder@24.6.3: + dependencies: + app-builder-lib: 24.6.3 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.0 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - supports-color - detect-node@2.1.0: + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 optional: true + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - ee-first@1.1.1: {} + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder@24.6.3: + dependencies: + app-builder-lib: 24.6.3 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + dmg-builder: 24.6.3 + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + electron-publish@24.5.0: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.5.0 + builder-util-runtime: 9.2.1 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color electron@37.4.0: dependencies: @@ -1029,16 +1415,14 @@ snapshots: transitivePeerDependencies: - supports-color - encodeurl@1.0.2: {} + emoji-regex@8.0.0: {} - encodeurl@2.0.0: {} + emoji-regex@9.2.2: {} end-of-stream@1.4.5: dependencies: once: 1.4.0 - entities@1.1.2: {} - env-paths@2.2.1: {} es-define-property@1.0.1: {} @@ -1049,66 +1433,21 @@ snapshots: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es6-error@4.1.1: optional: true - escape-html@1.0.3: {} + escalade@3.2.0: {} escape-string-regexp@4.0.0: optional: true - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - esprima@4.0.1: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extract-zip@2.0.1: dependencies: debug: 4.4.1 @@ -1119,36 +1458,39 @@ snapshots: transitivePeerDependencies: - supports-color + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - file-saver@1.3.8: {} - - finalhandler@1.3.1: + filelist@1.0.4: dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - forever-agent@0.5.2: {} + minimatch: 5.1.6 - form-data@0.1.4: + foreground-child@3.3.1: dependencies: - async: 0.9.2 - combined-stream: 0.0.7 - mime: 1.2.11 - optional: true + cross-spawn: 7.0.6 + signal-exit: 4.1.0 - forwarded@0.2.0: {} + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 - fresh@0.5.2: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 fs-extra@8.1.0: dependencies: @@ -1156,10 +1498,23 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs.realpath@1.0.0: {} function-bind@1.1.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1182,7 +1537,14 @@ snapshots: dependencies: pump: 3.0.3 - gifenc@1.0.3: {} + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 glob@7.2.3: dependencies: @@ -1227,6 +1589,8 @@ snapshots: graceful-fs@4.2.11: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -1234,55 +1598,53 @@ snapshots: has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 - hawk@1.1.1: + hosted-git-info@4.1.0: dependencies: - boom: 0.4.2 - cryptiles: 0.2.2 - hoek: 0.9.1 - sntp: 0.2.4 - optional: true - - hoek@0.9.1: - optional: true + lru-cache: 6.0.0 http-cache-semantics@4.2.0: {} - http-errors@2.0.0: + http-proxy-agent@5.0.0: dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-signature@0.10.1: - dependencies: - asn1: 0.1.11 - assert-plus: 0.1.5 - ctype: 0.5.3 - optional: true + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - i18next-browser-languagedetector@4.3.1: + https-proxy-agent@5.0.1: dependencies: - '@babel/runtime': 7.28.3 + agent-base: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color - i18next@19.9.2: + iconv-corefoundation@1.1.7: dependencies: - '@babel/runtime': 7.28.3 + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true - iconv-lite@0.4.24: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: + optional: true + inflight@1.0.6: dependencies: once: 1.4.0 @@ -1290,37 +1652,68 @@ snapshots: inherits@2.0.4: {} - ipaddr.js@1.9.1: {} + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-fullwidth-code-point@3.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.6: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 json-buffer@3.0.1: {} - json-stringify-safe@5.0.1: {} + json-schema-traverse@0.4.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - libtess@1.2.2: {} - - linkify-it@1.2.4: - dependencies: - uc.micro: 1.0.6 + lazy-val@1.0.5: {} lodash@4.17.21: {} lowercase-keys@2.0.0: {} - markdown-it@4.4.0: + lru-cache@10.4.3: {} + + lru-cache@6.0.0: dependencies: - argparse: 1.0.10 - entities: 1.1.2 - linkify-it: 1.2.4 - mdurl: 1.0.1 - uc.micro: 1.0.6 + yallist: 4.0.0 matcher@3.0.0: dependencies: @@ -1329,28 +1722,13 @@ snapshots: math-intrinsics@1.1.0: {} - mdn-links@0.1.0: {} - - mdurl@1.0.1: {} - - media-typer@0.3.0: {} - - merge-descriptors@1.0.3: {} - - methods@1.1.2: {} - mime-db@1.52.0: {} - mime-types@1.0.2: {} - mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime@1.2.11: - optional: true - - mime@1.6.0: {} + mime@2.6.0: {} mimic-response@1.0.1: {} @@ -1360,29 +1738,40 @@ snapshots: dependencies: brace-expansion: 1.1.12 - ms@2.0.0: {} + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 - ms@2.1.3: {} + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 - negotiator@0.6.3: {} + minimist@1.2.8: {} - node-uuid@1.4.8: {} + minipass@3.3.6: + dependencies: + yallist: 4.0.0 - normalize-url@6.1.0: {} + minipass@5.0.0: {} - oauth-sign@0.3.0: - optional: true + minipass@7.1.2: {} - object-inspect@1.13.4: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 - object-keys@1.1.1: + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + node-addon-api@1.7.2: optional: true - omggif@1.0.10: {} + normalize-url@6.1.0: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + object-keys@1.1.1: + optional: true once@1.4.0: dependencies: @@ -1390,93 +1779,50 @@ snapshots: p-cancelable@2.1.1: {} - p5.sound@0.2.0: - dependencies: - lodash: 4.17.21 - tone: 15.1.22 - yuidocjs: 0.10.2 - transitivePeerDependencies: - - supports-color - - p5@2.0.5: - dependencies: - '@davepagurek/bezier-path': 0.0.2 - '@japont/unicode-range': 1.0.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 - colorjs.io: 0.5.2 - escodegen: 2.1.0 - file-saver: 1.3.8 - gifenc: 1.0.3 - i18next: 19.9.2 - i18next-browser-languagedetector: 4.3.1 - libtess: 1.2.2 - omggif: 1.0.10 - pako: 2.1.0 - pixelmatch: 7.1.0 - zod: 3.25.76 - - pako@2.1.0: {} + p5@1.11.11: {} - parseurl@1.3.3: {} + package-json-from-dist@1.0.1: {} path-is-absolute@1.0.1: {} - path-to-regexp@0.1.12: {} + path-key@3.1.1: {} - pend@1.2.0: {} - - pixelmatch@7.1.0: + path-scurry@1.11.1: dependencies: - pngjs: 7.0.0 + lru-cache: 10.4.3 + minipass: 7.1.2 - pngjs@7.0.0: {} + pend@1.2.0: {} - progress@2.0.3: {} + picocolors@1.1.1: {} - proxy-addr@2.0.7: + plist@3.1.0: dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + progress@2.0.3: {} pump@3.0.3: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - qs@1.0.2: {} - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 + punycode@2.3.1: {} quick-lru@5.1.1: {} - range-parser@1.2.1: {} - - raw-body@2.5.2: + read-config-file@6.3.2: dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 - request@2.40.0: - dependencies: - forever-agent: 0.5.2 - json-stringify-safe: 5.0.1 - mime-types: 1.0.2 - node-uuid: 1.4.8 - qs: 1.0.2 - optionalDependencies: - aws-sign2: 0.5.0 - form-data: 0.1.4 - hawk: 1.1.1 - http-signature: 0.10.1 - oauth-sign: 0.3.0 - stringstream: 0.0.6 - tough-cookie: 6.0.0 - tunnel-agent: 0.4.3 + require-directory@2.1.1: {} resolve-alpn@1.2.1: {} @@ -1484,10 +1830,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - roarr@2.15.4: dependencies: boolean: 3.2.0 @@ -1498,103 +1840,79 @@ snapshots: sprintf-js: 1.1.3 optional: true - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.1: {} + semver-compare@1.0.0: optional: true semver@6.3.1: {} - semver@7.7.2: - optional: true - - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color + semver@7.7.2: {} serialize-error@7.0.1: dependencies: type-fest: 0.13.1 optional: true - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - - side-channel-list@1.0.0: + shebang-command@2.0.0: dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 + shebang-regex: 3.0.0 - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 + shebang-regex@3.0.0: {} - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 + signal-exit@4.1.0: {} - side-channel@1.1.0: + simple-update-notifier@2.0.0: dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 + semver: 7.7.2 - sntp@0.2.4: + slice-ansi@3.0.0: dependencies: - hoek: 0.9.1 + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 optional: true - source-map@0.6.1: + smart-buffer@4.2.0: optional: true - sprintf-js@1.0.3: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} sprintf-js@1.1.3: optional: true - standardized-audio-context@25.3.77: + stat-mode@1.0.0: {} + + string-width@4.2.3: dependencies: - '@babel/runtime': 7.28.3 - automation-events: 7.1.12 - tslib: 2.8.1 + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 - statuses@2.0.1: {} + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 - stringstream@0.0.6: - optional: true + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 sumchecker@3.0.1: dependencies: @@ -1602,72 +1920,95 @@ snapshots: transitivePeerDependencies: - supports-color - tldts-core@7.0.12: - optional: true - - tldts@7.0.12: + supports-color@7.2.0: dependencies: - tldts-core: 7.0.12 - optional: true + has-flag: 4.0.0 - toidentifier@1.0.1: {} + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 - tone@15.1.22: + temp-file@3.4.0: dependencies: - standardized-audio-context: 25.3.77 - tslib: 2.8.1 + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 - tough-cookie@6.0.0: + tmp-promise@3.0.3: dependencies: - tldts: 7.0.12 - optional: true + tmp: 0.2.5 - tslib@2.8.1: {} + tmp@0.2.5: {} - tunnel-agent@0.4.3: - optional: true + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 type-fest@0.13.1: optional: true - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - uc.micro@1.0.6: {} + typescript@5.9.3: {} undici-types@6.21.0: {} universalify@0.1.2: {} - unpipe@1.0.0: {} + universalify@2.0.1: {} - utils-merge@1.0.1: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 - vary@1.1.2: {} + utf8-byte-length@1.0.5: {} - wrappy@1.0.2: {} + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true - yauzl@2.10.0: + which@2.0.2: dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 + isexe: 2.0.0 - yui@3.18.1: + wrap-ansi@7.0.0: dependencies: - request: 2.40.0 + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - yuidocjs@0.10.2: + wrap-ansi@8.1.0: dependencies: - express: 4.21.2 - graceful-fs: 4.2.11 - markdown-it: 4.4.0 - mdn-links: 0.1.0 - minimatch: 3.1.2 - rimraf: 2.7.1 - yui: 3.18.1 - transitivePeerDependencies: - - supports-color + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} - zod@3.25.76: {} + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/4bf74c6ffbbb1552-AssetGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/4bf74c6ffbbb1552-AssetGraph deleted file mode 100644 index 420f4bf10a4f31beca363496bc236f7427328e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmbV}K}*9x5QVpCl0%`0c<~~_u;4{X_241Bw5Ui>q||_yLRqsz5@|DWcheH`<8_-h zMGs!Omsw`t_n3M6eL~O^TBCVVqDTpR&P`PyoZb#@?gqnPa(Dxeb0szrcx$mNk-*DI zqMmdJoJ@j09xEaPZiBnceWx7OUCuht7xGiYn8(#ircH~_{RfBbPG?__Dd3?@P|y9S zbvwr8Kc;q|w_WJfE*#2`!Pz3F++c2=v5IKd9<>pKEO4x1n@%Vrx<4pKmfXi=6>chY zI;{P=3;j41d4jSDTaN+;=YKj=MTJO&$tb_NW^l3pFe(fEo|$xpD_WzR3S}qK3%D#4 ht}`n2TebS25K{{yeNdG`PS diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/5b6b910c9a62bee1-BundleGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/5b6b910c9a62bee1-BundleGraph deleted file mode 100644 index c0f775f600ab485e7c354f841c92d4062a54c777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10454 zcmeGiO>g7IRhIQ-%d%DN2N1MHoT-YmL161!vfP8cyVhE5cDq=~2nrMyhU8FUmLeGr zMVddo4#9COSu$35oQV~>06Kj@`>k3-57X=RN?(&nH6Ml*cx&6}Aw@4b1W zng8sVBrnYjMQ0CfYE4X%DVLo~i;+@ouiDzHbnjguNxEFN>GL5;Ur>FaO^2jBJ}Iv*T2$P1LGnvxIQHd;TTIqejoIBHbUBc1&2sh}?zh~D z5c%Db!Xoi)*|crOEz?jmWBinTI%C`+KNpQ{@wv#~O^H$XG^(bvZmr#tXuHm;GHZ0I zEy*9lreK34^I7Nc>j`xx(UIgWDnFxRflIhaa{bWWb*MdN&L|jLwCiAa#fBnxRN8K+ zveaqRo2_6>3bUA@Fhjnaj|t@-r{968u0wos9KY(g)9tU|IHKfxs&l1+{O(Q-7?pn8w2>!v&+>&&~{3A`WDav4*Pt2LFpd6;!OV%Sr0T{@p#ZFC) zJ43P|cs!z(=_Z7r+&oE5nL`nf5lUf_lmQY4IMoc2RiNnu%_cdfGug3002>JML{G9v zvj@Z5ux663$!E4s*7iN=pXa?EK%{eB-SU+a8UUL#hyEPsO$X8Ub0j01`fO_S?}FCC z@+oml*G;N-IJA*lA~}Vr3`|_;Q@vFAHcJMBKg z#mi49e-Mn^-SQ3Mpw^T-Ex92nYLhjq)VJw0MR_iobBuHY6;g8?rVK+18*zte@PFW1 z<0f0uxbWozO9v)s+(W4QodTvpwxIHm8O){*dWfyLm(m!ld{L?4jO7DaQ5&^N4R#ODXGOtaC&8vb zl2#McE%>~Fqw2+H9XP69+);(CBPzrN^GMFkV>eB#-|3l<5{k0}!Vaz{B4E{ov#U+81o!1+ZF2ll^Z9O~fwzF$AeS z*tu}eb0Ew}!7j}nComn2j!25bmfin%36yreQNhIXTvOPIs=@#`?A|j&1IG%E4)!Zc zpFzX|TOYVgRU3<~uOL2v!ruxZKEOEdo^DD#_Z=~If4}ngs%v+p9x26lB^drPe<`Bu z&AGRY#DxDx|9bw51%G({?*G;Sp1*e^?{dTF;zLlkg>^ZE=uCLp%CZ2Xw=BSbNMeDP z7kQjn5O-XAmbnvML@&T_^UM6;GL<<0^-W``_-w%G4jso@!)jy^rSb6QHs7W0P{U!Av{8UycQp1Ik86aCgHh5b*RKP2>%i?rl1@^9pSHh7?xi_{u^Y3V;xgaj-ZZkM=V?rDzEI);e{bHZ5Lginej`YX_Q&3_(3HhH`ffSTjM>wVc z_Al}2!C(9Jpu|t44`_nYCtDRikOWAY!5=6b%(DDfV7dL4Y`=hZU%qAAZ{D(9(Cn+A z;+KIceinhh&FAOWH2T_yeRmD+CZIt5Z$cZU37f#HFycq3e+xX(>@fwU_`3QqS7IJcr62bCWOZ->e*|^h)3R8$k!$0jrhO~Mrja-X<2*ZpM$)t zJ>sz~(p;B}yEVFcL@+c3_%L`62KeuP_SH`YuePpz zk=0MdUpVzM@jt)eHB0QVL4PxTi`?HLZ@yOOZ$rb#fB*erw**tgf2#Y+(7cZin!I-t zhcHF|@f*zL4UkFxy>zcN#e@@uYJA89#N5zVpWn_YQ5d)G!B~WiXy?C+0TNDf_s<# sg$z6siB8b(s+)9E@V=rTPw+{R;?eU%xRfe*L-Sw#@#91}k#N`l3nF!LkpKVy diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/ad1b0593f5b37dda-AssetGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/ad1b0593f5b37dda-AssetGraph deleted file mode 100644 index 11b93fce8b002dce929be6d986a8d5ee48a6efe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5317 zcmeHL>u=l05tn7^VcCjR=YbxshXi|SuedundcWKP&cjM{P0}EikuQf6mfWSZ7mCYr zDJL%f#r{S8($4TDin1^M&<|JO7FaDgvs%u~&irO}|8powg(}6p7cO-ck`(K8@5a@+ z6}LV2YNi}+2vcx(G=(pn8?JD?V^2l@Jj_grK1ZsXlkXYQb-8k+&4fLF$N#b7$|GNf ze|E#y&GmgPlp>mA3X6|g{hm(yZQe9^XVC2Fkqnh^8Jv=6TgJDy)LUdF*>|Y%fzCr- z&d-zUMSJK`ch0?8EL--|v3Ru(GX^H@cT7VcblTlsEED4nw;8vMt3)QW`}X|3#K2im zs|g2rJR4u2_y@}^`jT;nx$q@N27Oth3 z@CR6?px}ERe9Z#WPs*fdNNcsUClA1DVf)xNXXNMoUB5`Gp&kJmOxP^84aUQa>_Z?* z>ynRQ(`KaLQhUy4q@=Evy0p{@+4&a00(^vmq~C_h&qz_I_ndy11|m0nZIlOZ6b?tx zX8sW=Gj4JSaW)1!d&-b%&I(m(px4)q3c`Uhq5CufDtMfsd(P5vPW{3BqnBEVN zcQ$wB%1MH{Y*0H`VV2s*4EhxS?f^;2z7mX|nI^c2ni9$-(TM?yUf0P5VaU=hSEuz`o+n#b@BFvs@(#;-`N&Dwga*==;q9w7a| zfPkh>!08&zc7yUZY>e5{2SZW>2m(%n9Kgd1ZgZD<2!00%01FOIU1KfO*cckj?6ev! zNQi-wSu#LCobO29=|UvMueZS9@y!@K-p1f`;Ab6XBl7b}+32A50s<(JcH`t)x9#YLOaCsZ_00xlMw>VKU2wXV8M#iDoOYdiPWQ1T^v9GjX{*Oh_n67$ufmzM#F?^Y zT66yLD{-a~mOOEixnX-o8Yv5P9_D^h35$c5R4qtNH)*?x4&7|G8_i}ny%?51fVxqn z1W=H5Q&M42sTiKPwc=p5j*(Z!Is7$I5wVp7dcc{9; z0^>cD>SIXCn9e<@pfo5z_?sNI)7dG}6jURVe;+zD_cMk0ic6a>{u%( z#vrQ$WSU|gX7y_L0yCm452X*5uumJN%Jg&Tg+BH5c{#g9iZVmjj9Q7|?ybJvy z^glxX4tf)MANpUR-=^)rBwXXm)QJB>IyU5Ci$|p6+^|K+QtNj|FKNBQ1}9myXw907Vr2{UUK%9x?l@6BM%*y!%fplg=IzR-)F8XU6@e~R*0_q)RSC2 Im-CDN1)nc@$p8QV diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/c9bdc1ca4c3eaea6-RequestGraph b/p5js/library/examples/Demos/TypeScript/.parcel-cache/c9bdc1ca4c3eaea6-RequestGraph deleted file mode 100644 index e117ddf18b697425f74f5085e83d268a27390171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146798 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 CN5WVD diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/data.mdb b/p5js/library/examples/Demos/TypeScript/.parcel-cache/data.mdb deleted file mode 100644 index 3e7c365fbba828d08fd93e41517f15c3a58ce965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 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 diff --git a/p5js/library/examples/Demos/TypeScript/.parcel-cache/lock.mdb b/p5js/library/examples/Demos/TypeScript/.parcel-cache/lock.mdb deleted file mode 100644 index 49c82838388ece3d8e0b74e08a0e884199ec1d82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8272 zcmeIu!3{t_5Cu>iL@^R4{pdgk+>|9M(Sj1NL9$LFad3EZnVn?*?&i(YGGnumberOfShapesControl.value(); + const colours = ColorHelper.getColorsArray(numberOfShapes); + + // CONSISTENT SPEED REGARDLESS OF FRAMERATE + const speed = (frameCount / (numberOfShapes * 30)) * 2; + + // DRAW ALL SHAPES + for (var i = 0; i < numberOfShapes; i++) { + push(); + const lineWidth = 8; + const spin = speed * (numberOfShapes - i); + const numberOfSides = 3 + i; + const width = 40 * i; + strokeWeight(lineWidth); + stroke(colours[i]); + rotate(spin); + PolygonHelper.draw(numberOfSides, width) + pop(); + } +} diff --git a/p5js/library/examples/Demos/TypeScript/package.json b/p5js/library/examples/Demos/TypeScript/package.json index 0b1a0754b3..5fbc6736cb 100644 --- a/p5js/library/examples/Demos/TypeScript/package.json +++ b/p5js/library/examples/Demos/TypeScript/package.json @@ -22,6 +22,7 @@ } }, "scripts": { + "sketch:build": "tsc", "sketch:start": "tsc && electron .", "app:pack": "electron-builder" }, diff --git a/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts b/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts deleted file mode 100644 index 2ca077eee2..0000000000 --- a/p5js/library/examples/Demos/TypeScript/sketch/PolygonHelper.ts +++ /dev/null @@ -1,15 +0,0 @@ -class PolygonHelper { - public static draw(numberOfSides: number, width: number) { - push(); - const angle = TWO_PI / numberOfSides; - const radius = width / 2; - beginShape(); - for (let a = 0; a < TWO_PI; a += angle) { - let sx = cos(a) * radius; - let sy = sin(a) * radius; - vertex(sx, sy); - } - endShape(CLOSE); - pop(); - } -} diff --git a/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts b/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts deleted file mode 100644 index ae18184251..0000000000 --- a/p5js/library/examples/Demos/TypeScript/sketch/sketch.ts +++ /dev/null @@ -1,47 +0,0 @@ -// GLOBAL VARS & TYPES -let numberOfShapesControl: p5.Element; - -// P5 WILL AUTOMATICALLY USE GLOBAL MODE IF A DRAW() FUNCTION IS DEFINED -function setup() { - console.log("🚀 - Setup initialized - P5 is running"); - - createCanvas(windowWidth, windowHeight) - rectMode(CENTER).noFill().frameRate(30); - // NUMBER OF SHAPES SLIDER - numberOfShapesControl = createSlider(1, 30, 15, 1).position(10, 10).style("width", "100px"); -} - -// p5 WILL AUTO RUN THIS FUNCTION IF THE BROWSER WINDOW SIZE CHANGES -function windowResized() { - resizeCanvas(windowWidth, windowHeight); -} - -// p5 WILL HANDLE REQUESTING ANIMATION FRAMES FROM THE BROWSER AND WIL RUN DRAW() EACH ANIMATION FROME -function draw() { - - // CLEAR BACKGROUND - background(0); - - // CENTER OF SCREEN - translate(width / 2,height / 2); - - const numberOfShapes = numberOfShapesControl.value(); - const colours = ColorHelper.getColorsArray(numberOfShapes); - - // CONSISTENT SPEED REGARDLESS OF FRAMERATE - const speed = (frameCount / (numberOfShapes * 30)) * 2; - - // DRAW ALL SHAPES - for (var i = 0; i < numberOfShapes; i++) { - push(); - const lineWidth = 8; - const spin = speed * (numberOfShapes - i); - const numberOfSides = 3 + i; - const width = 40 * i; - strokeWeight(lineWidth); - stroke(colours[i]); - rotate(spin); - PolygonHelper.draw(numberOfSides, width) - pop(); - } -} \ No newline at end of file diff --git a/p5js/library/examples/Demos/TypeScript/tsconfig.json b/p5js/library/examples/Demos/TypeScript/tsconfig.json index 8a0272c26f..a64abb6c4b 100644 --- a/p5js/library/examples/Demos/TypeScript/tsconfig.json +++ b/p5js/library/examples/Demos/TypeScript/tsconfig.json @@ -5,7 +5,6 @@ "outFile": "TypeScript.js", "preserveConstEnums": true, "removeComments": true, - "rootDir": "./sketch/", "sourceMap": true, "target": "ESNext", "moduleResolution": "node" diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index 82cbc24d54..9e4eb55247 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -18,9 +18,9 @@ import androidx.compose.ui.unit.dp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.html.* import kotlinx.html.dom.createHTMLDocument import kotlinx.html.dom.serialize -import kotlinx.html.* import kotlinx.serialization.json.* import processing.app.* import processing.app.syntax.JEditTextArea @@ -32,19 +32,11 @@ import java.awt.event.ActionEvent import java.awt.event.ActionListener import java.io.BufferedReader import java.io.File +import java.io.IOException import java.io.InputStreamReader import java.net.URL import javax.swing.JMenu import javax.swing.JMenuItem -import kotlin.text.charset -import kotlin.text.contains -import kotlin.text.decodeToString -import kotlin.text.isNotBlank -import kotlin.text.lowercase -import kotlin.text.split -import kotlin.text.startsWith -import kotlin.text.toInt -import kotlin.text.trimIndent class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): Editor(base, path, state, mode) { @@ -55,15 +47,20 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E init { scope.launch { - val folder = sketch.folder - - // Copy all Electron scaffolding mode’s `js` folder + // Copy all Electron scaffolding from mode’s `js` folder var javascriptFolder = mode?.getContentFile("js") - javascriptFolder?.resolve("electron")?.copyRecursively(folder.resolve("electron"), true) + javascriptFolder?.resolve("electron")?.copyRecursively(sketch.folder.resolve("electron"), true) // Only copy `package.json` and `pnpm-lock.yaml` if not existent - javascriptFolder?.resolve("package.json")?.copyTo(folder.resolve("package.json")) - javascriptFolder?.resolve("pnpm-lock.yaml")?.copyTo(folder.resolve("pnpm-lock.yaml")) + // Some examples bring their own + try { + javascriptFolder?.resolve("package.json")?.copyTo(sketch.folder.resolve("package.json")) + javascriptFolder?.resolve("pnpm-lock.yaml")?.copyTo(sketch.folder.resolve("pnpm-lock.yaml")) + } + catch (e: FileAlreadyExistsException) { + Messages.log("File already exists: ${e.message}") + // TODO: How to differentiate example with own `package.json` and saved sketch? + } createIndexHtml() @@ -157,7 +154,23 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E } override fun handleOpenInternal(path: String?) { - super.handleOpenInternal(path) + try { + sketch = Sketch(path, this) + + // If sketch is read-only move all files to temporary folder + // to allow them to run without saving first + if (sketch.isReadOnly) { + val newSketchFolder = sketch.makeTempFolder() + val mainSketchFile = File(path, "sketch-main.js").name + sketch.folder.copyRecursively(newSketchFolder) + sketch = Sketch(newSketchFolder.resolve(mainSketchFile).path, this) + } + } catch (e: IOException) { + throw EditorException("Could not create the sketch.", e) + } + + header.rebuild() + updateTitle() } override fun getCommentPrefix(): String { @@ -250,7 +263,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E script(src = "renderer.js") {} script(src = "../node_modules/p5/lib/p5.min.js") {} script(src = "../node_modules/p5/lib/addons/p5.sound.js") {} - sketch.code.forEach { code -> + sketch.code.filter { code -> code.file.extension == "js" }.forEach { code -> script(src = "../${code.file.name}") {} } script(src = "resizer.js") {} From 201e1977cba23b08c330db6f4bfd76495656ad9e Mon Sep 17 00:00:00 2001 From: Stephan Max Date: Wed, 22 Oct 2025 17:00:46 +0200 Subject: [PATCH 22/31] Fix BrowserWindow size (use content size) --- p5js/js/electron/main.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/p5js/js/electron/main.js b/p5js/js/electron/main.js index 1698758bd0..7f316b3672 100644 --- a/p5js/js/electron/main.js +++ b/p5js/js/electron/main.js @@ -3,10 +3,9 @@ const { app, BrowserWindow, globalShortcut, ipcMain } = require('electron'); const createWindow = () => { const win = new BrowserWindow({ - show: false, width: 400, height: 400, - useContentSize: true, + show: false, autoHideMenuBar: true, alwaysOnTop: true, webPreferences: { @@ -45,7 +44,7 @@ app.whenReady().then(() => { }); ipcMain.on("resize", (event, {width, height}) => { - win.setSize(width, height); + win.setContentSize(width, height); win.show(); }); }); \ No newline at end of file From 00ab8c21fcfaab385e7d20cbb23b9547c0af81b5 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 10:34:21 +0100 Subject: [PATCH 23/31] Add p5.js example download and update dependencies Introduces a Gradle task to download and extract p5.js examples for use in the project. Updates dependencies to use material3 components and changes theme usage in p5jsEditor.kt. Also sets Electron window 'alwaysOnTop' to false and fixes a reference to SketchException. --- p5js/build.gradle.kts | 28 +++++++++++++++++++++++++++- p5js/js/electron/main.js | 2 +- p5js/src/main/kotlin/p5jsEditor.kt | 16 +++++++++------- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index 36687d93ee..f946601eb2 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.compose.internal.de.undercouch.gradle.tasks.download.Download + plugins { kotlin("jvm") version libs.versions.kotlin kotlin("plugin.serialization") version "1.9.0" @@ -15,6 +17,7 @@ repositories { dependencies { compileOnly(project(":app")) + compileOnly(project(":app:utils")) implementation(project(":core")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") @@ -27,10 +30,33 @@ dependencies { implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) + implementation(libs.material3) +} + +tasks.register("includeP5jsExamples"){ + val examples = layout.buildDirectory.file("tmp/p5-examples.zip") + src("https://github.com/processing/p5.js-website/archive/refs/heads/2.0.zip") + dest(examples) + overwrite(false) + doLast{ + copy{ + from(zipTree(examples)){ // remove top level directory + include("*/src/content/examples/en/**/*") + eachFile { relativePath = RelativePath(true, *relativePath.segments.drop(5).toTypedArray()) } + eachFile{ + if(name != "code.js"){ return@eachFile } + + val parentName = this.file.parentFile.name + name = "$parentName.js" + } + } + into(layout.buildDirectory.dir("mode/examples/Basics")) + } + } } tasks.register("createMode") { - dependsOn("jar") + dependsOn("jar", "includeP5jsExamples") into(layout.buildDirectory.dir("mode")) // TODO Why is there a duplicate in the first place? duplicatesStrategy = DuplicatesStrategy.WARN diff --git a/p5js/js/electron/main.js b/p5js/js/electron/main.js index 7f316b3672..3df607c3df 100644 --- a/p5js/js/electron/main.js +++ b/p5js/js/electron/main.js @@ -7,7 +7,7 @@ const createWindow = () => { height: 400, show: false, autoHideMenuBar: true, - alwaysOnTop: true, + alwaysOnTop: false, webPreferences: { contextIsolation: false, nodeIntegration: true, diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index 9e4eb55247..aa1ab8bf36 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -3,10 +3,10 @@ package processing.p5js import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.Button -import androidx.compose.material.Divider -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Text +import androidx.compose.material3.Button +import androidx.compose.material3.Divider +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -27,7 +27,7 @@ import processing.app.syntax.JEditTextArea import processing.app.syntax.PdeTextArea import processing.app.syntax.PdeTextAreaDefaults import processing.app.ui.* -import processing.app.ui.theme.ProcessingTheme +import processing.app.ui.theme.PDETheme import java.awt.event.ActionEvent import java.awt.event.ActionListener import java.io.BufferedReader @@ -188,9 +188,11 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E override fun createFooter(): EditorFooter { val footer = super.createFooter() + return footer; + val composePanel = ComposePanel() composePanel.setContent { - ProcessingTheme { + PDETheme(darkTheme = false) { var packageToInstall by remember { mutableStateOf("") } var packagesSearched by remember { mutableStateOf(listOf()) } Row( @@ -310,7 +312,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E // TODO: more robust data exchange, double-check with @Stef // TODO: `statusError` does not do anything with column of a SketchException val ( msgType, msgText, msgFile, msgLine, msgCol ) = line.split("|") - statusError(SketchException(msgText, 0, msgLine.toInt()-1, msgCol.toInt())) + statusError(processing.utils.SketchException(msgText, 0, msgLine.toInt()-1, msgCol.toInt())) continue } From 5e822b210f67cffd45dd4fc22b67bd8f59bc32c5 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 10:40:16 +0100 Subject: [PATCH 24/31] Updated p5 version --- p5js/js/package.json | 2 +- p5js/src/main/kotlin/p5jsEditor.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/p5js/js/package.json b/p5js/js/package.json index 5e642aabe2..45b2abb109 100644 --- a/p5js/js/package.json +++ b/p5js/js/package.json @@ -30,6 +30,6 @@ "electron-builder": "24.6.3" }, "dependencies": { - "p5": "^1.11.10" + "p5": "^2.1.2" } } \ No newline at end of file diff --git a/p5js/src/main/kotlin/p5jsEditor.kt b/p5js/src/main/kotlin/p5jsEditor.kt index aa1ab8bf36..c310979910 100644 --- a/p5js/src/main/kotlin/p5jsEditor.kt +++ b/p5js/src/main/kotlin/p5jsEditor.kt @@ -160,7 +160,7 @@ class p5jsEditor(base: Base, path: String?, state: EditorState?, mode: Mode?): E // If sketch is read-only move all files to temporary folder // to allow them to run without saving first if (sketch.isReadOnly) { - val newSketchFolder = sketch.makeTempFolder() + val newSketchFolder = sketch.makeTempFolder().resolve(sketch.name) val mainSketchFile = File(path, "sketch-main.js").name sketch.folder.copyRecursively(newSketchFolder) sketch = Sketch(newSketchFolder.resolve(mainSketchFile).path, this) From 420310ec972cd35317e06142ae5882364faea054 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 10:51:12 +0100 Subject: [PATCH 25/31] fixed examples within More folders --- p5js/build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index f946601eb2..949dcc89e9 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.compose.internal.de.undercouch.gradle.tasks.download.Download +import kotlin.text.replace plugins { kotlin("jvm") version libs.versions.kotlin @@ -42,6 +43,7 @@ tasks.register("includeP5jsExamples"){ copy{ from(zipTree(examples)){ // remove top level directory include("*/src/content/examples/en/**/*") + exclude("**/description.mdx") eachFile { relativePath = RelativePath(true, *relativePath.segments.drop(5).toTypedArray()) } eachFile{ if(name != "code.js"){ return@eachFile } @@ -49,6 +51,13 @@ tasks.register("includeP5jsExamples"){ val parentName = this.file.parentFile.name name = "$parentName.js" } + eachFile { + // if the file is .js and not in a directory named of itself, move it to such a directory + if(!name.endsWith(".js")){ return@eachFile} + val parentName = this.file.parentFile.name + if(parentName == name.removeSuffix(".js")){ return@eachFile } + relativePath = RelativePath(true, *relativePath.segments.dropLast(1).toTypedArray(), name.removeSuffix(".js"), name) + } } into(layout.buildDirectory.dir("mode/examples/Basics")) } From a8fbb00150fcd79a93d78388995aee6c4a92f009 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 11:08:23 +0100 Subject: [PATCH 26/31] Refine p5js example import path handling Improves the processing of example file paths by removing leading digits and underscores from sketch folder names during extraction. --- p5js/build.gradle.kts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index 949dcc89e9..6ff6b29990 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.compose.internal.de.undercouch.gradle.tasks.download.Download +import org.jetbrains.kotlin.konan.properties.suffix import kotlin.text.replace plugins { @@ -44,7 +45,9 @@ tasks.register("includeP5jsExamples"){ from(zipTree(examples)){ // remove top level directory include("*/src/content/examples/en/**/*") exclude("**/description.mdx") - eachFile { relativePath = RelativePath(true, *relativePath.segments.drop(5).toTypedArray()) } + eachFile{ + relativePath = RelativePath(true, *relativePath.segments.drop(5).toTypedArray()) + } eachFile{ if(name != "code.js"){ return@eachFile } @@ -58,6 +61,16 @@ tasks.register("includeP5jsExamples"){ if(parentName == name.removeSuffix(".js")){ return@eachFile } relativePath = RelativePath(true, *relativePath.segments.dropLast(1).toTypedArray(), name.removeSuffix(".js"), name) } + // if a sketch folder starts with a digit, remove that digit and the following dash + eachFile { + val parent = this.file.parentFile + val parentName = parent.name + val regex = Regex("^\\d+_") + if(regex.containsMatchIn(parentName)){ + val newParentName = parentName.replace(regex, "") + relativePath = RelativePath(true, *relativePath.segments.dropLast(2).toTypedArray(), newParentName, newParentName.suffix("js")) + } + } } into(layout.buildDirectory.dir("mode/examples/Basics")) } From 35130151afb13e141967d20c088638945754bac8 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 11:20:54 +0100 Subject: [PATCH 27/31] Release workflow --- .github/workflows/release-p5-mode.yml | 33 +++++++++++++++++++++++++++ p5js/build.gradle.kts | 9 ++++++++ p5js/library/mode.properties | 6 ++--- 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/release-p5-mode.yml diff --git a/.github/workflows/release-p5-mode.yml b/.github/workflows/release-p5-mode.yml new file mode 100644 index 0000000000..197e3bbc5b --- /dev/null +++ b/.github/workflows/release-p5-mode.yml @@ -0,0 +1,33 @@ +name: Release p5.js Mode +on: + release: + types: [published] + +jobs: + release: + name: Release p5.js Mode + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Install Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17.0.8' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Build with Gradle + run: ./gradlew createPdex createZip + + - name: Upload to Release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: p5js/build/p5js.* + tag: ${{ github.ref }} + file_glob: true + overwrite: true + diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index 6ff6b29990..f6d473f624 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -100,6 +100,15 @@ tasks.register("createMode") { } } + +tasks.register("createZip") { + dependsOn("createMode") + from(tasks.named("createMode")) + into(project.name) + + destinationDirectory.set(layout.buildDirectory) +} + tasks.register("createPdex") { dependsOn("createMode") from(tasks.named("createMode")) diff --git a/p5js/library/mode.properties b/p5js/library/mode.properties index 8f60d00941..b9d41c0bdd 100644 --- a/p5js/library/mode.properties +++ b/p5js/library/mode.properties @@ -1,7 +1,7 @@ -name=p5.js Mode POC +name=p5.js Mode category=Unknown -authors=[Stef Tervelde](http://steftervel.de) -url=https://github.com/stefterv/p5js-mode +authors=[Processing Foundation](http://processingfoundation.org) +url=https://github.com/processing/processing-p5.js-mode sentence=P5.js Mode for Processing paragraph= version=1 From 5628f57c1679fe1d438826d053f4bf808eaf1fdd Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 11:32:46 +0100 Subject: [PATCH 28/31] Release fixes --- .github/workflows/release-p5-mode.yml | 9 +++++++++ p5js/build.gradle.kts | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release-p5-mode.yml b/.github/workflows/release-p5-mode.yml index 197e3bbc5b..241e4bb21b 100644 --- a/.github/workflows/release-p5-mode.yml +++ b/.github/workflows/release-p5-mode.yml @@ -30,4 +30,13 @@ jobs: tag: ${{ github.ref }} file_glob: true overwrite: true + + - name: Upload Properties to Release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: p5js/build/mode/mode.properties + asset_name: p5js.txt + tag: ${{ github.ref }} + overwrite: true diff --git a/p5js/build.gradle.kts b/p5js/build.gradle.kts index f6d473f624..003ce3e52c 100644 --- a/p5js/build.gradle.kts +++ b/p5js/build.gradle.kts @@ -78,7 +78,8 @@ tasks.register("includeP5jsExamples"){ } tasks.register("createMode") { - dependsOn("jar", "includeP5jsExamples") + dependsOn("jar") + finalizedBy("includeP5jsExamples") into(layout.buildDirectory.dir("mode")) // TODO Why is there a duplicate in the first place? duplicatesStrategy = DuplicatesStrategy.WARN @@ -102,7 +103,7 @@ tasks.register("createMode") { tasks.register("createZip") { - dependsOn("createMode") + dependsOn("createMode", "includeP5jsExamples") from(tasks.named("createMode")) into(project.name) @@ -110,7 +111,7 @@ tasks.register("createZip") { } tasks.register("createPdex") { - dependsOn("createMode") + dependsOn("createMode", "includeP5jsExamples") from(tasks.named("createMode")) into(project.name) From cbd43c7daaf89d46626dbd0de065435e92cd5670 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 11:53:04 +0100 Subject: [PATCH 29/31] Version number input --- .github/workflows/release-p5-mode.yml | 21 +++++++++++++++++---- p5js/library/mode.properties | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release-p5-mode.yml b/.github/workflows/release-p5-mode.yml index 241e4bb21b..489a118c7c 100644 --- a/.github/workflows/release-p5-mode.yml +++ b/.github/workflows/release-p5-mode.yml @@ -1,7 +1,13 @@ name: Release p5.js Mode on: - release: - types: [published] + workflow_dispatch: + inputs: + version_number: + description: "What is the revision number?" + required: true + version_pretty: + description: "What is the pretty version name?" + required: true jobs: release: @@ -22,12 +28,19 @@ jobs: - name: Build with Gradle run: ./gradlew createPdex createZip + - name: Set Version Number + run: | + VERSION_NUMBER=${{ github.event.inputs.version_number }} + VERSION_PRETTY=${{ github.event.inputs.version_pretty }} + sed -i "s/^version=.*$/version=$VERSION_NUMBER/" p5js/mode/mode.properties + sed -i "s/^prettyVersion=.*$/prettyVersion=$VERSION_PRETTY/" p5js/mode/mode.properties + - name: Upload to Release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: p5js/build/p5js.* - tag: ${{ github.ref }} + tag: p5js-v${{ github.event.inputs.version_number }} file_glob: true overwrite: true @@ -37,6 +50,6 @@ jobs: repo_token: ${{ secrets.GITHUB_TOKEN }} file: p5js/build/mode/mode.properties asset_name: p5js.txt - tag: ${{ github.ref }} + tag: p5js-v${{ github.event.inputs.version_number }} overwrite: true diff --git a/p5js/library/mode.properties b/p5js/library/mode.properties index b9d41c0bdd..4943897596 100644 --- a/p5js/library/mode.properties +++ b/p5js/library/mode.properties @@ -1,6 +1,6 @@ name=p5.js Mode category=Unknown -authors=[Processing Foundation](http://processingfoundation.org) +authors=[The Processing Foundation](https://processingfoundation.org/) url=https://github.com/processing/processing-p5.js-mode sentence=P5.js Mode for Processing paragraph= From c9f4a4a75512c473121b8a37e6301fdd85334609 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 11:58:22 +0100 Subject: [PATCH 30/31] Update release-p5-mode.yml --- .github/workflows/release-p5-mode.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-p5-mode.yml b/.github/workflows/release-p5-mode.yml index 489a118c7c..468a35b44c 100644 --- a/.github/workflows/release-p5-mode.yml +++ b/.github/workflows/release-p5-mode.yml @@ -8,6 +8,7 @@ on: version_pretty: description: "What is the pretty version name?" required: true + pull_request: jobs: release: From 88f6ebd91683dde5df9c31169b0220e192829f26 Mon Sep 17 00:00:00 2001 From: Stef Tervelde Date: Thu, 18 Dec 2025 12:04:40 +0100 Subject: [PATCH 31/31] Remove pull_request trigger from release workflow --- .github/workflows/release-p5-mode.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release-p5-mode.yml b/.github/workflows/release-p5-mode.yml index 468a35b44c..489a118c7c 100644 --- a/.github/workflows/release-p5-mode.yml +++ b/.github/workflows/release-p5-mode.yml @@ -8,7 +8,6 @@ on: version_pretty: description: "What is the pretty version name?" required: true - pull_request: jobs: release: