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();
}
}