From 9990bc3c03d3fd58e91da6625afa90935c864439 Mon Sep 17 00:00:00 2001 From: damp11113 Date: Mon, 29 Jul 2024 16:46:16 +0700 Subject: [PATCH] update 1.2.1 Add new 3 blocks library NativeIO CCKey and CCDisk --- blocks/CCDisk/block_design.json | 232 +++++++++++++ blocks/CCDisk/generator.js | 75 ++++ blocks/CCDisk/index.json | 22 ++ blocks/CCDisk/toolbox.xml | 15 + blocks/CCKeys/block_design.json | 136 ++++++++ blocks/CCKeys/generator.js | 18 + blocks/CCKeys/index.json | 22 ++ blocks/CCKeys/toolbox.xml | 10 + blocks/CCRedstone/index.json | 4 +- blocks/CCSystem/block_design.json | 2 +- blocks/CCSystem/generator.js | 8 +- blocks/NativeIO/block_design.json | 134 ++++++++ blocks/NativeIO/generator.js | 52 +++ blocks/NativeIO/index.json | 22 ++ blocks/NativeIO/toolbox.xml | 36 ++ ccIDE Defines.xlsx | Bin 52518 -> 52548 bytes ccIDE.wheel | 1 + index.js | 36 +- package-lock.json | 554 ++++++++++++++++++++++++++++++ package.json | 2 + src/blocksmanager.js | 15 +- src/ccRemote.js | 2 +- src/codegen.js | 8 +- src/index.js | 27 +- src/module_generator.js | 2 +- 25 files changed, 1405 insertions(+), 30 deletions(-) create mode 100644 blocks/CCDisk/block_design.json create mode 100644 blocks/CCDisk/generator.js create mode 100644 blocks/CCDisk/index.json create mode 100644 blocks/CCDisk/toolbox.xml create mode 100644 blocks/CCKeys/block_design.json create mode 100644 blocks/CCKeys/generator.js create mode 100644 blocks/CCKeys/index.json create mode 100644 blocks/CCKeys/toolbox.xml create mode 100644 blocks/NativeIO/block_design.json create mode 100644 blocks/NativeIO/generator.js create mode 100644 blocks/NativeIO/index.json create mode 100644 blocks/NativeIO/toolbox.xml create mode 100644 ccIDE.wheel diff --git a/blocks/CCDisk/block_design.json b/blocks/CCDisk/block_design.json new file mode 100644 index 0000000..7fa0f8b --- /dev/null +++ b/blocks/CCDisk/block_design.json @@ -0,0 +1,232 @@ +{ + "disk_is_present": { + "message0": "Is disk %1 present?", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 160, + "tooltip": "Check if any item is present in the disk drive" + }, + "disk_get_label": { + "message0": "get label disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "String", + "colour": 160, + "tooltip": "Get the label of the disk in the drive" + }, + "disk_set_label": { + "message0": "set label disk %1 to %2", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + }, + { + "type": "input_value", + "name": "LABEL", + "check": "String" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 160, + "tooltip": "Set the label of the disk in the drive" + }, + "disk_has_data": { + "message0": "Is disk %1 have data?", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 160, + "tooltip": "Check if the disk has data" + }, + "disk_get_mount_path": { + "message0": "get mount path of disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "String", + "colour": 160, + "tooltip": "Get the mount path of the disk" + }, + "disk_has_audio": { + "message0": "Is disk %1 have audio?", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 160, + "tooltip": "Check if the disk has audio" + }, + "disk_get_audio_title": { + "message0": "get audio title of disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": ["String", "Boolean"], + "colour": 160, + "tooltip": "Get the title of the audio track" + }, + "disk_play_audio": { + "message0": "play audio disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 160, + "tooltip": "Play the audio track on the disk" + }, + "disk_stop_audio": { + "message0": "stop audio on %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 160, + "tooltip": "Stop the audio track on the disk" + }, + "disk_eject": { + "message0": "eject disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 160, + "tooltip": "Eject the disk from the drive", + "helpUrl": "" + }, + "disk_get_id": { + "message0": "get ID of disk %1", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "String", + "colour": 160, + "tooltip": "Get the unique ID of the disk" + } +} diff --git a/blocks/CCDisk/generator.js b/blocks/CCDisk/generator.js new file mode 100644 index 0000000..7536bc8 --- /dev/null +++ b/blocks/CCDisk/generator.js @@ -0,0 +1,75 @@ +// this file not for generator only + +const { luaGenerator } = require('blockly/lua'); + +// Check if luaGenerator.forBlock is defined and initialize if necessary +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +luaGenerator.forBlock['disk_is_present'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.isPresent("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_get_label'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.getLabel("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_set_label'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + var label = generator.valueToCode(block, 'LABEL', generator.ORDER_ATOMIC); + + return `disk.setLabel("${side}", ${label})\n`; +}; + +luaGenerator.forBlock['disk_has_data'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.hasData("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_get_mount_path'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.getMountPath("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_has_audio'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.hasAudio("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_get_audio_title'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.getAudioTitle("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['disk_play_audio'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return `disk.playAudio("${side}")\n`; +}; + +luaGenerator.forBlock['disk_stop_audio'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return `disk.stopAudio("${side}")\n`; +}; + +luaGenerator.forBlock['disk_eject'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return `disk.eject("${side}")\n`; +}; + +luaGenerator.forBlock['disk_get_id'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`disk.getID("${side}")`, luaGenerator.ORDER_NONE]; +}; \ No newline at end of file diff --git a/blocks/CCDisk/index.json b/blocks/CCDisk/index.json new file mode 100644 index 0000000..71aee3a --- /dev/null +++ b/blocks/CCDisk/index.json @@ -0,0 +1,22 @@ +{ + "name": "CC: Disk", + "author": "DPSoftware Foundation", + "description": "Blocks for performing operations on disk drives in ccIDE", + "version": "1.0.0", + "category": "", + "keyword": "disk, operations, ccIDE", + "license": "GPL-3.0-or-later", + "peripherals": true, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": true, + "adv": true, + "command": true, + "pocket": false, + "advpocket": false, + "turtle": true, + "advturtle": true + } +} diff --git a/blocks/CCDisk/toolbox.xml b/blocks/CCDisk/toolbox.xml new file mode 100644 index 0000000..0e349f5 --- /dev/null +++ b/blocks/CCDisk/toolbox.xml @@ -0,0 +1,15 @@ + diff --git a/blocks/CCKeys/block_design.json b/blocks/CCKeys/block_design.json new file mode 100644 index 0000000..b61560f --- /dev/null +++ b/blocks/CCKeys/block_design.json @@ -0,0 +1,136 @@ +{ + "keys_get_key_number": { + "message0": "Keys %1", + "args0": [ + { + "type": "field_dropdown", + "name": "KEY", + "options": [ + ["A", "30"], + ["Apostrophe", "40"], + ["At", "145"], + ["Ax", "150"], + ["B", "48"], + ["Backspace", "14"], + ["Backslash", "43"], + ["CapsLock", "58"], + ["C", "46"], + ["Cimcumflex", "144"], + ["Colon", "146"], + ["Convert", "121"], + ["Delete", "211"], + ["D", "32"], + ["Down", "208"], + ["E", "18"], + ["Eight", "9"], + ["End", "207"], + ["Equals", "13"], + ["F", "33"], + ["F1", "59"], + ["F2", "60"], + ["F3", "61"], + ["F4", "62"], + ["F5", "63"], + ["F6", "64"], + ["F7", "65"], + ["F8", "66"], + ["F9", "67"], + ["F10", "68"], + ["F11", "87"], + ["F12", "88"], + ["F13", "100"], + ["F14", "101"], + ["F15", "102"], + ["Five", "6"], + ["Four", "5"], + ["G", "34"], + ["H", "35"], + ["Home", "199"], + ["I", "23"], + ["Insert", "210"], + ["J", "36"], + ["Kana", "112"], + ["Kanji", "148"], + ["K", "37"], + ["L", "38"], + ["Left", "203"], + ["LeftAlt", "56"], + ["LeftCtrl", "29"], + ["LeftShift", "42"], + ["M", "50"], + ["Minus", "12"], + ["NumPad0", "82"], + ["NumPad1", "79"], + ["NumPad2", "80"], + ["NumPad3", "81"], + ["NumPad4", "75"], + ["NumPad5", "76"], + ["NumPad6", "77"], + ["NumPad7", "71"], + ["NumPad8", "72"], + ["NumPad9", "73"], + ["NumPadAdd", "78"], + ["NumPadComma", "179"], + ["NumPadDecimal", "83"], + ["NumPadDivide", "181"], + ["NumPadEnter", "156"], + ["NumPadEquals", "141"], + ["NumPadSubtract", "74"], + ["NumLock", "69"], + ["O", "24"], + ["P", "25"], + ["PageDown", "209"], + ["PageUp", "201"], + ["Period", "52"], + ["Q", "16"], + ["R", "19"], + ["Right", "205"], + ["RightAlt", "184"], + ["RightCtrl", "157"], + ["RightShift", "54"], + ["Return", "28"], + ["S", "31"], + ["ScrollLock", "70"], + ["SemiColon", "39"], + ["Seven", "8"], + ["Slash", "53"], + ["Space", "57"], + ["Stop", "149"], + ["Tab", "15"], + ["T", "20"], + ["Three", "4"], + ["Two", "3"], + ["U", "22"], + ["Up", "200"], + ["V", "47"], + ["W", "17"], + ["X", "45"], + ["Y", "21"], + ["Yen", "125"], + ["Z", "44"], + ["Zero", "11"], + ["N", "49"], + ["Noconvert", "123"], + ["ScollLock", "70"] + ] + } + ], + "inputsInline": true, + "output": "Number", + "colour": 190, + "tooltip": "Get key number" + }, + "keys_get_key_name": { + "message0": "Get key %1 name", + "args0": [ + { + "type": "input_value", + "name": "KEY", + "check": "Number" + } + ], + "output": "String", + "colour": 190, + "tooltip": "Translates a numerical key code to a human-readable name." + } +} diff --git a/blocks/CCKeys/generator.js b/blocks/CCKeys/generator.js new file mode 100644 index 0000000..63809a0 --- /dev/null +++ b/blocks/CCKeys/generator.js @@ -0,0 +1,18 @@ +// this file not for generator only + +const { luaGenerator } = require('blockly/lua'); + +// Check if luaGenerator.forBlock is defined and initialize if necessary +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +luaGenerator.forBlock['keys_get_key_number'] = function(block, generator) { + return [block.getFieldValue('KEY'), generator.ORDER_NONE]; +}; + +luaGenerator.forBlock['text_print'] = function(block, generator) { + var key = generator.valueToCode(block, 'KEY', generator.ORDER_NONE); + return [`keys.getName(${key})`, luaGenerator.ORDER_NONE]; +}; + diff --git a/blocks/CCKeys/index.json b/blocks/CCKeys/index.json new file mode 100644 index 0000000..ed4ca6a --- /dev/null +++ b/blocks/CCKeys/index.json @@ -0,0 +1,22 @@ +{ + "name": "CC: Keys", + "author": "DPSoftware Foundation", + "description": "Constants for all keyboard 'key codes', as queued by the key event.", + "version": "1.0.0", + "category": "Input", + "keyword": "Keyboard", + "license": "GPL-3.0-or-later", + "peripherals": false, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": true, + "adv": true, + "command": true, + "pocket": true, + "advpocket": true, + "turtle": true, + "advturtle": true + } +} diff --git a/blocks/CCKeys/toolbox.xml b/blocks/CCKeys/toolbox.xml new file mode 100644 index 0000000..b0b3ad2 --- /dev/null +++ b/blocks/CCKeys/toolbox.xml @@ -0,0 +1,10 @@ + diff --git a/blocks/CCRedstone/index.json b/blocks/CCRedstone/index.json index a6b0a2c..ae02eba 100644 --- a/blocks/CCRedstone/index.json +++ b/blocks/CCRedstone/index.json @@ -16,7 +16,7 @@ "command": true, "pocket": false, "advpocket": false, - "turtle": false, - "advturtle": false + "turtle": true, + "advturtle": true } } diff --git a/blocks/CCSystem/block_design.json b/blocks/CCSystem/block_design.json index 2e49a8b..7157593 100644 --- a/blocks/CCSystem/block_design.json +++ b/blocks/CCSystem/block_design.json @@ -172,7 +172,7 @@ }, "sysos_clock": { "message0": "Get Uptime", - "output": "String", + "output": "Number", "colour": 0, "tooltip": "Returns the number of seconds that the computer has been running." }, diff --git a/blocks/CCSystem/generator.js b/blocks/CCSystem/generator.js index e1e3622..e466e95 100644 --- a/blocks/CCSystem/generator.js +++ b/blocks/CCSystem/generator.js @@ -10,17 +10,17 @@ if (!luaGenerator.forBlock) { luaGenerator.forBlock['sysos_pullevent'] = function(block, generator) { var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC); - if (event == "") { - return [`os.pullevent()`, luaGenerator.ORDER_NONE]; + if (event == "'All'") { + return [`os.pullEvent()`, luaGenerator.ORDER_NONE]; } else { - return [`os.pullevent(${event})`, luaGenerator.ORDER_NONE]; + return [`os.pullEvent(${event})`, luaGenerator.ORDER_NONE]; } }; luaGenerator.forBlock['sysos_pullrawevent'] = function(block, generator) { var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC); - if (event == "") { + if (event == "'All'") { return [`os.pullEventRaw()`, luaGenerator.ORDER_NONE]; } else { return [`os.pullEventRaw(${event})`, luaGenerator.ORDER_NONE]; diff --git a/blocks/NativeIO/block_design.json b/blocks/NativeIO/block_design.json new file mode 100644 index 0000000..9558cc4 --- /dev/null +++ b/blocks/NativeIO/block_design.json @@ -0,0 +1,134 @@ +{ + "io_open": { + "message0": "Open file %1 with mode %2", + "args0": [ + { + "type": "input_value", + "name": "FILENAME", + "check": "String" + }, + { + "type": "field_dropdown", + "name": "MODE", + "options": [ + ["read", "r"], + ["write", "w"], + ["append", "a"], + ["read/write", "r+"], + ["write/read", "w+"] + ] + } + ], + "output": "File", + "colour": 260, + "tooltip": "Open a file with the given mode" + }, + "io_close": { + "message0": "Close file %1", + "args0": [ + { + "type": "input_value", + "name": "FILE", + "check": "File" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 260, + "tooltip": "Close the specified file" + }, + "io_flush": { + "message0": "Flush file %1", + "args0": [ + { + "type": "input_value", + "name": "FILE", + "check": "File" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 260, + "tooltip": "Flush any buffered output, forcing it to be written to the file" + }, + "io_read": { + "message0": "Read from file %1 with format %2", + "args0": [ + { + "type": "input_value", + "name": "FILE", + "check": "File" + }, + { + "type": "field_dropdown", + "name": "FORMAT", + "options": [ + ["line", "l"], + ["line ln", "L"], + ["All", "a"] + ] + } + ], + "output": "String", + "colour": 260, + "tooltip": "Read data from the file" + }, + "io_write": { + "message0": "Write %1 to file %2", + "args0": [ + { + "type": "input_value", + "name": "DATA" + }, + { + "type": "input_value", + "name": "FILE", + "check": "File" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 260, + "tooltip": "Write data to the file" + }, + "io_lines": { + "message0": "Read line %1", + "args0": [ + { + "type": "input_value", + "name": "FILE", + "check": "File" + } + ], + "output": "Array", + "colour": 260, + "tooltip": "Returns an iterator that, each time it is called, returns a new line from the file." + }, + "io_seek": { + "message0": "Seek in file %1 to position %2 with offset %3", + "args0": [ + { + "type": "input_value", + "name": "FILE", + "check": "File" + }, + { + "type": "field_dropdown", + "name": "POSITION", + "options": [ + ["Set", "set"], + ["Current", "cur"], + ["End", "end"] + ] + }, + { + "type": "input_value", + "name": "OFFSET", + "check": "Number" + } + ], + "output": "Number", + "colour": 260, + "tooltip": "Seek to a specific position in the file" + } +} diff --git a/blocks/NativeIO/generator.js b/blocks/NativeIO/generator.js new file mode 100644 index 0000000..7ad44a3 --- /dev/null +++ b/blocks/NativeIO/generator.js @@ -0,0 +1,52 @@ +const { luaGenerator } = require('blockly/lua'); + +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +luaGenerator.forBlock['io_open'] = function(block, generator) { + const filename = generator.valueToCode(block, 'FILENAME', generator.ORDER_ATOMIC); + const mode = block.getFieldValue('MODE'); + const code = `io.open(${filename}, "${mode}")`; + return [code, generator.ORDER_NONE]; +}; + +luaGenerator.forBlock['io_close'] = function(block, generator) { + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const code = `${file}:close()\n`; + return code; +}; + +luaGenerator.forBlock['io_read'] = function(block, generator) { + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const format = block.getFieldValue('FORMAT'); + const code = `${file}:read("${format}")`; + return [code, generator.ORDER_NONE]; +}; + +luaGenerator.forBlock['io_write'] = function(block, generator) { + const data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE) || '""'; + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const code = `${file}:write(${data})\n`; + return code; +}; + +luaGenerator.forBlock['io_seek'] = function(block, generator) { + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const position = generator.valueToCode(block, 'POSITION', generator.ORDER_ATOMIC); + const offset = generator.valueToCode(block, 'OFFSET', generator.ORDER_ATOMIC); + const code = `${file}:seek("${position}", ${offset})`; + return [code, generator.ORDER_NONE]; +}; + +luaGenerator.forBlock['io_lines'] = function(block, generator) { + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const code = `${file}:lines()`; + return [code, generator.ORDER_NONE]; +}; + +luaGenerator.forBlock['io_flush'] = function(block, generator) { + const file = generator.valueToCode(block, 'FILE', generator.ORDER_ATOMIC); + const code = `${file}:flush()\n`; + return code; +}; \ No newline at end of file diff --git a/blocks/NativeIO/index.json b/blocks/NativeIO/index.json new file mode 100644 index 0000000..6496b73 --- /dev/null +++ b/blocks/NativeIO/index.json @@ -0,0 +1,22 @@ +{ + "name": "IO", + "author": "DPSoftware Foundation", + "description": "Lua Native: Input/Output file", + "version": "1.0.0", + "category": "Native", + "keyword": "Native, Lua, IO", + "license": "GPL-3.0-or-later", + "peripherals": false, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": true, + "adv": true, + "command": true, + "pocket": true, + "advpocket": true, + "turtle": true, + "advturtle": true + } +} diff --git a/blocks/NativeIO/toolbox.xml b/blocks/NativeIO/toolbox.xml new file mode 100644 index 0000000..dad7d47 --- /dev/null +++ b/blocks/NativeIO/toolbox.xml @@ -0,0 +1,36 @@ + diff --git a/ccIDE Defines.xlsx b/ccIDE Defines.xlsx index 60f05f201d36bea8cfd4a99616f92fee695a1f1c..3e3602b036bf7800d81a7fafb4edddb62afb8c03 100644 GIT binary patch delta 15619 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 delta 15573 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 DxL1&& diff --git a/ccIDE.wheel b/ccIDE.wheel new file mode 100644 index 0000000..5f19fdd --- /dev/null +++ b/ccIDE.wheel @@ -0,0 +1 @@ +{"title":"ccIDE","description":"","entries":[{"text":"fs","id":"bpjk25nz5u"},{"text":"gps","id":"4ycx32t6zv"},{"text":"http","id":"sy5e4jg9te"},{"text":"multishell","id":"zmpdq862sr"},{"text":"paintutils","id":"2kcgbw3r5k"},{"text":"peripheral","id":"jzj9g9s4q9"},{"text":"shell","id":"aekamm3pn6"},{"text":"term","id":"phtvswrv6v"},{"text":"vector","id":"6c6uz56m77"},{"text":"window","id":"5dk6dkpz9b"},{"text":"cc.audio.dfpwm","id":"dkbm2ftkcr"},{"text":"cc.completion","id":"95vdrwx3rf"},{"text":"cc.expect","id":"g6agen6yej"},{"text":"cc.image.nft","id":"rwb9d7eru7"},{"text":"cc.pretty","id":"twkxbcsgh8"},{"text":"cc.require","id":"b3n7k2xnny"},{"text":"cc.shell.completion","id":"9x98gv9hba"},{"text":"cc.strings","id":"jcru68rr39"},{"text":"computer (turtle)","id":"cdrvm4equh"},{"text":"monitor (peripheral)","id":"hmtaqyh5rf"},{"text":"printer (peripheral)","id":"kcwfe8suy5"},{"text":"speaker (peripheral)","id":"92p9tv9wbz"},{"text":"energy_storage (peripheral)","id":"3td8u4cua3"},{"text":"fluid_storage (peripheral)","id":"gt2ndb9pj4"},{"text":"inventory (peripheral)","id":"zx9c8aqakq"}],"colorSettings":[{"color":"#3369E8","enabled":true},{"color":"#D50F25","enabled":true},{"color":"#EEB211","enabled":true},{"color":"#009925","enabled":true},{"color":"#000000","enabled":false},{"color":"#000000","enabled":false}],"pageBackgroundColor":"#FFFFFF","type":"color","pictureType":"none","coverImageType":"gallery","coverImageName":"/images/chocolate-chip-cookie.jpg","galleryPicture":"/images/none.png","customPictureName":"","customPictureDataUri":"","customCoverImageDataUri":"","centerText":"","allowDuplicates":true,"duringSpinSound":"ticking-sound","duringSpinSoundVolume":50,"afterSpinSound":"no-sound","afterSpinSoundVolume":50,"maxNames":1000,"spinTime":10,"launchConfetti":true,"animateWinner":false,"autoRemoveWinner":true,"displayWinnerDialog":true,"displayRemoveButton":true,"displayHideButton":true,"winnerMessage":"เรามีผู้ชนะ!","playClickWhenWinnerRemoved":false,"hubSize":"S","drawOutlines":false,"slowSpin":false,"showTitle":true,"isAdvanced":false} \ No newline at end of file diff --git a/index.js b/index.js index a141542..aa543de 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,14 @@ +console.log("Initializing...") const { app, BrowserWindow, ipcMain, Menu, dialog } = require('electron') const fs = require('fs'); const prompt = require('electron-prompt'); const path = require('path'); +const pino = require('pino') +const pretty = require('pino-pretty') const ipc = ipcMain +const logger = pino(pretty()) + process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'; let currentprojectpath = null; @@ -14,7 +19,11 @@ let appreloading = false; let currentworkspacechange = false; let isopennewproject = false; + +let appstarted = false; + app.whenReady().then(() => { + logger.info("Initializing splash window...") reloadall(false); var splash = new BrowserWindow({ width: 600, @@ -30,7 +39,8 @@ app.whenReady().then(() => { }); splash.loadFile('src/splash.html'); - splash.webContents.send("change-status", "Initializing...") + + logger.info("Initializing main windows...") const win = new BrowserWindow({ width: 1280, @@ -45,7 +55,7 @@ app.whenReady().then(() => { show: false, center: true, }) - + try { win.loadFile('src/index.html'); } catch { @@ -58,21 +68,32 @@ app.whenReady().then(() => { win.setTitle(`ccIDE`) ipc.once('ready', () => { - console.log("ready") + logger.info("Ready!") if (splash) { splash.close(); } win.show(); - win.maximize(); + //win.maximize(); + appstarted = true; }); ipc.on('erroronstart', (event, errormessage) => { + logger.error(errormessage) dialog.showErrorBox("Error on startup", errormessage); //win.openDevTools(); }); - ipc.on('update-startup-status', (event, status) => { - splash.webContents.send("change-status", status) + ipc.on('error', (event, errormessage) => { + logger.error(errormessage) + dialog.showErrorBox("Error", errormessage); + //win.openDevTools(); + }); + + ipc.on('update-log-status', (event, status) => { + logger.info(status) + if (!appstarted) { + splash.webContents.send("change-status", status) + } }); //app.on('activate', () => { @@ -95,6 +116,7 @@ app.whenReady().then(() => { } } + logger.info("Settings up menu bar...") // Define a custom menu template const menuTemplate = [ { @@ -274,6 +296,8 @@ app.whenReady().then(() => { // Set the custom menu const menu = Menu.buildFromTemplate(menuTemplate); Menu.setApplicationMenu(menu); + + logger.info("Settings up event...") ipc.on('prompt', (event, promptText, defaultValue) => { try { diff --git a/package-lock.json b/package-lock.json index 33aa74c..7c47c61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "blockly": "^11.1.1", "bootstrap": "^5.3.3", "electron-prompt": "^1.7.0", + "pino": "^9.3.2", + "pino-pretty": "^11.2.2", "xmldom": "^0.6.0" }, "devDependencies": { @@ -140,6 +142,17 @@ "@types/node": "*" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -156,6 +169,33 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/blockly": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.1.1.tgz", @@ -191,6 +231,29 @@ "@popperjs/core": "^2.11.8" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -235,6 +298,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -269,6 +337,14 @@ "node": ">=18" } }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -459,6 +535,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -478,6 +570,24 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -688,6 +798,11 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -751,11 +866,38 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, "node_modules/jsdom": { "version": "23.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", @@ -869,6 +1011,14 @@ "node": ">=4" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -899,6 +1049,14 @@ "node": ">= 0.4" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -931,6 +1089,78 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -966,6 +1196,11 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -977,6 +1212,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -1020,6 +1278,33 @@ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1036,6 +1321,11 @@ "node": ">=v12.22.7" } }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1065,12 +1355,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "optional": true }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -1087,6 +1412,14 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -1356,6 +1689,14 @@ "@types/node": "*" } }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -1369,6 +1710,16 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "blockly": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.1.1.tgz", @@ -1389,6 +1740,15 @@ "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "requires": {} }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -1421,6 +1781,11 @@ "mimic-response": "^1.0.0" } }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1446,6 +1811,11 @@ "whatwg-url": "^14.0.0" } }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, "debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -1572,6 +1942,16 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "optional": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -1583,6 +1963,21 @@ "yauzl": "^2.10.0" } }, + "fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" + }, + "fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -1732,6 +2127,11 @@ "function-bind": "^1.1.2" } }, + "help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" + }, "html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -1780,11 +2180,21 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==" + }, "jsdom": { "version": "23.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", @@ -1872,6 +2282,11 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1893,6 +2308,11 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "optional": true }, + "on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1919,6 +2339,69 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + } + }, + "pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "requires": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + } + }, + "pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -1948,11 +2431,33 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, + "readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -1990,6 +2495,16 @@ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2003,6 +2518,11 @@ "xmlchars": "^2.2.0" } }, + "secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2023,12 +2543,38 @@ "type-fest": "^0.13.1" } }, + "sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + }, "sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "optional": true }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, "sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -2042,6 +2588,14 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "requires": { + "real-require": "^0.2.0" + } + }, "tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", diff --git a/package.json b/package.json index 48253ba..5433c55 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "blockly": "^11.1.1", "bootstrap": "^5.3.3", "electron-prompt": "^1.7.0", + "pino": "^9.3.2", + "pino-pretty": "^11.2.2", "xmldom": "^0.6.0" } } diff --git a/src/blocksmanager.js b/src/blocksmanager.js index ed978b2..a3254d9 100644 --- a/src/blocksmanager.js +++ b/src/blocksmanager.js @@ -42,6 +42,8 @@ function mergeXml(xml1, xml2) { } function loadperipheral(workspace, currenttoolbar, peripherals) { + console.log(`Importing ${peripherals} blocks`) + const filePath = path.join(peripheralsfolder, peripherals); const jsonfilePath = path.join(filePath, "block_design.json"); const xmlfilePath = path.join(filePath, "toolbox.xml"); @@ -79,11 +81,9 @@ function loadperipheral(workspace, currenttoolbar, peripherals) { document.getElementById('statusMessage').textContent = `Loaded ${peripherals}`; - try { - require(generatorfilePath); // This will execute generator.js if it's a Node.js module - } catch (error) { - console.error('Error loading generator.js:', error); - } + require(generatorfilePath); // This will execute generator.js if it's a Node.js module + + console.log(`Loaded ${peripherals} blocks`) return newxml; } @@ -114,7 +114,7 @@ function addimageiconinfo(div, src, tiptool) { img.setAttribute('data-bs-placement', "bottom"); img.setAttribute('data-bs-title', tiptool); div.appendChild(img); - console.log(`added image ${img}`); + console.log(`added image ${src}`); } function scanindex() { @@ -175,7 +175,6 @@ function scanindex() { description.innerHTML = jsonData.description; libraryDetails.appendChild(description); - console.log(jsonData) if (jsonData.design_for_computer.basic) { addimageiconinfo(libraryDetails, defineicon.computer.basic, "Basic Computer Supported"); } @@ -211,7 +210,7 @@ function scanindex() { libraryItem.appendChild(libraryDetails); document.getElementById('libcontainer').appendChild(libraryItem); - console.log(`registered ${blockfoldername} blocks and added to packages managers`) + console.log(`Registered ${blockfoldername} blocks and added to packages managers`) } } diff --git a/src/ccRemote.js b/src/ccRemote.js index 9fd687e..edbe7a6 100644 --- a/src/ccRemote.js +++ b/src/ccRemote.js @@ -7,7 +7,7 @@ class CCRemote { host: ip }); - console.log("Server is started"); + console.log("Remote server is started"); this.socket.on('connection', (ws) => { document.getElementById("navbar-button-computer-disconnect").disabled = false; diff --git a/src/codegen.js b/src/codegen.js index d7c05a9..3d097d3 100644 --- a/src/codegen.js +++ b/src/codegen.js @@ -5,6 +5,7 @@ function delay(time) { const { luaGenerator } = require('blockly/lua'); // Use require syntax for Blockly module const { CCRemote } = require("./ccRemote") +console.log("Starting remote server...") const ccInstance = new CCRemote('127.0.0.1', 5133); const progress = document.getElementById("progress"); @@ -46,19 +47,20 @@ function gencodeonly() { } async function gencode() { + console.log("Starting generate code") document.getElementById('upload-popup').style.display = 'block'; upcurrentActive = 1; uploadError = false; uploadUpdateProgress(); // compile/convert code + console.log("Generating code...") upcurrentActive++; uploadUpdateProgress(); document.getElementById('upload-status').textContent = "Generating code"; let code = null; try { code = luaGenerator.workspaceToCode(workspace); - console.log(code); } catch (e) { uploadError = true; uploadUpdateProgress(); @@ -70,16 +72,19 @@ async function gencode() { uploadUpdateProgress(); if (ccInstance.isClientConnect()) { // upload to computercraft with remote + console.log("Uploading code to machine...") document.getElementById('upload-status').textContent = "Uploading code to machine"; ccInstance.sendCode(code); await delay(500) // execute with remote + console.log("Executing code in machine...") document.getElementById('upload-status').textContent = "Executing code"; upcurrentActive++; uploadUpdateProgress(); ccInstance.runCode(); } else { + console.log("Machine is not connected") uploadError = true; uploadUpdateProgress(); document.getElementById('upload-status').innerHTML = `Please Connect Computer to IDE.\nInstruction: Install Remote code into computercraft in github. (Please press SHIFT or CTRL and click)`; @@ -87,6 +92,7 @@ async function gencode() { } // done! + console.log("Run code done!") document.getElementById('upload-status').textContent = "Done!"; await delay(1000) document.getElementById('upload-popup').style.animation = 'fadeOut 0.3s ease'; // Apply fade-out animation diff --git a/src/index.js b/src/index.js index 30beb58..d5fe3f8 100644 --- a/src/index.js +++ b/src/index.js @@ -6,7 +6,20 @@ window.prompt = function(promptText, defaultValue) { return ipc.sendSync("prompt", promptText, defaultValue); }; -ipc.send("update-startup-status", "Importing module...") +window.onerror = function (message, source, lineno, colno, error) { + ipc.send("error", message) + return true; // Prevents the default browser error handling +}; + +console.originalLog = console.log; + +console.log = function (...args) { + ipc.send("update-log-status", ...args) + console.originalLog(...args) +}; + + +console.log("Importing module...") const fs = require('fs'); const path = require('path'); const { loadperipheral, scanindex } = require("./blocksmanager"); @@ -17,7 +30,7 @@ let isprojectsaved = false; let isprojectopened = false; let usedlibinproject = [] -ipc.send("update-startup-status", "Initializing blockly workspace...") +console.log("Initializing blockly workspace...") Blockly.utils.colour.setHsvSaturation(0.9) let originaltoolbar = fs.readFileSync(path.join(__dirname, "toolbox.xml"), 'utf8'); @@ -52,7 +65,7 @@ try { } try { - ipc.send("update-startup-status", "Importing system library...") + console.log("Importing system library...") const sysmodulejson = fs.readFileSync(path.join(__dirname, "module_block_design.json"), 'utf8'); const blocksJson = JSON.parse(sysmodulejson); for (const blockId in blocksJson) { @@ -66,13 +79,13 @@ try { } require("./module_generator") - ipc.send("update-startup-status", "Scanning library...") + console.log("Scanning library...") scanindex(); } catch (e) { ipc.send("erroronstart", `Error on loading block: ${e}`) } -ipc.send("update-startup-status", "Initializing event...") +console.log("Initializing event...") ipc.on('export-lua-request', (event) => { console.log("exporting lua") @@ -81,6 +94,7 @@ ipc.on('export-lua-request', (event) => { // Save workspace ipc.on('save-workspace-request', (event) => { + console.log("Saving project...") document.getElementById('statusMessage').textContent = `Saving...`; const state = Blockly.serialization.workspaces.save(workspace); const data = { @@ -93,6 +107,7 @@ ipc.on('save-workspace-request', (event) => { // Load workspace ipc.on('load-workspace', (event, json) => { + console.log("Loading project...") try { if (json) { data = JSON.parse(json) @@ -182,7 +197,7 @@ document.getElementById("packageman-import-btn").addEventListener('click', () => }); // Ensure Blockly container is shown after the workspace is injected -ipc.send("update-startup-status", "Finished") +console.log("Finished") setTimeout(() => { ipc.send("ready") }, 500); diff --git a/src/module_generator.js b/src/module_generator.js index a262c99..f285c87 100644 --- a/src/module_generator.js +++ b/src/module_generator.js @@ -16,7 +16,7 @@ luaGenerator.forBlock['sys_sleep'] = function(block, generator) { luaGenerator.forBlock['sys_utils_table_variable_pack'] = function(block, generator) { var args = generator.valueToCode(block, 'RETURN_ARGS', generator.ORDER_NONE); - return [`table.pack(${arg})`, luaGenerator.ORDER_NONE]; + return [`table.pack(${args})`, luaGenerator.ORDER_NONE]; }; luaGenerator.forBlock['sys_utils_get_value_from_table_with_index'] = function(block, generator) {