UNPKG

delphirtl

Version:
208 lines 17 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EnvWriter = exports.EnvReader = exports.EnvParser = void 0; const fs = __importStar(require("fs")); const assert_1 = __importDefault(require("assert")); const rtl_1 = require("./rtl"); /** * A lightweight .env parser that preserves all lines, including comments and blanks. * Parsing rules: * - Lines starting with optional whitespace followed by '#' are comments. * - Empty or whitespace-only lines are blanks. * - Otherwise, the first '=' splits key and value. Key is trimmed of surrounding whitespace. * - The value is kept verbatim (no trimming), preserving quotes and inline content. */ class EnvParser extends rtl_1.TObject { parse(text) { const lines = text.split(/\r?\n/); const nodes = []; for (const line of lines) { // Preserve the raw line (without newline) const raw = line; if (line.trim() === '') { nodes.push({ kind: 'blank', raw }); continue; } const trimmed = line.trimStart(); if (trimmed.startsWith('#')) { nodes.push({ kind: 'comment', comment: line, raw }); continue; } // Find the first '=' sign; if none, keep as comment-like to avoid data loss const eqIdx = line.indexOf('='); if (eqIdx === -1) { // Treat as comment to preserve line as-is nodes.push({ kind: 'comment', comment: line, raw }); continue; } const keyPart = line.slice(0, eqIdx).trim(); const valuePart = line.slice(eqIdx + 1); // keep verbatim nodes.push({ kind: 'kv', key: keyPart, value: valuePart, raw }); } return nodes; } } exports.EnvParser = EnvParser; /** * Reader for .env files using EnvParser. Allows retrieving keys/values and comments. */ class EnvReader extends rtl_1.TObject { constructor(source, opts) { super(); this.nodes = []; this.byKey = new Map(); if (Array.isArray(source)) { this.nodes = source; } else { const isPath = opts?.isPath ?? this.looksLikePath(source); const text = isPath ? fs.readFileSync(source, 'utf-8') : source; const parser = new EnvParser(); this.nodes = parser.parse(text); } this.reindex(); } looksLikePath(s) { // Heuristic: if contains a path separator or ends with .env return /[\\/]/.test(s) || /\.env(\.|$)?/i.test(s); } reindex() { this.byKey.clear(); for (const n of this.nodes) { if (n.kind === 'kv' && n.key) { if (!this.byKey.has(n.key)) this.byKey.set(n.key, n); } } } getAllNodes() { return this.nodes.slice(); } getComments() { return this.nodes.filter(n => n.kind === 'comment'); } getKeyValueNodes() { return this.nodes.filter(n => n.kind === 'kv'); } getKeys() { return this.getKeyValueNodes().map(n => n.key); } has(key) { return this.byKey.has(key); } getValueRaw(key) { return this.byKey.get(key)?.value; } getValue(key) { const raw = this.getValueRaw(key); if (raw == null) return undefined; // Try to unquote if wrapped in matching quotes const trimmed = raw.trim(); if ((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith("'") && trimmed.endsWith("'"))) { return trimmed.slice(1, -1); } return trimmed; } } exports.EnvReader = EnvReader; /** * Writer for .env files. Can append comments and key/values while preserving existing content and order. */ class EnvWriter extends rtl_1.TObject { constructor(initial, opts) { super(); if (typeof initial === 'string' || Array.isArray(initial)) { const reader = new EnvReader(initial, typeof initial === 'string' ? opts : undefined); this.nodes = reader.getAllNodes(); } else { this.nodes = []; } } static fromFile(path) { return new EnvWriter(path, { isPath: true }); } /** Append a blank line */ blank() { this.nodes.push({ kind: 'blank', raw: '' }); return this; } /** Append a comment line. If text already starts with '#', it's preserved as-is. */ comment(text) { const line = text.trimStart().startsWith('#') ? text : `# ${text}`; this.nodes.push({ kind: 'comment', comment: line, raw: line }); return this; } /** Append a key=value pair verbatim. Value is not modified. */ append(key, value) { (0, assert_1.default)(key !== "" && value !== "", "Key and value cannot be empty"); const line = `${key}=${value}`; this.nodes.push({ kind: 'kv', key, value, raw: line }); return this; } /** Set or update a key's value. If key exists, updates its node; otherwise appends at the end. */ set(key, value, opts) { (0, assert_1.default)(key !== "" && value !== "", "Key and value cannot be empty"); const quote = opts?.quote ?? 'none'; let val = value; if (quote === 'single') val = `'${value.replace(/'/g, "'\''")}'`; if (quote === 'double') val = `"${value.replace(/"/g, '\\"')}"`; const existingIdx = this.nodes.findIndex(n => n.kind === 'kv' && n.key === key); const raw = `${key}=${val}`; if (existingIdx >= 0) { const node = this.nodes[existingIdx]; this.nodes[existingIdx] = { ...node, value: val, raw }; } else { this.nodes.push({ kind: 'kv', key, value: val, raw }); } return this; } /** Remove a key if present. */ remove(key) { (0, assert_1.default)(key !== "", "Key cannot be empty"); this.nodes = this.nodes.filter(n => !(n.kind === 'kv' && n.key === key)); return this; } /** Serialize nodes back to .env text. */ toString() { return this.nodes.map(n => { switch (n.kind) { case 'comment': return n.comment; case 'kv': return `${n.key}=${n.value}`; default: return ''; } }).join(rtl_1.sLineBreak); } /** Save to a file path. Creates parent directories if needed. */ save(filePath) { fs.mkdirSync(require('path').dirname(filePath), { recursive: true }); fs.writeFileSync(filePath, this.toString(), 'utf-8'); } } exports.EnvWriter = EnvWriter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsb0RBQTRCO0FBQzVCLCtCQUEwQztBQWlDMUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sU0FBVSxTQUFRLGFBQU87SUFDN0IsS0FBSyxDQUFDLElBQVk7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBYyxFQUFFLENBQUM7UUFDNUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QiwwQ0FBMEM7WUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxTQUFTO1lBQ1gsQ0FBQztZQUNELDRFQUE0RTtZQUM1RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLDBDQUEwQztnQkFDMUMsS0FBSyxD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