From 8eeeb5c1bbf5ca02b5062c5505f41b8616639cf5 Mon Sep 17 00:00:00 2001 From: neko <225498830+neko782@users.noreply.github.com> Date: Mon, 30 Mar 2026 00:25:46 +0000 Subject: [PATCH] added turbowarp unpackager --- .gitmodules | 3 ++ package.json | 1 + src/handlers/turbowarp.ts | 42 +++++++++++++++++--------- src/handlers/turbowarp/unpackager | 1 + src/handlers/turbowarp/unpackager.d.ts | 5 +++ 5 files changed, 38 insertions(+), 14 deletions(-) create mode 160000 src/handlers/turbowarp/unpackager create mode 100644 src/handlers/turbowarp/unpackager.d.ts diff --git a/.gitmodules b/.gitmodules index 0a720b50..84810b93 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,6 @@ [submodule "src/handlers/gimper"] path = src/handlers/gimper url = https://github.com/ConnorTippets/gimper.git +[submodule "src/handlers/turbowarp/unpackager"] + path = src/handlers/turbowarp/unpackager + url = https://github.com/TurboWarp/unpackager.git diff --git a/package.json b/package.json index 03411e81..6c19f134 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@sqlite.org/sqlite-wasm": "^3.51.2-build6", "@stringsync/vexml": "^0.1.8", "@toon-format/toon": "^2.1.0", + "@turbowarp/unpackager": "./src/handlers/turbowarp/unpackager", "@types/bun": "^1.3.9", "@types/meyda": "^5.3.0", "@types/pako": "^2.0.4", diff --git a/src/handlers/turbowarp.ts b/src/handlers/turbowarp.ts index 1c61caec..cf729fdd 100644 --- a/src/handlers/turbowarp.ts +++ b/src/handlers/turbowarp.ts @@ -3,6 +3,7 @@ import type { FileData, FileFormat, FormatHandler } from "../FormatHandler.ts"; import CommonFormats from "src/CommonFormats.ts"; import { Packager, largeAssets, downloadProject } from "turbowarp-packager-browser"; +import unpackager from "@turbowarp/unpackager"; // patching some assets largeAssets.scaffolding.src = "/convert/js/turbowarp-scaffolding/scaffolding-full.js"; @@ -19,13 +20,15 @@ class turbowarpHandler implements FormatHandler { extension: "sb3", mime: "application/x.scratch.sb3", from: true, - to: false, + to: true, internal: "sb3", category: "archive", - lossless: false, + lossless: true, // all project data is in the html }, CommonFormats.HTML.builder("html") .allowTo() + .allowFrom() + .markLossless() ]; public ready: boolean = false; @@ -40,18 +43,29 @@ class turbowarpHandler implements FormatHandler { ): Promise { const outputFiles: FileData[] = []; for (const inputFile of inputFiles) { - const project = await downloadProject(inputFile.bytes); - - const packager = new Packager(); - packager.project = project; - packager.options.target = "html"; - - const bytes = (await packager.package()).data; - - outputFiles.push({ - name: inputFile.name.replace(/\.sb3$/, ".html"), - bytes - }); + if (inputFormat.internal === "sb3") { + const project = await downloadProject(inputFile.bytes); + + const packager = new Packager(); + packager.project = project; + packager.options.target = "html"; + + const bytes = (await packager.package()).data; + + outputFiles.push({ + name: inputFile.name.replace(/\.sb3$/, ".html"), + bytes + }); + } else if (inputFormat.internal === "html") { + const data = (await unpackager(inputFile.bytes)).data; + const bytes = new Uint8Array(data); + outputFiles.push({ + name: inputFile.name.replace(/\.html$/, ".sb3"), + bytes + }); + } else { + throw new Error(`turbowarpHandler cannot convert from ${inputFormat.mime} to ${outputFormat.mime}`); + } } return outputFiles; } diff --git a/src/handlers/turbowarp/unpackager b/src/handlers/turbowarp/unpackager new file mode 160000 index 00000000..2eb03bd5 --- /dev/null +++ b/src/handlers/turbowarp/unpackager @@ -0,0 +1 @@ +Subproject commit 2eb03bd5dc18e3b7b1318190bef8e14274123778 diff --git a/src/handlers/turbowarp/unpackager.d.ts b/src/handlers/turbowarp/unpackager.d.ts new file mode 100644 index 00000000..b3d9b19d --- /dev/null +++ b/src/handlers/turbowarp/unpackager.d.ts @@ -0,0 +1,5 @@ +declare module '@turbowarp/unpackager' { + function unpackage(data: Uint8Array): Promise<{ data: Uint8Array }>; + + export default unpackage; +} \ No newline at end of file