// Coded entirely by ChatGPT // :( const express = require("express"); const fs = require("fs"); const parser = require("@babel/parser"); const traverse = require("@babel/traverse").default; const generate = require("@babel/generator").default; const t = require("@babel/types"); const app = express(); app.use(express.json()); const FILE = "../_data/i18n.js"; function loadAST() { const code = fs.readFileSync(FILE, "utf8"); return parser.parse(code, { sourceType: "module" }); } function extract(ast) { const out = {}; traverse(ast, { AssignmentExpression(path) { if ( path.node.left.object?.name === "module" && path.node.left.property?.name === "exports" ) { path.node.right.properties.forEach(langProp => { const lang = langProp.key.name || langProp.key.value; out[lang] = {}; langProp.value.properties.forEach(p => { const key = p.key.name || p.key.value; out[lang][key] = p.value.extra?.raw || generate(p.value).code; }); }); } } }); return out; } function write(ast, newData) { traverse(ast, { AssignmentExpression(path) { if ( path.node.left.object?.name === "module" && path.node.left.property?.name === "exports" ) { path.node.right.properties.forEach(langProp => { const lang = langProp.key.name || langProp.key.value; const existingKeys = new Set( langProp.value.properties.map(p => p.key.name || p.key.value) ); // update existing langProp.value.properties.forEach(p => { const key = p.key.name || p.key.value; if (key in (newData[lang] || {})) { p.value = parser.parseExpression(newData[lang][key]); } }); // add new keys Object.keys(newData[lang] || {}).forEach(key => { if (!existingKeys.has(key)) { langProp.value.properties.push( t.objectProperty( t.identifier(key), parser.parseExpression(newData[lang][key]) ) ); } }); }); } } }); const output = generate(ast, { retainLines: true }).code; fs.writeFileSync(FILE, output); } app.get("/data", (req, res) => { const ast = loadAST(); res.json(extract(ast)); }); app.post("/save", (req, res) => { const ast = loadAST(); write(ast, req.body); res.send("ok"); }); app.get("/", (req, res) => { res.send(`