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 @@
+
+
+
+
+
+
+ r
+
+
+
+
+
+
+ a
+
+
+
+
+
+
+ Hello, world!
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
diff --git a/ccIDE Defines.xlsx b/ccIDE Defines.xlsx
index 60f05f2..3e3602b 100644
Binary files a/ccIDE Defines.xlsx and b/ccIDE Defines.xlsx differ
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) {