Add new function to remove the comments from the settings file.

It reduces the size of the payload when we save on the admin page `.../admin/settings`
This commit is contained in:
Helder Sepulveda 2024-06-01 18:59:59 -04:00
parent ed55018e1f
commit 01f75221ce
3 changed files with 50 additions and 6 deletions

View file

@ -1,12 +1,12 @@
import {useStore} from "../store/store.ts"; import {useStore} from "../store/store.ts";
import {isJSONClean} from "../utils/utils.ts"; import {isJSONClean, cleanComments} from "../utils/utils.ts";
import {Trans} from "react-i18next"; import {Trans} from "react-i18next";
import {IconButton} from "../components/IconButton.tsx"; import {IconButton} from "../components/IconButton.tsx";
import {RotateCw, Save} from "lucide-react"; import {RotateCw, Save} from "lucide-react";
export const SettingsPage = ()=>{ export const SettingsPage = ()=>{
const settingsSocket = useStore(state=>state.settingsSocket) const settingsSocket = useStore(state=>state.settingsSocket)
const settings = useStore(state=>state.settings) const settings = cleanComments(useStore(state=>state.settings))
return <div className="settings-page"> return <div className="settings-page">
<h1><Trans i18nKey="admin_settings.current"/></h1> <h1><Trans i18nKey="admin_settings.current"/></h1>

View file

@ -1,5 +1,14 @@
const minify = (json: string)=>{ export const cleanComments = (json: string|undefined)=>{
if (json !== undefined){
json = json.replace(/\/\*.*?\*\//g, ""); // remove single line comments
json = json.replace(/ *\/\*.*(.|\n)*?\*\//g, ""); // remove multi line comments
json = json.replace(/[ \t]+$/gm, ""); // trim trailing spaces
json = json.replace(/^(\n)/gm, ""); // remove empty lines
}
return json;
}
export const minify = (json: string)=>{
let tokenizer = /"|(\/\*)|(\*\/)|(\/\/)|\n|\r/g, let tokenizer = /"|(\/\*)|(\*\/)|(\/\/)|\n|\r/g,
in_string = false, in_string = false,
in_multiline_comment = false, in_multiline_comment = false,
@ -49,9 +58,6 @@ const minify = (json: string)=>{
return new_str.join(""); return new_str.join("");
} }
export const isJSONClean = (data: string) => { export const isJSONClean = (data: string) => {
let cleanSettings = minify(data); let cleanSettings = minify(data);
// this is a bit naive. In theory some key/value might contain the sequences ',]' or ',}' // this is a bit naive. In theory some key/value might contain the sequences ',]' or ',}'

View file

@ -0,0 +1,38 @@
'use strict';
import {strict as assert} from "assert";
import {cleanComments, minify} from "../../../../admin/src/utils/utils.js";
const fs = require('fs');
const fsp = fs.promises;
let template:string;
describe(__filename, function () {
before(async function () {
template = await fsp.readFile('../settings.json.template', 'utf8')
});
describe('adminUtils', function () {
it('cleanComments function empty', async function () {
assert.equal(cleanComments(""), "");
});
it('cleanComments function HelloWorld no comment', async function () {
assert.equal(cleanComments("HelloWorld"), "HelloWorld");
});
it('cleanComments function HelloWorld with comment', async function () {
assert.equal(cleanComments("Hello/*abc*/World/*def*/"), "HelloWorld");
});
it('cleanComments function HelloWorld with comment and multiline', async function () {
assert.equal(cleanComments("Hello \n/*abc\nxyz*/World/*def*/"), "Hello\nWorld");
});
it('cleanComments function HelloWorld with multiple line breaks', async function () {
assert.equal(cleanComments(" \nHello \n \n \nWorld/*def*/"), "Hello\nWorld");
});
it('cleanComments function same after minified', async function () {
assert.equal(minify(template), minify(cleanComments(template)!));
});
it('minified results are smaller', async function () {
assert.equal(minify(template).length < template.length, true);
});
});
});