@dbcube/core 5.2.4 → 5.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -37,6 +37,7 @@ __export(index_exports, {
37
37
  DaemonClient: () => DaemonClient,
38
38
  DbConfig: () => DbConfig,
39
39
  Engine: () => Engine,
40
+ EnvLoader: () => EnvLoader,
40
41
  FileLogger: () => FileLogger,
41
42
  QueryEngine: () => QueryEngine,
42
43
  TableProcessor: () => TableProcessor,
@@ -46,6 +47,7 @@ module.exports = __toCommonJS(index_exports);
46
47
 
47
48
  // src/lib/Engine.ts
48
49
  var import_path4 = __toESM(require("path"));
50
+ var fs5 = __toESM(require("fs"));
49
51
 
50
52
  // src/lib/Arquitecture.ts
51
53
  var os = __toESM(require("os"));
@@ -193,7 +195,7 @@ var Downloader = class {
193
195
  */
194
196
  static async fetchLatestVersion(prefix) {
195
197
  const url = this.VERSION_URLS[prefix];
196
- return new Promise((resolve5, reject) => {
198
+ return new Promise((resolve6, reject) => {
197
199
  https.get(url, (response) => {
198
200
  let data = "";
199
201
  response.on("data", (chunk) => {
@@ -203,7 +205,7 @@ var Downloader = class {
203
205
  try {
204
206
  const versions = JSON.parse(data);
205
207
  if (versions && versions.length > 0) {
206
- resolve5(versions[0].version);
208
+ resolve6(versions[0].version);
207
209
  } else {
208
210
  reject(new Error("No versions found"));
209
211
  }
@@ -412,7 +414,7 @@ var Downloader = class {
412
414
  if (attempt < maxRetries && (errorMessage.includes("ECONNRESET") || errorMessage.includes("timeout") || errorMessage.includes("ETIMEDOUT") || errorMessage.includes("ENOTFOUND"))) {
413
415
  attempt++;
414
416
  console.log(`\u{1F504} Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);
415
- await new Promise((resolve5) => setTimeout(resolve5, 1e3 + Math.random() * 1e3));
417
+ await new Promise((resolve6) => setTimeout(resolve6, 1e3 + Math.random() * 1e3));
416
418
  } else {
417
419
  throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);
418
420
  }
@@ -460,12 +462,12 @@ var Downloader = class {
460
462
  return `[${filledBar}${emptyBar}] ${percentage}`;
461
463
  }
462
464
  static downloadFileWithProgress(url, outputPath, prefix) {
463
- return new Promise((resolve5, reject) => {
465
+ return new Promise((resolve6, reject) => {
464
466
  const request = https.get(url, { timeout: 0 }, (response) => {
465
467
  if (response.statusCode === 302 || response.statusCode === 301) {
466
468
  const redirectUrl = response.headers.location;
467
469
  if (redirectUrl) {
468
- return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve5).catch(reject);
470
+ return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve6).catch(reject);
469
471
  }
470
472
  }
471
473
  if (response.statusCode !== 200) {
@@ -488,7 +490,7 @@ var Downloader = class {
488
490
  }
489
491
  });
490
492
  response.on("end", () => {
491
- file.end(() => resolve5());
493
+ file.end(() => resolve6());
492
494
  });
493
495
  response.on("error", (err) => {
494
496
  file.close();
@@ -520,7 +522,7 @@ var Downloader = class {
520
522
  this.mainSpinner.text = `\u{1F4E5} ${import_chalk.default.bold(binary)} - ${progressText}`;
521
523
  }
522
524
  static extractBinary(zipPath, outputPath, prefix) {
523
- return new Promise((resolve5, reject) => {
525
+ return new Promise((resolve6, reject) => {
524
526
  const outDir = path.dirname(outputPath);
525
527
  let extracted = 0;
526
528
  const pending = [];
@@ -555,7 +557,7 @@ var Downloader = class {
555
557
  if (extracted === 0) {
556
558
  reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
557
559
  } else {
558
- resolve5();
560
+ resolve6();
559
561
  }
560
562
  }).catch((err) => {
561
563
  this.cleanupFile(zipPath);
@@ -616,6 +618,9 @@ var Binary = class {
616
618
  return;
617
619
  }
618
620
  const binDir = this.getBinDir();
621
+ if (this.binariesPresent(binDir)) {
622
+ return;
623
+ }
619
624
  if (!this.isDownloading) {
620
625
  this.isDownloading = true;
621
626
  this.downloadPromise = this.downloadBinaries();
@@ -627,6 +632,17 @@ var Binary = class {
627
632
  }
628
633
  }
629
634
  }
635
+ /** ¿Están ya presentes query-engine y schema-engine en binDir? */
636
+ static binariesPresent(binDir) {
637
+ try {
638
+ const files = fs2.readdirSync(binDir);
639
+ const hasQuery = files.some((f) => /^query-engine-/.test(f));
640
+ const hasSchema = files.some((f) => /^schema-engine-/.test(f));
641
+ return hasQuery && hasSchema;
642
+ } catch {
643
+ return false;
644
+ }
645
+ }
630
646
  static async downloadBinaries() {
631
647
  try {
632
648
  const binDir = this.getBinDir();
@@ -746,6 +762,67 @@ var Config = class {
746
762
  }
747
763
  };
748
764
 
765
+ // src/lib/EnvLoader.ts
766
+ var fs3 = __toESM(require("fs"));
767
+ var path3 = __toESM(require("path"));
768
+ var EnvLoader = class _EnvLoader {
769
+ /**
770
+ * Carga el archivo .env indicado (o ./.env del cwd) en process.env.
771
+ * Silencioso si el archivo no existe. Devuelve true si cargó algo.
772
+ */
773
+ static load(envPath) {
774
+ const file = envPath || path3.resolve(process.cwd(), ".env");
775
+ if (!fs3.existsSync(file)) return false;
776
+ const proc = process;
777
+ if (typeof proc.loadEnvFile === "function") {
778
+ try {
779
+ proc.loadEnvFile(file);
780
+ return true;
781
+ } catch {
782
+ }
783
+ }
784
+ try {
785
+ const parsed = _EnvLoader.parse(fs3.readFileSync(file, "utf8"));
786
+ for (const [key, value] of Object.entries(parsed)) {
787
+ if (process.env[key] === void 0) {
788
+ process.env[key] = value;
789
+ }
790
+ }
791
+ return true;
792
+ } catch {
793
+ return false;
794
+ }
795
+ }
796
+ /**
797
+ * Parser mínimo de formato .env. Soporta:
798
+ * KEY=value · KEY="value con espacios" · KEY='literal' · export KEY=value
799
+ * comentarios con # · líneas en blanco · \n \t en comillas dobles.
800
+ */
801
+ static parse(content) {
802
+ const out = {};
803
+ for (const rawLine of content.split(/\r?\n/)) {
804
+ const line = rawLine.trim();
805
+ if (!line || line.startsWith("#")) continue;
806
+ const withoutExport = line.startsWith("export ") ? line.slice(7).trim() : line;
807
+ const eq = withoutExport.indexOf("=");
808
+ if (eq === -1) continue;
809
+ const key = withoutExport.slice(0, eq).trim();
810
+ if (!key) continue;
811
+ let value = withoutExport.slice(eq + 1).trim();
812
+ if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') {
813
+ value = value.slice(1, -1).replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\"/g, '"');
814
+ } else if (value.length >= 2 && value[0] === "'" && value[value.length - 1] === "'") {
815
+ value = value.slice(1, -1);
816
+ } else {
817
+ const hash = value.indexOf(" #");
818
+ if (hash !== -1) value = value.slice(0, hash).trim();
819
+ }
820
+ out[key] = value;
821
+ }
822
+ return out;
823
+ }
824
+ };
825
+
749
826
  // src/lib/Engine.ts
750
827
  var import_child_process2 = require("child_process");
751
828
  var import_module = require("module");
@@ -875,22 +952,22 @@ var DaemonClient = class _DaemonClient {
875
952
  child.unref();
876
953
  }
877
954
  tryConnect(port) {
878
- return new Promise((resolve5) => {
955
+ return new Promise((resolve6) => {
879
956
  const socket = import_net.default.createConnection({ host: "127.0.0.1", port }, async () => {
880
957
  socket.setNoDelay(true);
881
958
  this.attach(socket);
882
959
  try {
883
960
  const pong = await this.send({ action: "ping" }, 2e3);
884
- resolve5(pong.status === 200);
961
+ resolve6(pong.status === 200);
885
962
  } catch {
886
963
  this.detach();
887
- resolve5(false);
964
+ resolve6(false);
888
965
  }
889
966
  });
890
- socket.once("error", () => resolve5(false));
967
+ socket.once("error", () => resolve6(false));
891
968
  socket.setTimeout(3e3, () => {
892
969
  socket.destroy();
893
- resolve5(false);
970
+ resolve6(false);
894
971
  });
895
972
  });
896
973
  }
@@ -938,7 +1015,7 @@ var DaemonClient = class _DaemonClient {
938
1015
  * single socket, so pending requests resolve in send order.
939
1016
  */
940
1017
  send(payload, timeoutMs) {
941
- return new Promise((resolve5, reject) => {
1018
+ return new Promise((resolve6, reject) => {
942
1019
  if (!this.socket || this.socket.destroyed) {
943
1020
  reject(new Error("Daemon not connected"));
944
1021
  return;
@@ -949,7 +1026,7 @@ var DaemonClient = class _DaemonClient {
949
1026
  reject(new Error("Daemon request timeout"));
950
1027
  this.detach();
951
1028
  }, timeoutMs ?? this.requestTimeout);
952
- this.pending.push({ resolve: resolve5, reject, timer });
1029
+ this.pending.push({ resolve: resolve6, reject, timer });
953
1030
  this.socket.write(JSON.stringify(payload) + "\n");
954
1031
  });
955
1032
  }
@@ -1083,6 +1160,7 @@ var Engine = class {
1083
1160
  }
1084
1161
  setArguments() {
1085
1162
  let args = [];
1163
+ const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
1086
1164
  if (this.config.type == "sqlite") {
1087
1165
  args = [
1088
1166
  "--id",
@@ -1092,7 +1170,7 @@ var Engine = class {
1092
1170
  "--database",
1093
1171
  this.config.config.DATABASE + ".db",
1094
1172
  "--motor",
1095
- this.config.type
1173
+ motor
1096
1174
  ];
1097
1175
  } else {
1098
1176
  args = [
@@ -1107,7 +1185,7 @@ var Engine = class {
1107
1185
  "--port",
1108
1186
  String(this.config.config.PORT),
1109
1187
  "--motor",
1110
- this.config.type
1188
+ motor
1111
1189
  ];
1112
1190
  if (this.config.config.USER != null && this.config.config.USER !== "") {
1113
1191
  args.push("--user", this.config.config.USER);
@@ -1120,8 +1198,10 @@ var Engine = class {
1120
1198
  }
1121
1199
  setConfig(name) {
1122
1200
  const configInstance = new Config();
1201
+ EnvLoader.load();
1123
1202
  try {
1124
- const configFilePath = import_path4.default.resolve(process.cwd(), "dbcube.config.js");
1203
+ const cjsPath = import_path4.default.resolve(process.cwd(), "dbcube.config.cjs");
1204
+ const configFilePath = fs5.existsSync(cjsPath) ? cjsPath : import_path4.default.resolve(process.cwd(), "dbcube.config.js");
1125
1205
  const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
1126
1206
  const require2 = (0, import_module.createRequire)(requireUrl);
1127
1207
  if (require2.cache && require2.resolve) {
@@ -1153,7 +1233,7 @@ var Engine = class {
1153
1233
  if (!this.binary) {
1154
1234
  throw new Error("Binary not initialized");
1155
1235
  }
1156
- return new Promise((resolve5, reject) => {
1236
+ return new Promise((resolve6, reject) => {
1157
1237
  const child = (0, import_child_process2.spawn)(this.binary[binary], [...this.arguments, ...args]);
1158
1238
  let stdoutBuffer = "";
1159
1239
  let stderrBuffer = "";
@@ -1169,7 +1249,7 @@ var Engine = class {
1169
1249
  if (!isResolved) {
1170
1250
  isResolved = true;
1171
1251
  clearTimeout(timeoutId);
1172
- resolve5(response);
1252
+ resolve6(response);
1173
1253
  }
1174
1254
  };
1175
1255
  const tryParseLines = (buffer) => {
@@ -1196,16 +1276,21 @@ var Engine = class {
1196
1276
  }
1197
1277
  return buffer;
1198
1278
  };
1279
+ const showEngineOutput = process.env.DBCUBE_DEBUG === "1" || process.env.DBCUBE_DEBUG === "true";
1199
1280
  child.stdout.on("data", (data) => {
1200
1281
  const text = data.toString();
1201
- const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
1202
- if (visible) console.log(visible);
1282
+ if (showEngineOutput) {
1283
+ const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
1284
+ if (visible) console.log(visible);
1285
+ }
1203
1286
  stdoutBuffer = tryParseLines(stdoutBuffer + text);
1204
1287
  });
1205
1288
  child.stderr.on("data", (data) => {
1206
1289
  const text = data.toString();
1207
- const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
1208
- if (visible) console.log(visible);
1290
+ if (showEngineOutput) {
1291
+ const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
1292
+ if (visible) console.log(visible);
1293
+ }
1209
1294
  stderrBuffer = tryParseLines(stderrBuffer + text);
1210
1295
  });
1211
1296
  child.on("close", (code) => {
@@ -1235,10 +1320,11 @@ var Engine = class {
1235
1320
 
1236
1321
  // src/lib/QueryEngine.ts
1237
1322
  var import_path5 = __toESM(require("path"));
1323
+ var fs7 = __toESM(require("fs"));
1238
1324
 
1239
1325
  // src/lib/EmbeddedEngine.ts
1240
- var fs4 = __toESM(require("fs"));
1241
- var path5 = __toESM(require("path"));
1326
+ var fs6 = __toESM(require("fs"));
1327
+ var path6 = __toESM(require("path"));
1242
1328
  if (!process.env.UV_THREADPOOL_SIZE) {
1243
1329
  process.env.UV_THREADPOOL_SIZE = "16";
1244
1330
  }
@@ -1254,11 +1340,11 @@ function platTag() {
1254
1340
  }
1255
1341
  function findFile(name) {
1256
1342
  const candidates = [
1257
- path5.resolve(process.cwd(), ".dbcube", "bin", name),
1258
- path5.resolve(process.cwd(), "node_modules", ".dbcube", "bin", name)
1343
+ path6.resolve(process.cwd(), ".dbcube", "bin", name),
1344
+ path6.resolve(process.cwd(), "node_modules", ".dbcube", "bin", name)
1259
1345
  ];
1260
1346
  for (const c of candidates) {
1261
- if (fs4.existsSync(c)) return c;
1347
+ if (fs6.existsSync(c)) return c;
1262
1348
  }
1263
1349
  return null;
1264
1350
  }
@@ -1366,10 +1452,10 @@ function loadKoffiBackend() {
1366
1452
  return { status: 500, message: `Invalid embedded response: ${e.message}`, data: null };
1367
1453
  }
1368
1454
  };
1369
- const call = (fn, ...args) => new Promise((resolve5, reject) => {
1455
+ const call = (fn, ...args) => new Promise((resolve6, reject) => {
1370
1456
  fn.async(...args, (err, ptr) => {
1371
1457
  if (err) return reject(err);
1372
- resolve5(take(ptr));
1458
+ resolve6(take(ptr));
1373
1459
  });
1374
1460
  });
1375
1461
  return {
@@ -1523,12 +1609,12 @@ var QueryEngine = class {
1523
1609
  throw new Error("No available ports found in range 9900-9944");
1524
1610
  }
1525
1611
  isPortAvailable(port) {
1526
- return new Promise((resolve5) => {
1612
+ return new Promise((resolve6) => {
1527
1613
  const tester = net2.createServer();
1528
- tester.once("error", () => resolve5(false));
1614
+ tester.once("error", () => resolve6(false));
1529
1615
  tester.once("listening", () => {
1530
1616
  tester.close();
1531
- resolve5(true);
1617
+ resolve6(true);
1532
1618
  });
1533
1619
  tester.listen(port, "127.0.0.1");
1534
1620
  });
@@ -1540,6 +1626,7 @@ var QueryEngine = class {
1540
1626
  }
1541
1627
  setArguments() {
1542
1628
  let args = [];
1629
+ const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
1543
1630
  if (this.config.type == "sqlite") {
1544
1631
  args = [
1545
1632
  "--id",
@@ -1549,7 +1636,7 @@ var QueryEngine = class {
1549
1636
  "--database",
1550
1637
  this.config.config.DATABASE + ".db",
1551
1638
  "--motor",
1552
- this.config.type
1639
+ motor
1553
1640
  ];
1554
1641
  } else {
1555
1642
  args = [
@@ -1564,7 +1651,7 @@ var QueryEngine = class {
1564
1651
  "--port",
1565
1652
  String(this.config.config.PORT),
1566
1653
  "--motor",
1567
- this.config.type
1654
+ motor
1568
1655
  ];
1569
1656
  if (this.config.config.USER != null && this.config.config.USER !== "") {
1570
1657
  args.push("--user", this.config.config.USER);
@@ -1588,8 +1675,10 @@ var QueryEngine = class {
1588
1675
  }
1589
1676
  setConfig(name) {
1590
1677
  const configInstance = new Config();
1678
+ EnvLoader.load();
1591
1679
  try {
1592
- const configFilePath = import_path5.default.resolve(process.cwd(), "dbcube.config.js");
1680
+ const cjsPath = import_path5.default.resolve(process.cwd(), "dbcube.config.cjs");
1681
+ const configFilePath = fs7.existsSync(cjsPath) ? cjsPath : import_path5.default.resolve(process.cwd(), "dbcube.config.js");
1593
1682
  const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
1594
1683
  const require2 = (0, import_module2.createRequire)(requireUrl);
1595
1684
  if (require2.cache && require2.resolve) {
@@ -1761,7 +1850,7 @@ var QueryEngine = class {
1761
1850
  throw e;
1762
1851
  }
1763
1852
  }
1764
- return new Promise((resolve5) => pool.waiters.push(resolve5));
1853
+ return new Promise((resolve6) => pool.waiters.push(resolve6));
1765
1854
  }
1766
1855
  releaseSocket(socket, broken) {
1767
1856
  const pool = socketPools.get(this.connectionId);
@@ -1800,25 +1889,25 @@ var QueryEngine = class {
1800
1889
  throw new Error("TCP server failed to become ready within timeout");
1801
1890
  }
1802
1891
  async isServerResponding(port) {
1803
- return new Promise((resolve5) => {
1892
+ return new Promise((resolve6) => {
1804
1893
  const client = new net2.Socket();
1805
1894
  const timeout = setTimeout(() => {
1806
1895
  client.destroy();
1807
- resolve5(false);
1896
+ resolve6(false);
1808
1897
  }, 1e3);
1809
1898
  client.connect(port, "127.0.0.1", () => {
1810
1899
  clearTimeout(timeout);
1811
1900
  client.destroy();
1812
- resolve5(true);
1901
+ resolve6(true);
1813
1902
  });
1814
1903
  client.on("error", () => {
1815
1904
  clearTimeout(timeout);
1816
- resolve5(false);
1905
+ resolve6(false);
1817
1906
  });
1818
1907
  });
1819
1908
  }
1820
1909
  sleep(ms) {
1821
- return new Promise((resolve5) => setTimeout(resolve5, ms));
1910
+ return new Promise((resolve6) => setTimeout(resolve6, ms));
1822
1911
  }
1823
1912
  getCachedDML(dmlJson) {
1824
1913
  if (queryCache.has(dmlJson)) {
@@ -1838,7 +1927,7 @@ var QueryEngine = class {
1838
1927
  throw new Error("Binary not initialized");
1839
1928
  }
1840
1929
  this.tcpPort = await this.findAvailablePort(this.tcpPort);
1841
- return new Promise((resolve5, reject) => {
1930
+ return new Promise((resolve6, reject) => {
1842
1931
  const serverArgs = [...this.arguments, "--action", "server", "--tcp-port", this.tcpPort.toString()];
1843
1932
  const serverProcess = (0, import_child_process3.spawn)(this.binary["query_engine"], serverArgs);
1844
1933
  let started = false;
@@ -1858,7 +1947,7 @@ var QueryEngine = class {
1858
1947
  port: this.tcpPort,
1859
1948
  process: serverProcess
1860
1949
  });
1861
- resolve5();
1950
+ resolve6();
1862
1951
  }
1863
1952
  }
1864
1953
  });
@@ -1877,7 +1966,7 @@ var QueryEngine = class {
1877
1966
  });
1878
1967
  }
1879
1968
  async createNewConnection(port) {
1880
- return new Promise((resolve5, reject) => {
1969
+ return new Promise((resolve6, reject) => {
1881
1970
  const client = new net2.Socket();
1882
1971
  client.setNoDelay(true);
1883
1972
  client.setKeepAlive(true, 6e4);
@@ -1887,7 +1976,7 @@ var QueryEngine = class {
1887
1976
  }, 5e3);
1888
1977
  client.connect(port, "127.0.0.1", () => {
1889
1978
  clearTimeout(timeout);
1890
- resolve5(client);
1979
+ resolve6(client);
1891
1980
  });
1892
1981
  client.on("error", (error) => {
1893
1982
  clearTimeout(timeout);
@@ -1896,7 +1985,7 @@ var QueryEngine = class {
1896
1985
  });
1897
1986
  }
1898
1987
  async executeOnConnection(connection, command) {
1899
- return new Promise((resolve5, reject) => {
1988
+ return new Promise((resolve6, reject) => {
1900
1989
  let responseBuffer = "";
1901
1990
  let isResolved = false;
1902
1991
  const timeout = setTimeout(() => {
@@ -1921,7 +2010,7 @@ var QueryEngine = class {
1921
2010
  connection.removeListener("error", onError);
1922
2011
  try {
1923
2012
  const response = JSON.parse(line.slice(marker + "PROCESS_RESPONSE:".length));
1924
- resolve5({
2013
+ resolve6({
1925
2014
  status: response.status,
1926
2015
  message: response.message,
1927
2016
  data: response.data
@@ -1950,7 +2039,7 @@ var QueryEngine = class {
1950
2039
  if (!this.binary) {
1951
2040
  throw new Error("Binary not initialized");
1952
2041
  }
1953
- return new Promise((resolve5, reject) => {
2042
+ return new Promise((resolve6, reject) => {
1954
2043
  const child = (0, import_child_process3.spawn)(this.binary[binary], [...this.arguments, ...args]);
1955
2044
  let stdoutBuffer = "";
1956
2045
  let stderrBuffer = "";
@@ -1966,7 +2055,7 @@ var QueryEngine = class {
1966
2055
  if (!isResolved) {
1967
2056
  isResolved = true;
1968
2057
  clearTimeout(timeoutId);
1969
- resolve5(response);
2058
+ resolve6(response);
1970
2059
  }
1971
2060
  };
1972
2061
  const tryParseLines = (buffer) => {
@@ -2053,9 +2142,9 @@ var QueryEngine = class {
2053
2142
  };
2054
2143
 
2055
2144
  // src/lib/DbConfig.ts
2056
- var path7 = __toESM(require("path"));
2145
+ var path8 = __toESM(require("path"));
2057
2146
  var import_fs2 = __toESM(require("fs"));
2058
- var rootPath = path7.resolve(process.cwd(), ".dbcube");
2147
+ var rootPath = path8.resolve(process.cwd(), ".dbcube");
2059
2148
  var SQLite = class {
2060
2149
  database;
2061
2150
  engine = null;
@@ -2064,14 +2153,14 @@ var SQLite = class {
2064
2153
  }
2065
2154
  /** Ruta del archivo SQLite interno (.dbcube/<database>.db). */
2066
2155
  dbFilePath() {
2067
- return path7.join(rootPath, this.database + ".db");
2156
+ return path8.join(rootPath, this.database + ".db");
2068
2157
  }
2069
2158
  /** QueryEngine sqlite apuntando al archivo interno, con config explícito
2070
2159
  * (no vive en dbcube.config.js). La ruta relativa `.dbcube/<db>` deja que
2071
2160
  * QueryEngine le añada `.db` → `.dbcube/<db>.db`, relativo al CWD. */
2072
2161
  getEngine() {
2073
2162
  if (!this.engine) {
2074
- const relativeDb = path7.join(".dbcube", this.database).replace(/\\/g, "/");
2163
+ const relativeDb = path8.join(".dbcube", this.database).replace(/\\/g, "/");
2075
2164
  this.engine = new QueryEngine(`dbcube-internal-${this.database}`, 3e4, {
2076
2165
  type: "sqlite",
2077
2166
  config: { DATABASE: relativeDb }
@@ -2203,8 +2292,8 @@ var DbConfig = new SQLite({ DATABASE: "config" });
2203
2292
  var DbConfig_default = DbConfig;
2204
2293
 
2205
2294
  // src/lib/FileLogger.ts
2206
- var fs6 = __toESM(require("fs"));
2207
- var path8 = __toESM(require("path"));
2295
+ var fs9 = __toESM(require("fs"));
2296
+ var path9 = __toESM(require("path"));
2208
2297
  var import_events = require("events");
2209
2298
  var FileLogger = class _FileLogger extends import_events.EventEmitter {
2210
2299
  static watchers = /* @__PURE__ */ new Map();
@@ -2219,9 +2308,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2219
2308
  */
2220
2309
  static async write(filePath, message, level = "INFO", append = true) {
2221
2310
  try {
2222
- const dir = path8.dirname(filePath);
2223
- if (!fs6.existsSync(dir)) {
2224
- fs6.mkdirSync(dir, { recursive: true });
2311
+ const dir = path9.dirname(filePath);
2312
+ if (!fs9.existsSync(dir)) {
2313
+ fs9.mkdirSync(dir, { recursive: true });
2225
2314
  }
2226
2315
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
2227
2316
  const formattedMessage = `[${timestamp}] [${level}] ${message}
@@ -2231,9 +2320,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2231
2320
  return true;
2232
2321
  }
2233
2322
  if (append) {
2234
- await fs6.promises.appendFile(filePath, formattedMessage, "utf8");
2323
+ await fs9.promises.appendFile(filePath, formattedMessage, "utf8");
2235
2324
  } else {
2236
- await fs6.promises.writeFile(filePath, formattedMessage, "utf8");
2325
+ await fs9.promises.writeFile(filePath, formattedMessage, "utf8");
2237
2326
  }
2238
2327
  return true;
2239
2328
  } catch (error) {
@@ -2258,12 +2347,12 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2258
2347
  const buffer = _FileLogger.buffers.get(filePath);
2259
2348
  if (buffer && buffer.length > 0) {
2260
2349
  try {
2261
- const dir = path8.dirname(filePath);
2262
- if (!fs6.existsSync(dir)) {
2263
- fs6.mkdirSync(dir, { recursive: true });
2350
+ const dir = path9.dirname(filePath);
2351
+ if (!fs9.existsSync(dir)) {
2352
+ fs9.mkdirSync(dir, { recursive: true });
2264
2353
  }
2265
2354
  const content = buffer.join("");
2266
- await fs6.promises.appendFile(filePath, content, "utf8");
2355
+ await fs9.promises.appendFile(filePath, content, "utf8");
2267
2356
  _FileLogger.buffers.delete(filePath);
2268
2357
  return true;
2269
2358
  } catch (error) {
@@ -2399,10 +2488,10 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2399
2488
  // Si debe retornar como array de líneas
2400
2489
  } = options;
2401
2490
  try {
2402
- if (!fs6.existsSync(filePath)) {
2491
+ if (!fs9.existsSync(filePath)) {
2403
2492
  return asArray ? [] : "";
2404
2493
  }
2405
- let content = await fs6.promises.readFile(filePath, "utf8");
2494
+ let content = await fs9.promises.readFile(filePath, "utf8");
2406
2495
  if (asArray) {
2407
2496
  let linesArray = content.split("\n").filter((line) => line.trim() !== "");
2408
2497
  if (lines !== null) {
@@ -2445,15 +2534,15 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2445
2534
  } = options;
2446
2535
  let lastSize = 0;
2447
2536
  let lastPosition = 0;
2448
- if (fs6.existsSync(filePath)) {
2449
- const stats = fs6.statSync(filePath);
2537
+ if (fs9.existsSync(filePath)) {
2538
+ const stats = fs9.statSync(filePath);
2450
2539
  lastSize = stats.size;
2451
2540
  lastPosition = fromEnd ? stats.size : 0;
2452
2541
  }
2453
2542
  const listener = async (curr, prev) => {
2454
2543
  try {
2455
2544
  if (curr.size > lastSize) {
2456
- const stream = fs6.createReadStream(filePath, {
2545
+ const stream = fs9.createReadStream(filePath, {
2457
2546
  start: lastPosition,
2458
2547
  end: curr.size - 1,
2459
2548
  encoding: "utf8"
@@ -2481,7 +2570,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2481
2570
  console.error("Error en watcher:", error);
2482
2571
  }
2483
2572
  };
2484
- fs6.watchFile(filePath, { persistent, interval }, listener);
2573
+ fs9.watchFile(filePath, { persistent, interval }, listener);
2485
2574
  const watcherId = `${filePath}_${Date.now()}`;
2486
2575
  _FileLogger.watchers.set(watcherId, listener);
2487
2576
  return {
@@ -2489,7 +2578,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2489
2578
  stop: () => {
2490
2579
  const storedListener = _FileLogger.watchers.get(watcherId);
2491
2580
  if (storedListener) {
2492
- fs6.unwatchFile(filePath, storedListener);
2581
+ fs9.unwatchFile(filePath, storedListener);
2493
2582
  _FileLogger.watchers.delete(watcherId);
2494
2583
  }
2495
2584
  },
@@ -2502,7 +2591,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2502
2591
  static stopAllWatchers() {
2503
2592
  for (const [watcherId] of _FileLogger.watchers) {
2504
2593
  const filePath = watcherId.split("_")[0];
2505
- fs6.unwatchFile(filePath);
2594
+ fs9.unwatchFile(filePath);
2506
2595
  }
2507
2596
  _FileLogger.watchers.clear();
2508
2597
  }
@@ -2532,7 +2621,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2532
2621
  if (lines.length > maxLines) {
2533
2622
  const keepLines = lines.slice(-maxLines);
2534
2623
  const content = keepLines.join("\n") + "\n";
2535
- await fs6.promises.writeFile(filePath, content, "utf8");
2624
+ await fs9.promises.writeFile(filePath, content, "utf8");
2536
2625
  return lines.length - maxLines;
2537
2626
  }
2538
2627
  return 0;
@@ -2547,8 +2636,8 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
2547
2636
  */
2548
2637
  static async deleteLogFile(filePath) {
2549
2638
  try {
2550
- if (fs6.existsSync(filePath)) {
2551
- await fs6.promises.unlink(filePath);
2639
+ if (fs9.existsSync(filePath)) {
2640
+ await fs9.promises.unlink(filePath);
2552
2641
  return true;
2553
2642
  }
2554
2643
  return false;
@@ -2964,6 +3053,7 @@ function convertToType(value, type2) {
2964
3053
  DaemonClient,
2965
3054
  DbConfig,
2966
3055
  Engine,
3056
+ EnvLoader,
2967
3057
  FileLogger,
2968
3058
  QueryEngine,
2969
3059
  TableProcessor,