UNPKG

fastparselite

Version:

Super simple & fast DSL parser for lightweight config-like data using custom syntax.

73 lines (64 loc) 1.94 kB
const fs = require("fs"); // Parse your LiteData format function parseLiteData(text) { const lines = text.split(/\r?\n/).map(line => line.trim()).filter(line => line && !line.startsWith("//") && !line.startsWith("#")); const stack = []; const result = {}; let current = result; let currentKey = null; for (let line of lines) { if (line.startsWith("@")) { currentKey = line.slice(1).trim(); result[currentKey] = {}; current = result[currentKey]; stack.push(current); } else if (line.endsWith("{")) { const key = line.replace("{", "").trim(); const obj = {}; current[key] = obj; stack.push(current); current = obj; } else if (line === "}") { current = stack.pop(); } else { const [key, valueRaw] = line.split(":").map(s => s.trim()); const value = parseValue(valueRaw); current[key] = value; } } return result; } // Convert values based on type function parseValue(value) { if (!value) return null; if (value.startsWith('"') && value.endsWith('"')) return value.slice(1, -1); if (value === "true") return true; if (value === "false") return false; if (!isNaN(value)) return parseFloat(value); if (value.startsWith("[") && value.endsWith("]")) { return value.slice(1, -1).split(",").map(v => parseValue(v.trim())); } return value; } // Flatten all nested values into one level for easier access function mergeTopLevel(obj) { const flat = { ...obj }; function extract(subObj) { for (const key in subObj) { const val = subObj[key]; if (typeof val === "object" && !Array.isArray(val)) { extract(val); } else { if (!flat.hasOwnProperty(key)) { flat[key] = val; } } } } extract(obj); return flat; } module.exports = { parseLiteData, mergeTopLevel };