From 36a3ae2da92eec11984dcea52c4bbc2e7b32d36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=97=D0=BB=20=D0=93=D1=80=D0=B8?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=27=D1=94=D0=B2?= Date: Sat, 14 Jun 2025 06:02:58 +0300 Subject: [PATCH] Do not compress translation files Remove the compressjson loader and related defines in webpack config. Also remove the remaining lz-string usages in the project and a local copy. --- gulp/loader.compressjson.cjs | 11 - gulp/webpack.config.js | 7 - gulp/webpack.production.config.js | 7 - package-lock.json | 20 +- package.json | 4 +- src/js/core/lzstring.js | 491 ------------------------------ src/js/platform/api.js | 4 +- src/tsconfig.json | 1 + 8 files changed, 5 insertions(+), 540 deletions(-) delete mode 100644 gulp/loader.compressjson.cjs delete mode 100644 src/js/core/lzstring.js diff --git a/gulp/loader.compressjson.cjs b/gulp/loader.compressjson.cjs deleted file mode 100644 index 9e80298f..00000000 --- a/gulp/loader.compressjson.cjs +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -const lzString = require("lz-string"); - -module.exports = function (source) { - const compressed = lzString.compressToEncodedURIComponent(source); - const sourcecode = `module.exports = (function() { - return JSON.parse(require("global-compression").decompressX64("${compressed}")); - })()`; - return sourcecode; -}; diff --git a/gulp/webpack.config.js b/gulp/webpack.config.js index 9d0bf5d0..12214373 100644 --- a/gulp/webpack.config.js +++ b/gulp/webpack.config.js @@ -21,12 +21,6 @@ const globalDefs = { /** @type {import("webpack").RuleSetRule[]} */ const moduleRules = [ - { - test: /\.json$/, - enforce: "pre", - use: resolve("./loader.compressjson.cjs"), - type: "javascript/auto", - }, { test: /\.jsx?$/, enforce: "pre", @@ -85,7 +79,6 @@ export default { resolve: { fallback: { fs: false }, alias: { - "global-compression": resolve("../src/js/core/lzstring.js"), "@": resolve("../src/js/"), }, fullySpecified: false, diff --git a/gulp/webpack.production.config.js b/gulp/webpack.production.config.js index bcce1ccf..94c6c240 100644 --- a/gulp/webpack.production.config.js +++ b/gulp/webpack.production.config.js @@ -22,12 +22,6 @@ const globalDefs = { /** @type {import("webpack").RuleSetRule[]} */ const moduleRules = [ - { - test: /\.json$/, - enforce: "pre", - use: resolve("./loader.compressjson.cjs"), - type: "javascript/auto", - }, { test: /\.jsx?$/, enforce: "pre", @@ -94,7 +88,6 @@ export default { resolve: { fallback: { fs: false }, alias: { - "global-compression": resolve("../src/js/core/lzstring.js"), "@": resolve("../src/js/"), }, fullySpecified: false, diff --git a/package-lock.json b/package-lock.json index a4178113..140698e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,7 @@ "circular-json": "^0.5.9", "clipboard-copy": "^3.1.0", "debounce-promise": "^3.1.2", - "howler": "^2.1.2", - "lz-string": "^1.4.4" + "howler": "^2.1.2" }, "devDependencies": { "@eslint/js": "^9.24.0", @@ -24,7 +23,6 @@ "@types/circular-dependency-plugin": "^5.0.5", "@types/gulp": "^4.0.9", "@types/gulp-htmlmin": "^1.3.32", - "@types/lz-string": "^1.3.34", "@types/node": "^22.14.0", "@types/webpack": "^5.28.0", "browser-sync": "^2.27.10", @@ -939,13 +937,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/lz-string": { - "version": "1.3.34", - "resolved": "https://registry.npmjs.org/@types/lz-string/-/lz-string-1.3.34.tgz", - "integrity": "sha512-j6G1e8DULJx3ONf6NdR5JiR2ZY3K3PaaqiEuKYkLQO0Czfi1AzrtjfnfCROyWGeDd5IVMKCwsgSmMip9OWijow==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -11889,15 +11880,6 @@ "node": ">=10" } }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", - "license": "WTFPL", - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", diff --git a/package.json b/package.json index e88260ae..19a218ad 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,7 @@ "circular-json": "^0.5.9", "clipboard-copy": "^3.1.0", "debounce-promise": "^3.1.2", - "howler": "^2.1.2", - "lz-string": "^1.4.4" + "howler": "^2.1.2" }, "devDependencies": { "@eslint/js": "^9.24.0", @@ -36,7 +35,6 @@ "@types/circular-dependency-plugin": "^5.0.5", "@types/gulp": "^4.0.9", "@types/gulp-htmlmin": "^1.3.32", - "@types/lz-string": "^1.3.34", "@types/node": "^22.14.0", "@types/webpack": "^5.28.0", "browser-sync": "^2.27.10", diff --git a/src/js/core/lzstring.js b/src/js/core/lzstring.js deleted file mode 100644 index 0ac485ed..00000000 --- a/src/js/core/lzstring.js +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright (c) 2013 Pieroxy -// This work is free. You can redistribute it and/or modify it -// under the terms of the WTFPL, Version 2 -// For more information see LICENSE.txt or http://www.wtfpl.net/ -// -// For more information, the home page: -// http://pieroxy.net/blog/pages/lz-string/testing.html -// -// LZ-based compression algorithm, version 1.4.4 - -const fromCharCode = String.fromCharCode; -const hasOwnProperty = Object.prototype.hasOwnProperty; - -const keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; -const baseReverseDic = {}; - -function getBaseValue(alphabet, character) { - if (!baseReverseDic[alphabet]) { - baseReverseDic[alphabet] = {}; - for (let i = 0; i < alphabet.length; i++) { - baseReverseDic[alphabet][alphabet.charAt(i)] = i; - } - } - return baseReverseDic[alphabet][character]; -} - -//compress into uint8array (UCS-2 big endian format) -export function compressU8(uncompressed) { - let compressed = compress(uncompressed); - let buf = new Uint8Array(compressed.length * 2); // 2 bytes per character - - for (let i = 0, TotalLen = compressed.length; i < TotalLen; i++) { - let current_value = compressed.charCodeAt(i); - buf[i * 2] = current_value >>> 8; - buf[i * 2 + 1] = current_value % 256; - } - return buf; -} - -// Compreses with header -/** - * @param {string} uncompressed - * @param {number} header - */ -export function compressU8WHeader(uncompressed, header) { - let compressed = compress(uncompressed); - let buf = new Uint8Array(2 + compressed.length * 2); // 2 bytes per character - - buf[0] = header >>> 8; - buf[1] = header % 256; - for (let i = 0, TotalLen = compressed.length; i < TotalLen; i++) { - let current_value = compressed.charCodeAt(i); - buf[2 + i * 2] = current_value >>> 8; - buf[2 + i * 2 + 1] = current_value % 256; - } - return buf; -} - -//decompress from uint8array (UCS-2 big endian format) -/** - * - * @param {Uint8Array} compressed - */ -export function decompressU8WHeader(compressed) { - // let buf = new Array(compressed.length / 2); // 2 bytes per character - // for (let i = 0, TotalLen = buf.length; i < TotalLen; i++) { - // buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1]; - // } - - // let result = []; - // buf.forEach(function (c) { - // result.push(fromCharCode(c)); - // }); - let result = []; - for (let i = 2, n = compressed.length; i < n; i += 2) { - const code = compressed[i] * 256 + compressed[i + 1]; - result.push(fromCharCode(code)); - } - return decompress(result.join("")); -} - -//compress into a string that is already URI encoded -export function compressX64(input) { - if (input == null) return ""; - return _compress(input, 6, function (a) { - return keyStrUriSafe.charAt(a); - }); -} - -//decompress from an output of compressToEncodedURIComponent -export function decompressX64(input) { - if (input == null) return ""; - if (input == "") return null; - input = input.replace(/ /g, "+"); - return _decompress(input.length, 32, function (index) { - return getBaseValue(keyStrUriSafe, input.charAt(index)); - }); -} - -function compress(uncompressed) { - return _compress(uncompressed, 16, function (a) { - return fromCharCode(a); - }); -} - -function _compress(uncompressed, bitsPerChar, getCharFromInt) { - if (uncompressed == null) return ""; - let i, - value, - context_dictionary = {}, - context_dictionaryToCreate = {}, - context_c = "", - context_wc = "", - context_w = "", - context_enlargeIn = 2, // Compensate for the first entry which should not count - context_dictSize = 3, - context_numBits = 2, - context_data = [], - context_data_val = 0, - context_data_position = 0, - ii; - - for (ii = 0; ii < uncompressed.length; ii += 1) { - context_c = uncompressed.charAt(ii); - if (!hasOwnProperty.call(context_dictionary, context_c)) { - context_dictionary[context_c] = context_dictSize++; - context_dictionaryToCreate[context_c] = true; - } - - context_wc = context_w + context_c; - if (hasOwnProperty.call(context_dictionary, context_wc)) { - context_w = context_wc; - } else { - if (hasOwnProperty.call(context_dictionaryToCreate, context_w)) { - if (context_w.charCodeAt(0) < 256) { - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - } - value = context_w.charCodeAt(0); - for (i = 0; i < 8; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } else { - value = 1; - for (i = 0; i < context_numBits; i++) { - context_data_val = (context_data_val << 1) | value; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = 0; - } - value = context_w.charCodeAt(0); - for (i = 0; i < 16; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - delete context_dictionaryToCreate[context_w]; - } else { - value = context_dictionary[context_w]; - for (i = 0; i < context_numBits; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - // Add wc to the dictionary. - context_dictionary[context_wc] = context_dictSize++; - context_w = String(context_c); - } - } - - // Output the code for w. - if (context_w !== "") { - if (hasOwnProperty.call(context_dictionaryToCreate, context_w)) { - if (context_w.charCodeAt(0) < 256) { - for (i = 0; i < context_numBits; i++) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - } - value = context_w.charCodeAt(0); - for (i = 0; i < 8; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } else { - value = 1; - for (i = 0; i < context_numBits; i++) { - context_data_val = (context_data_val << 1) | value; - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = 0; - } - value = context_w.charCodeAt(0); - for (i = 0; i < 16; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - delete context_dictionaryToCreate[context_w]; - } else { - value = context_dictionary[context_w]; - for (i = 0; i < context_numBits; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - } - context_enlargeIn--; - if (context_enlargeIn == 0) { - context_enlargeIn = Math.pow(2, context_numBits); - context_numBits++; - } - } - - // Mark the end of the stream - value = 2; - for (i = 0; i < context_numBits; i++) { - context_data_val = (context_data_val << 1) | (value & 1); - if (context_data_position == bitsPerChar - 1) { - context_data_position = 0; - context_data.push(getCharFromInt(context_data_val)); - context_data_val = 0; - } else { - context_data_position++; - } - value = value >> 1; - } - - // Flush the last char - while (true) { - context_data_val = context_data_val << 1; - if (context_data_position == bitsPerChar - 1) { - context_data.push(getCharFromInt(context_data_val)); - break; - } else context_data_position++; - } - return context_data.join(""); -} - -function decompress(compressed) { - if (compressed == null) return ""; - if (compressed == "") return null; - return _decompress(compressed.length, 32768, function (index) { - return compressed.charCodeAt(index); - }); -} - -function _decompress(length, resetValue, getNextValue) { - let dictionary = [], - next, - enlargeIn = 4, - dictSize = 4, - numBits = 3, - entry = "", - result = [], - i, - w, - bits, - resb, - maxpower, - power, - c, - data = { val: getNextValue(0), position: resetValue, index: 1 }; - - for (i = 0; i < 3; i += 1) { - dictionary[i] = i; - } - - bits = 0; - maxpower = Math.pow(2, 2); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - - switch ((next = bits)) { - case 0: - bits = 0; - maxpower = Math.pow(2, 8); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - c = fromCharCode(bits); - break; - case 1: - bits = 0; - maxpower = Math.pow(2, 16); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - c = fromCharCode(bits); - break; - case 2: - return ""; - } - dictionary[3] = c; - w = c; - result.push(c); - - while (true) { - if (data.index > length) { - return ""; - } - - bits = 0; - maxpower = Math.pow(2, numBits); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - - switch ((c = bits)) { - case 0: - bits = 0; - maxpower = Math.pow(2, 8); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - - dictionary[dictSize++] = fromCharCode(bits); - c = dictSize - 1; - enlargeIn--; - break; - case 1: - bits = 0; - maxpower = Math.pow(2, 16); - power = 1; - while (power != maxpower) { - resb = data.val & data.position; - data.position >>= 1; - if (data.position == 0) { - data.position = resetValue; - data.val = getNextValue(data.index++); - } - bits |= (resb > 0 ? 1 : 0) * power; - power <<= 1; - } - dictionary[dictSize++] = fromCharCode(bits); - c = dictSize - 1; - enlargeIn--; - break; - case 2: - return result.join(""); - } - - if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); - numBits++; - } - - if (dictionary[c]) { - // @ts-ignore - entry = dictionary[c]; - } else { - if (c === dictSize) { - entry = w + w.charAt(0); - } else { - return null; - } - } - result.push(entry); - - // Add w+entry[0] to the dictionary. - dictionary[dictSize++] = w + entry.charAt(0); - enlargeIn--; - - w = entry; - - if (enlargeIn == 0) { - enlargeIn = Math.pow(2, numBits); - numBits++; - } - } -} diff --git a/src/js/platform/api.js b/src/js/platform/api.js index 9f0cafd3..d0accb5f 100644 --- a/src/js/platform/api.js +++ b/src/js/platform/api.js @@ -3,7 +3,6 @@ import { Application } from "../application"; /* typehints:end */ import { createLogger } from "../core/logging"; -import { compressX64 } from "../core/lzstring"; import { DialogWithForm } from "../core/modal_dialog_elements"; import { FormElementInput } from "../core/modal_dialog_forms"; import { timeoutPromise } from "../core/utils"; @@ -252,7 +251,8 @@ export class ClientAPI { method: "POST", body: { ...payload, - data: compressX64(JSON.stringify(payload.data)), + // FIXME: Server expects lzstring compressed payload + data: JSON.stringify(payload.data), }, }); } diff --git a/src/tsconfig.json b/src/tsconfig.json index 36911449..c8aa9318 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -13,6 +13,7 @@ }, "jsx": "react-jsx", "jsxImportSource": "@", + "types": [], // remove when comfortable "exactOptionalPropertyTypes": false, "noImplicitAny": false,