@adviser/cement 0.2.15 → 0.2.17

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/index.cjs CHANGED
@@ -77,6 +77,7 @@ __export(src_exports, {
77
77
  BrowserEnvActions: () => BrowserEnvActions,
78
78
  BuildURI: () => BuildURI,
79
79
  EnvImpl: () => EnvImpl,
80
+ FanoutWriter: () => FanoutWriter,
80
81
  Future: () => Future,
81
82
  IDMode: () => IDMode,
82
83
  IsLogger: () => IsLogger,
@@ -87,7 +88,8 @@ __export(src_exports, {
87
88
  LevelHandlerImpl: () => LevelHandlerImpl,
88
89
  LogCollector: () => LogCollector,
89
90
  LogValue: () => LogValue,
90
- LogWriter: () => LogWriter,
91
+ LogWriterCollector: () => LogWriterCollector,
92
+ LogWriterStream: () => LogWriterStream,
91
93
  LoggerImpl: () => LoggerImpl,
92
94
  MockLogger: () => MockLogger,
93
95
  None: () => None,
@@ -1024,12 +1026,36 @@ var URI = class _URI {
1024
1026
  }
1025
1027
  };
1026
1028
 
1029
+ // src/runtime.ts
1030
+ function isSet(value, ref = globalThis) {
1031
+ const [head, ...tail] = value.split(".");
1032
+ if (["object", "function"].includes(typeof ref) && ref && ["object", "function"].includes(typeof ref[head]) && ref[head]) {
1033
+ if (tail.length <= 1) {
1034
+ return true;
1035
+ }
1036
+ return isSet(tail.join("."), ref[head]);
1037
+ }
1038
+ return false;
1039
+ }
1040
+ function runtimeFn() {
1041
+ const isReactNative = isSet("navigator.product") && globalThis.navigator.product === "ReactNative";
1042
+ const isNodeIsh = isSet("process.versions.node") && !isReactNative;
1043
+ const isDeno = isSet("Deno") && !isReactNative;
1044
+ return {
1045
+ isNodeIsh,
1046
+ isBrowser: !(isNodeIsh || isDeno) && !isReactNative,
1047
+ isDeno,
1048
+ isReactNative
1049
+ };
1050
+ }
1051
+
1027
1052
  // src/logger_impl.ts
1028
1053
  var encoder = new TextEncoder();
1029
1054
  var LevelHandlerImpl = class {
1030
1055
  constructor() {
1031
1056
  this._globalLevels = /* @__PURE__ */ new Set(["info" /* INFO */, "error" /* ERROR */, "warn" /* WARN */]);
1032
1057
  this._modules = /* @__PURE__ */ new Map();
1058
+ this.isStackExposed = false;
1033
1059
  }
1034
1060
  enableLevel(level, ...modules) {
1035
1061
  if (modules.length == 0) {
@@ -1057,6 +1083,9 @@ var LevelHandlerImpl = class {
1057
1083
  ...modules
1058
1084
  );
1059
1085
  }
1086
+ setExposeStack(enable) {
1087
+ this.isStackExposed = !!enable;
1088
+ }
1060
1089
  forModules(level, fnAction, ...modules) {
1061
1090
  for (const m of modules.flat()) {
1062
1091
  if (typeof m !== "string") {
@@ -1098,7 +1127,7 @@ var LevelHandlerImpl = class {
1098
1127
  }
1099
1128
  };
1100
1129
  var levelSingleton = new LevelHandlerImpl();
1101
- var LogWriter = class {
1130
+ var LogWriterStream = class {
1102
1131
  constructor(out) {
1103
1132
  this._toFlush = [];
1104
1133
  this._flushIsRunning = false;
@@ -1164,6 +1193,68 @@ function toLogValue(lop) {
1164
1193
  }
1165
1194
  return lop;
1166
1195
  }
1196
+ var ConsoleWriterStreamDefaultWriter = class {
1197
+ constructor(stream) {
1198
+ this.stream = stream;
1199
+ this.desiredSize = null;
1200
+ this.decoder = new TextDecoder();
1201
+ this._stream = stream;
1202
+ this.ready = Promise.resolve(void 0);
1203
+ this.closed = Promise.resolve(void 0);
1204
+ }
1205
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
1206
+ abort(reason) {
1207
+ throw new Error("Method not implemented.");
1208
+ }
1209
+ async close() {
1210
+ }
1211
+ releaseLock() {
1212
+ this._stream.locked = false;
1213
+ this.ready = Promise.resolve(void 0);
1214
+ this.closed = Promise.resolve(void 0);
1215
+ }
1216
+ async write(chunk) {
1217
+ const str = this.decoder.decode(chunk).trimEnd();
1218
+ let output = "log";
1219
+ try {
1220
+ const decode = JSON.parse(str);
1221
+ output = decode.level;
1222
+ } catch (e) {
1223
+ }
1224
+ switch (output) {
1225
+ case "error":
1226
+ console.error(str);
1227
+ break;
1228
+ case "warn":
1229
+ console.warn(str);
1230
+ break;
1231
+ default:
1232
+ console.log(str);
1233
+ }
1234
+ }
1235
+ };
1236
+ var ConsoleWriterStream = class {
1237
+ constructor() {
1238
+ this.locked = false;
1239
+ }
1240
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
1241
+ abort(reason) {
1242
+ throw new Error("Method not implemented.");
1243
+ }
1244
+ async close() {
1245
+ return;
1246
+ }
1247
+ getWriter() {
1248
+ if (this.locked) {
1249
+ throw new Error("Stream is locked");
1250
+ }
1251
+ this.locked = true;
1252
+ if (!this._writer) {
1253
+ this._writer = new ConsoleWriterStreamDefaultWriter(this);
1254
+ }
1255
+ return this._writer;
1256
+ }
1257
+ };
1167
1258
  var LoggerImpl = class _LoggerImpl {
1168
1259
  // readonly _id: string = "logger-" + Math.random().toString(36)
1169
1260
  constructor(params) {
@@ -1180,9 +1271,20 @@ var LoggerImpl = class _LoggerImpl {
1180
1271
  this._logWriter = params.logWriter;
1181
1272
  } else {
1182
1273
  if (!params.out) {
1183
- this._logWriter = new LogWriter(this._sys.Stdout());
1274
+ const rt = runtimeFn();
1275
+ let stream;
1276
+ if (rt.isBrowser) {
1277
+ stream = new ConsoleWriterStream();
1278
+ } else {
1279
+ if (rt.isNodeIsh || rt.isReactNative) {
1280
+ stream = this._sys.Stdout();
1281
+ } else {
1282
+ throw new Error("No output defined for runtime");
1283
+ }
1284
+ }
1285
+ this._logWriter = new LogWriterStream(stream);
1184
1286
  } else {
1185
- this._logWriter = new LogWriter(params.out);
1287
+ this._logWriter = new LogWriterStream(params.out);
1186
1288
  }
1187
1289
  }
1188
1290
  if (!params.withAttributes) {
@@ -1197,6 +1299,10 @@ var LoggerImpl = class _LoggerImpl {
1197
1299
  this._levelHandler = levelSingleton;
1198
1300
  }
1199
1301
  }
1302
+ SetExposeStack(enable) {
1303
+ this._levelHandler.setExposeStack(enable);
1304
+ return this;
1305
+ }
1200
1306
  EnableLevel(level, ...modules) {
1201
1307
  this._levelHandler.enableLevel(level, ...modules);
1202
1308
  return this;
@@ -1239,8 +1345,12 @@ var LoggerImpl = class _LoggerImpl {
1239
1345
  return this;
1240
1346
  }
1241
1347
  Err(err) {
1348
+ var _a;
1242
1349
  if (err instanceof Error) {
1243
1350
  this._attributes["error"] = logValue(err.message);
1351
+ if (this._levelHandler.isStackExposed) {
1352
+ this._attributes["stack"] = logValue((_a = err.stack) == null ? void 0 : _a.split("\n").map((s) => s.trim()));
1353
+ }
1244
1354
  } else {
1245
1355
  this._attributes["error"] = logValue("" + err);
1246
1356
  }
@@ -1372,6 +1482,10 @@ var WithLoggerBuilder = class {
1372
1482
  Object.assign(this._li._withAttributes, this._li._attributes);
1373
1483
  return this._li;
1374
1484
  }
1485
+ SetExposeStack(enable) {
1486
+ this._li._levelHandler.setExposeStack(enable);
1487
+ return this;
1488
+ }
1375
1489
  EnableLevel(level, ...modules) {
1376
1490
  this._li._levelHandler.enableLevel(level, ...modules);
1377
1491
  return this;
@@ -1467,37 +1581,60 @@ var WithLoggerBuilder = class {
1467
1581
  };
1468
1582
 
1469
1583
  // src/test/log_collector.ts
1470
- var LogWriter2 = class {
1471
- constructor() {
1472
- this._bufferArr = [];
1584
+ var LogWriterCollector = class {
1585
+ constructor(bufferArr) {
1586
+ this._resolveClosed = new Future();
1587
+ this.closed = this._resolveClosed.asPromise();
1473
1588
  this.desiredSize = null;
1474
1589
  this.ready = Promise.resolve(void 0);
1475
- this._resolveClosed = () => {
1476
- };
1477
- this.closed = new Promise((resolve) => {
1478
- this._resolveClosed = resolve;
1479
- });
1590
+ this._bufferArr = bufferArr;
1480
1591
  }
1481
1592
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
1482
1593
  abort(reason) {
1483
1594
  throw new Error("Method not implemented.");
1484
1595
  }
1485
- close() {
1486
- this._resolveClosed();
1596
+ async close() {
1597
+ await this.closed;
1487
1598
  return Promise.resolve(void 0);
1488
1599
  }
1489
1600
  releaseLock() {
1490
1601
  }
1491
- write(chunk) {
1602
+ async write(chunk) {
1492
1603
  if (chunk) {
1493
1604
  this._bufferArr.push(chunk);
1494
1605
  }
1495
1606
  return Promise.resolve(void 0);
1496
1607
  }
1497
1608
  };
1609
+ var FanoutWriter = class {
1610
+ constructor(writers) {
1611
+ this.desiredSize = null;
1612
+ this._writers = writers;
1613
+ this.ready = Promise.all(this._writers.map((w) => w.ready)).then(() => void 0);
1614
+ this.closed = Promise.all(this._writers.map((w) => w.closed)).then(() => void 0);
1615
+ }
1616
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1617
+ abort(reason) {
1618
+ return Promise.all(this._writers.map((w) => w.abort(reason))).then(() => {
1619
+ });
1620
+ }
1621
+ close() {
1622
+ return Promise.all(this._writers.map((w) => w.close())).then(() => {
1623
+ });
1624
+ }
1625
+ releaseLock() {
1626
+ this._writers.map((w) => w.releaseLock());
1627
+ }
1628
+ write(chunk) {
1629
+ return Promise.all(this._writers.map((w) => w.write(chunk))).then(() => {
1630
+ });
1631
+ }
1632
+ };
1498
1633
  var LogCollector = class {
1499
- constructor() {
1634
+ constructor(pass) {
1500
1635
  this.locked = false;
1636
+ this._bufferArr = [];
1637
+ this._pass = pass;
1501
1638
  }
1502
1639
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1503
1640
  abort(reason) {
@@ -1513,7 +1650,11 @@ var LogCollector = class {
1513
1650
  }
1514
1651
  getWriter() {
1515
1652
  if (!this._writer) {
1516
- this._writer = new LogWriter2();
1653
+ const dests = [new LogWriterCollector(this._bufferArr)];
1654
+ if (this._pass) {
1655
+ dests.push(this._pass);
1656
+ }
1657
+ this._writer = new FanoutWriter(dests);
1517
1658
  }
1518
1659
  return this._writer;
1519
1660
  }
@@ -1528,7 +1669,7 @@ var LogCollector = class {
1528
1669
  for (const x of res) {
1529
1670
  yield* __yieldStar(x);
1530
1671
  }
1531
- }(this._writer._bufferArr)
1672
+ }(this._bufferArr)
1532
1673
  )
1533
1674
  );
1534
1675
  const splitStr = jsonNlStr.split("\n");
@@ -1540,7 +1681,7 @@ var LogCollector = class {
1540
1681
 
1541
1682
  // src/test/mock_logger.ts
1542
1683
  function MockLogger(params) {
1543
- const lc = new LogCollector();
1684
+ const lc = new LogCollector(params == null ? void 0 : params.pass);
1544
1685
  let modNames = ["MockLogger"];
1545
1686
  if (typeof (params == null ? void 0 : params.moduleName) === "string") {
1546
1687
  modNames = [params == null ? void 0 : params.moduleName];
@@ -1683,29 +1824,6 @@ var None = class extends Option {
1683
1824
  }
1684
1825
  };
1685
1826
 
1686
- // src/runtime.ts
1687
- function isSet(value, ref = globalThis) {
1688
- const [head, ...tail] = value.split(".");
1689
- if (["object", "function"].includes(typeof ref) && ref && ["object", "function"].includes(typeof ref[head]) && ref[head]) {
1690
- if (tail.length <= 1) {
1691
- return true;
1692
- }
1693
- return isSet(tail.join("."), ref[head]);
1694
- }
1695
- return false;
1696
- }
1697
- function runtimeFn() {
1698
- const isReactNative = isSet("navigator.product") && globalThis.navigator.product === "ReactNative";
1699
- const isNodeIsh = isSet("process.versions.node") && !isReactNative;
1700
- const isDeno = isSet("Deno") && !isReactNative;
1701
- return {
1702
- isNodeIsh,
1703
- isBrowser: !(isNodeIsh || isDeno) && !isReactNative,
1704
- isDeno,
1705
- isReactNative
1706
- };
1707
- }
1708
-
1709
1827
  // src/crypto.ts
1710
1828
  function randomBytes(size) {
1711
1829
  const bytes = new Uint8Array(size);
@@ -1732,6 +1850,7 @@ function toCryptoRuntime(cryptoOpts = {}) {
1732
1850
  BrowserEnvActions,
1733
1851
  BuildURI,
1734
1852
  EnvImpl,
1853
+ FanoutWriter,
1735
1854
  Future,
1736
1855
  IDMode,
1737
1856
  IsLogger,
@@ -1742,7 +1861,8 @@ function toCryptoRuntime(cryptoOpts = {}) {
1742
1861
  LevelHandlerImpl,
1743
1862
  LogCollector,
1744
1863
  LogValue,
1745
- LogWriter,
1864
+ LogWriterCollector,
1865
+ LogWriterStream,
1746
1866
  LoggerImpl,
1747
1867
  MockLogger,
1748
1868
  None,