From 6528950f79679d50bda05295a3406bd33b72e009 Mon Sep 17 00:00:00 2001 From: kilgorezer <74324783+kilgorezer@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:38:04 -0800 Subject: [PATCH 1/7] Create indexeddb.js --- extensions/kilgorezer/indexeddb.js | 200 +++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 extensions/kilgorezer/indexeddb.js diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js new file mode 100644 index 0000000000..b60ef0292e --- /dev/null +++ b/extensions/kilgorezer/indexeddb.js @@ -0,0 +1,200 @@ +// Name: IndexedDB +// ID: indexeddb +// Description: Adds basic IndexedDB functionality +// By: kilgorezer +// License: MPL-2.0 + +(function (Scratch) { + "use strict"; + + const prefix = "idb"; + + class DatabaseManager { + openDatabase(dbName) { + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, 1); // Fixed version 1 + + request.onerror = (event) => reject(event.target.error); + + request.onsuccess = (event) => resolve(event.target.result); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + // Create the *single, fixed* object store here. + if (!db.objectStoreNames.contains("myStore")) { + // Fixed store name: 'myStore' + db.createObjectStore("myStore", { keyPath: "id" }); + } + }; + }); + } + + deleteDatabase(dbName) { + return new Promise((resolve, reject) => { + const request = indexedDB.deleteDatabase(dbName); + request.onerror = (event) => reject(event.target.error); + request.onsuccess = () => resolve(); + }); + } + + putValue(dbName, key, value) { + // Simplified: dbName, key, value + return this.openDatabase(dbName).then((db) => { + return new Promise((resolve, reject) => { + const transaction = db.transaction(["myStore"], "readwrite"); // Fixed store name + const objectStore = transaction.objectStore("myStore"); // Fixed store name + const request = objectStore.put({ id: key, value: value }); + + request.onsuccess = () => resolve(); + request.onerror = () => reject(); + }); + }); + } + + getValue(dbName, key) { + // Simplified: dbName, key + return this.openDatabase(dbName).then((db) => { + return new Promise((resolve, reject) => { + const transaction = db.transaction(["myStore"], "readonly"); // Fixed store name + const objectStore = transaction.objectStore("myStore"); // Fixed store name + const request = objectStore.get(key); + + request.onsuccess = (event) => + resolve(event.target.result ? event.target.result.value : ''); + request.onerror = () => reject(); + }); + }); + } + + deleteValue(dbName, key) { + return this.openDatabase(dbName).then((db) => { + return new Promise((resolve, reject) => { + const transaction = db.transaction(["myStore"], "readwrite"); + const objectStore = transaction.objectStore("myStore"); + const request = objectStore.delete(key); // Use delete() method + + request.onsuccess = () => resolve(); + request.onerror = () => reject(); + }); + }); + } + } + + class IndexedDBExtension { + constructor() { + this.dbManager = new DatabaseManager(); + } + + getInfo() { + return { + id: "indexeddb", + name: "IndexedDB", + color1: "#4285F4", + blocks: [ + { + opcode: "openDatabase", + blockType: Scratch.BlockType.COMMAND, + hideFromPalette: true, + text: "Open/Create Database [NAME]", + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + { + opcode: "deleteDatabase", + blockType: Scratch.BlockType.COMMAND, + text: "Delete Database [NAME]", + arguments: { + NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + { + opcode: "putValue", + blockType: Scratch.BlockType.COMMAND, + text: "Put [KEY] : [VALUE] in Database [DB_NAME]", + arguments: { + KEY: { type: Scratch.ArgumentType.STRING }, + VALUE: { type: Scratch.ArgumentType.STRING }, + DB_NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + { + opcode: "getValue", + blockType: Scratch.BlockType.REPORTER, + text: "Get [KEY] from Database [DB_NAME]", + arguments: { + KEY: { type: Scratch.ArgumentType.STRING }, + DB_NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + { + opcode: "deleteValue", + blockType: Scratch.BlockType.COMMAND, + text: "Delete [KEY] from Database [DB_NAME]", + arguments: { + KEY: { type: Scratch.ArgumentType.STRING }, + DB_NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + { + opcode: "clearall", + blockType: Scratch.BlockType.COMMAND, + text: "Clear all keys from Database [DB_NAME]", + arguments: { + DB_NAME: { + type: Scratch.ArgumentType.STRING, + defaultValue: "myDatabase", + }, + }, + }, + ], + }; + } + + async openDatabase(args) { + (await this.dbManager.openDatabase(prefix + "_" + args.NAME)).close(); + } + + async deleteDatabase(args) { + await this.dbManager.deleteDatabase(prefix + "_" + args.NAME); + } + + putValue(args) { + this.dbManager.putValue( + prefix + "_" + args.DB_NAME, + args.KEY, + args.VALUE, + ); + } + + getValue(args) { + return this.dbManager.getValue(prefix + "_" + args.DB_NAME, args.KEY); + } + + deleteValue(args) { + this.dbManager.deleteValue(prefix + args.DB_NAME, args.KEY); + } + + async clearall(args) { + await this.dbManager.deleteDatabase(prefix + args.DB_NAME); + (await this.dbManager.openDatabase(prefix + args.DB_NAME)).close(); + } + } + + Scratch.extensions.register(new IndexedDBExtension()); +})(Scratch); From 43a8eb1b8867e09a7e57b55cd9cbfde7f9585e1d Mon Sep 17 00:00:00 2001 From: "DangoCat[bot]" Date: Fri, 14 Feb 2025 13:02:36 +0000 Subject: [PATCH 2/7] [Automated] Format code --- extensions/kilgorezer/indexeddb.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index b60ef0292e..f3a2bf9027 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -60,7 +60,7 @@ const request = objectStore.get(key); request.onsuccess = (event) => - resolve(event.target.result ? event.target.result.value : ''); + resolve(event.target.result ? event.target.result.value : ""); request.onerror = () => reject(); }); }); @@ -178,7 +178,7 @@ this.dbManager.putValue( prefix + "_" + args.DB_NAME, args.KEY, - args.VALUE, + args.VALUE ); } From 3a6b1a68a523ef46c3a9d559c1935301b1b542f8 Mon Sep 17 00:00:00 2001 From: kilgorezer <74324783+kilgorezer@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:42:31 -0800 Subject: [PATCH 3/7] Update indexeddb.js --- extensions/kilgorezer/indexeddb.js | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index f3a2bf9027..d0981cd355 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -1,5 +1,5 @@ -// Name: IndexedDB -// ID: indexeddb +// Name: Simplified IndexedDB +// ID: kilgindexeddb // Description: Adds basic IndexedDB functionality // By: kilgorezer // License: MPL-2.0 @@ -87,78 +87,78 @@ getInfo() { return { - id: "indexeddb", - name: "IndexedDB", + id: "kilgindexeddb", + name: Scratch.translate("Simplified IndexedDB"), color1: "#4285F4", blocks: [ { opcode: "openDatabase", blockType: Scratch.BlockType.COMMAND, hideFromPalette: true, - text: "Open/Create Database [NAME]", + text: `${Scratch.translate("open/create database")} [NAME]`, arguments: { NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, { opcode: "deleteDatabase", blockType: Scratch.BlockType.COMMAND, - text: "Delete Database [NAME]", + text: `${Scratch.translate("delete database")} [NAME]`, arguments: { NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, { opcode: "putValue", blockType: Scratch.BlockType.COMMAND, - text: "Put [KEY] : [VALUE] in Database [DB_NAME]", + text: `${Scratch.translate("put")} [KEY] : [VALUE] ${Scratch.translate("in database")} [NAME]`, arguments: { KEY: { type: Scratch.ArgumentType.STRING }, VALUE: { type: Scratch.ArgumentType.STRING }, - DB_NAME: { + NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, { opcode: "getValue", blockType: Scratch.BlockType.REPORTER, - text: "Get [KEY] from Database [DB_NAME]", + text: `${Scratch.translate("get")} [KEY] ${Scratch.translate("from database")} [NAME]`, arguments: { KEY: { type: Scratch.ArgumentType.STRING }, - DB_NAME: { + NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, { opcode: "deleteValue", blockType: Scratch.BlockType.COMMAND, - text: "Delete [KEY] from Database [DB_NAME]", + text: `${Scratch.translate("delete")} [KEY] ${Scratch.translate("from database")} [NAME]`, arguments: { KEY: { type: Scratch.ArgumentType.STRING }, - DB_NAME: { + NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, { opcode: "clearall", blockType: Scratch.BlockType.COMMAND, - text: "Clear all keys from Database [DB_NAME]", + text: `${Scratch.translate("clear all keys from database")} [NAME]", arguments: { - DB_NAME: { + NAME: { type: Scratch.ArgumentType.STRING, - defaultValue: "myDatabase", + defaultValue: Scratch.translate("my database"), }, }, }, @@ -167,32 +167,32 @@ } async openDatabase(args) { - (await this.dbManager.openDatabase(prefix + "_" + args.NAME)).close(); + (await this.dbManager.openDatabase(`${prefix}_${Cast.toString(args.NAME)}`)).close(); } async deleteDatabase(args) { - await this.dbManager.deleteDatabase(prefix + "_" + args.NAME); + await this.dbManager.deleteDatabase(`${prefix}_${Cast.toString(args.NAME)}`); } putValue(args) { this.dbManager.putValue( - prefix + "_" + args.DB_NAME, + `${prefix}_${Cast.toString(args.NAME)}`, args.KEY, args.VALUE ); } getValue(args) { - return this.dbManager.getValue(prefix + "_" + args.DB_NAME, args.KEY); + return this.dbManager.getValue(`${prefix}_${Cast.toString(args.NAME)}`, args.KEY); } deleteValue(args) { - this.dbManager.deleteValue(prefix + args.DB_NAME, args.KEY); + this.dbManager.deleteValue(`${prefix}_${Cast.toString(args.NAME)}`, args.KEY); } async clearall(args) { - await this.dbManager.deleteDatabase(prefix + args.DB_NAME); - (await this.dbManager.openDatabase(prefix + args.DB_NAME)).close(); + await this.dbManager.deleteDatabase(`${prefix}_${Cast.toString(args.NAME)}`); + (await this.dbManager.openDatabase(`${prefix}_${Cast.toString(args.NAME)}`)).close(); } } From 3fbf907020acf6fa7beb86406dc2a0ccec58cadf Mon Sep 17 00:00:00 2001 From: kilgorezer <74324783+kilgorezer@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:54:22 -0800 Subject: [PATCH 4/7] Add casting --- extensions/kilgorezer/indexeddb.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index d0981cd355..0e1901aad0 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -177,17 +177,17 @@ putValue(args) { this.dbManager.putValue( `${prefix}_${Cast.toString(args.NAME)}`, - args.KEY, - args.VALUE + Cast.toString(args.KEY), + Cast.toString(args.VALUE) ); } getValue(args) { - return this.dbManager.getValue(`${prefix}_${Cast.toString(args.NAME)}`, args.KEY); + return this.dbManager.getValue(`${prefix}_${Cast.toString(args.NAME)}`, Cast.toString(args.KEY)); } deleteValue(args) { - this.dbManager.deleteValue(`${prefix}_${Cast.toString(args.NAME)}`, args.KEY); + this.dbManager.deleteValue(`${prefix}_${Cast.toString(args.NAME)}`, Cast.toString(args.KEY)); } async clearall(args) { From e07a2d24a754650b4bf4e16faff6796e944d4af1 Mon Sep 17 00:00:00 2001 From: kilgorezer <74324783+kilgorezer@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:36:47 -0800 Subject: [PATCH 5/7] oops forgot to replace a " --- extensions/kilgorezer/indexeddb.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index 0e1901aad0..f5b61c4dd4 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -154,7 +154,7 @@ { opcode: "clearall", blockType: Scratch.BlockType.COMMAND, - text: `${Scratch.translate("clear all keys from database")} [NAME]", + text: `${Scratch.translate("clear all keys from database")} [NAME]`, arguments: { NAME: { type: Scratch.ArgumentType.STRING, From dc259a64edc0c2339eccfa7b96de81a6895ca6c8 Mon Sep 17 00:00:00 2001 From: kilgorezer <74324783+kilgorezer@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:41:31 -0800 Subject: [PATCH 6/7] Add cast to the IIFE --- extensions/kilgorezer/indexeddb.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index f5b61c4dd4..4957604e82 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -4,7 +4,7 @@ // By: kilgorezer // License: MPL-2.0 -(function (Scratch) { +(function (Scratch, Cast) { "use strict"; const prefix = "idb"; @@ -197,4 +197,4 @@ } Scratch.extensions.register(new IndexedDBExtension()); -})(Scratch); +})(Scratch, Scratch.Cast); From ab034280ca1a1200f3d958cfc12fd0994e0da15c Mon Sep 17 00:00:00 2001 From: "DangoCat[bot]" Date: Fri, 14 Feb 2025 20:44:16 +0000 Subject: [PATCH 7/7] [Automated] Format code --- extensions/kilgorezer/indexeddb.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/extensions/kilgorezer/indexeddb.js b/extensions/kilgorezer/indexeddb.js index 4957604e82..e956a66869 100644 --- a/extensions/kilgorezer/indexeddb.js +++ b/extensions/kilgorezer/indexeddb.js @@ -167,11 +167,17 @@ } async openDatabase(args) { - (await this.dbManager.openDatabase(`${prefix}_${Cast.toString(args.NAME)}`)).close(); + ( + await this.dbManager.openDatabase( + `${prefix}_${Cast.toString(args.NAME)}` + ) + ).close(); } async deleteDatabase(args) { - await this.dbManager.deleteDatabase(`${prefix}_${Cast.toString(args.NAME)}`); + await this.dbManager.deleteDatabase( + `${prefix}_${Cast.toString(args.NAME)}` + ); } putValue(args) { @@ -183,16 +189,28 @@ } getValue(args) { - return this.dbManager.getValue(`${prefix}_${Cast.toString(args.NAME)}`, Cast.toString(args.KEY)); + return this.dbManager.getValue( + `${prefix}_${Cast.toString(args.NAME)}`, + Cast.toString(args.KEY) + ); } deleteValue(args) { - this.dbManager.deleteValue(`${prefix}_${Cast.toString(args.NAME)}`, Cast.toString(args.KEY)); + this.dbManager.deleteValue( + `${prefix}_${Cast.toString(args.NAME)}`, + Cast.toString(args.KEY) + ); } async clearall(args) { - await this.dbManager.deleteDatabase(`${prefix}_${Cast.toString(args.NAME)}`); - (await this.dbManager.openDatabase(`${prefix}_${Cast.toString(args.NAME)}`)).close(); + await this.dbManager.deleteDatabase( + `${prefix}_${Cast.toString(args.NAME)}` + ); + ( + await this.dbManager.openDatabase( + `${prefix}_${Cast.toString(args.NAME)}` + ) + ).close(); } }