delphirtl
Version:
RTL functions from Delphi
208 lines • 17 kB
JavaScript
"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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