@cipherstash/stack 0.15.1 → 0.15.3

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.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Encryption
3
- } from "./chunk-YPAPL3IC.js";
3
+ } from "./chunk-46S3YFRK.js";
4
4
  import {
5
5
  encryptedToPgComposite,
6
6
  isEncryptedPayload
@@ -11,7 +11,7 @@ import {
11
11
  encryptedTable
12
12
  } from "./chunk-GNLU3I27.js";
13
13
  import "./chunk-MD6742R6.js";
14
- import "./chunk-Q5FTQLYG.js";
14
+ import "./chunk-6FD7OBGM.js";
15
15
  import "./chunk-LBMC4D6D.js";
16
16
  export {
17
17
  Encryption,
@@ -275,8 +275,305 @@ var EncryptedColumn = class {
275
275
  }
276
276
  };
277
277
 
278
+ // ../../node_modules/.pnpm/evlog@1.9.0/node_modules/evlog/dist/utils.mjs
279
+ function formatDuration(ms) {
280
+ if (ms < 1e3) return `${Math.round(ms)}ms`;
281
+ return `${(ms / 1e3).toFixed(2)}s`;
282
+ }
283
+ function isDev() {
284
+ if (typeof process !== "undefined") return process.env.NODE_ENV !== "production";
285
+ if (typeof window !== "undefined") return true;
286
+ return false;
287
+ }
288
+ function detectEnvironment() {
289
+ const env = typeof process !== "undefined" ? process.env : {};
290
+ const defaultEnvironment = isDev() ? "development" : "production";
291
+ return {
292
+ environment: env.NODE_ENV || defaultEnvironment,
293
+ service: env.SERVICE_NAME || "app",
294
+ version: env.APP_VERSION,
295
+ commitHash: env.COMMIT_SHA || env.GITHUB_SHA || env.VERCEL_GIT_COMMIT_SHA || env.CF_PAGES_COMMIT_SHA,
296
+ region: env.VERCEL_REGION || env.AWS_REGION || env.FLY_REGION || env.CF_REGION
297
+ };
298
+ }
299
+ function getConsoleMethod(level) {
300
+ return level;
301
+ }
302
+ var colors = {
303
+ reset: "\x1B[0m",
304
+ bold: "\x1B[1m",
305
+ dim: "\x1B[2m",
306
+ red: "\x1B[31m",
307
+ green: "\x1B[32m",
308
+ yellow: "\x1B[33m",
309
+ blue: "\x1B[34m",
310
+ magenta: "\x1B[35m",
311
+ cyan: "\x1B[36m",
312
+ white: "\x1B[37m",
313
+ gray: "\x1B[90m"
314
+ };
315
+ function getLevelColor(level) {
316
+ switch (level) {
317
+ case "error":
318
+ return colors.red;
319
+ case "warn":
320
+ return colors.yellow;
321
+ case "info":
322
+ return colors.cyan;
323
+ case "debug":
324
+ return colors.gray;
325
+ default:
326
+ return colors.white;
327
+ }
328
+ }
329
+ function matchesPattern(path, pattern) {
330
+ const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "{{GLOBSTAR}}").replace(/\*/g, "[^/]*").replace(/{{GLOBSTAR}}/g, ".*").replace(/\?/g, "[^/]");
331
+ return new RegExp(`^${regexPattern}$`).test(path);
332
+ }
333
+
334
+ // ../../node_modules/.pnpm/evlog@1.9.0/node_modules/evlog/dist/logger.mjs
335
+ function isPlainObject(val) {
336
+ return val !== null && typeof val === "object" && !Array.isArray(val);
337
+ }
338
+ function deepDefaults(base, defaults) {
339
+ const result = { ...base };
340
+ for (const key in defaults) {
341
+ const baseVal = result[key];
342
+ const defaultVal = defaults[key];
343
+ if (baseVal === void 0 || baseVal === null) result[key] = defaultVal;
344
+ else if (isPlainObject(baseVal) && isPlainObject(defaultVal)) result[key] = deepDefaults(baseVal, defaultVal);
345
+ }
346
+ return result;
347
+ }
348
+ var globalEnv = {
349
+ service: "app",
350
+ environment: "development"
351
+ };
352
+ var globalPretty = isDev();
353
+ var globalSampling = {};
354
+ var globalStringify = true;
355
+ var globalDrain;
356
+ var globalEnabled = true;
357
+ function initLogger(config = {}) {
358
+ globalEnabled = config.enabled ?? true;
359
+ const detected = detectEnvironment();
360
+ globalEnv = {
361
+ service: config.env?.service ?? detected.service ?? "app",
362
+ environment: config.env?.environment ?? detected.environment ?? "development",
363
+ version: config.env?.version ?? detected.version,
364
+ commitHash: config.env?.commitHash ?? detected.commitHash,
365
+ region: config.env?.region ?? detected.region
366
+ };
367
+ globalPretty = config.pretty ?? isDev();
368
+ globalSampling = config.sampling ?? {};
369
+ globalStringify = config.stringify ?? true;
370
+ globalDrain = config.drain;
371
+ }
372
+ function shouldSample(level) {
373
+ const { rates } = globalSampling;
374
+ if (!rates) return true;
375
+ const percentage = level === "error" && rates.error === void 0 ? 100 : rates[level] ?? 100;
376
+ if (percentage <= 0) return false;
377
+ if (percentage >= 100) return true;
378
+ return Math.random() * 100 < percentage;
379
+ }
380
+ function shouldKeep(ctx) {
381
+ const { keep } = globalSampling;
382
+ if (!keep?.length) return false;
383
+ return keep.some((condition) => {
384
+ if (condition.status !== void 0 && ctx.status !== void 0 && ctx.status >= condition.status) return true;
385
+ if (condition.duration !== void 0 && ctx.duration !== void 0 && ctx.duration >= condition.duration) return true;
386
+ if (condition.path && ctx.path && matchesPattern(ctx.path, condition.path)) return true;
387
+ return false;
388
+ });
389
+ }
390
+ function emitWideEvent(level, event, skipSamplingCheck = false) {
391
+ if (!globalEnabled) return null;
392
+ if (!skipSamplingCheck && !shouldSample(level)) return null;
393
+ const formatted = {
394
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
395
+ level,
396
+ ...globalEnv,
397
+ ...event
398
+ };
399
+ if (globalPretty) prettyPrintWideEvent(formatted);
400
+ else if (globalStringify) console[getConsoleMethod(level)](JSON.stringify(formatted));
401
+ else console[getConsoleMethod(level)](formatted);
402
+ if (globalDrain) Promise.resolve(globalDrain({ event: formatted })).catch((err) => {
403
+ console.error("[evlog] drain failed:", err);
404
+ });
405
+ return formatted;
406
+ }
407
+ function emitTaggedLog(level, tag, message) {
408
+ if (!globalEnabled) return;
409
+ if (globalPretty) {
410
+ if (!shouldSample(level)) return;
411
+ const color = getLevelColor(level);
412
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().slice(11, 23);
413
+ console.log(`${colors.dim}${timestamp}${colors.reset} ${color}[${tag}]${colors.reset} ${message}`);
414
+ return;
415
+ }
416
+ emitWideEvent(level, {
417
+ tag,
418
+ message
419
+ });
420
+ }
421
+ function formatValue(value) {
422
+ if (value === null || value === void 0) return String(value);
423
+ if (typeof value === "object") {
424
+ const pairs = [];
425
+ for (const [k, v] of Object.entries(value)) if (v !== void 0 && v !== null) if (typeof v === "object") pairs.push(`${k}=${JSON.stringify(v)}`);
426
+ else pairs.push(`${k}=${v}`);
427
+ return pairs.join(" ");
428
+ }
429
+ return String(value);
430
+ }
431
+ function prettyPrintWideEvent(event) {
432
+ const { timestamp, level, service, environment, version, ...rest } = event;
433
+ const levelColor = getLevelColor(level);
434
+ const ts = timestamp.slice(11, 23);
435
+ let header = `${colors.dim}${ts}${colors.reset} ${levelColor}${level.toUpperCase()}${colors.reset}`;
436
+ header += ` ${colors.cyan}[${service}]${colors.reset}`;
437
+ if (rest.method && rest.path) {
438
+ header += ` ${rest.method} ${rest.path}`;
439
+ delete rest.method;
440
+ delete rest.path;
441
+ }
442
+ if (rest.status) {
443
+ const statusColor = rest.status >= 400 ? colors.red : colors.green;
444
+ header += ` ${statusColor}${rest.status}${colors.reset}`;
445
+ delete rest.status;
446
+ }
447
+ if (rest.duration) {
448
+ header += ` ${colors.dim}in ${rest.duration}${colors.reset}`;
449
+ delete rest.duration;
450
+ }
451
+ console.log(header);
452
+ const entries = Object.entries(rest).filter(([_, v]) => v !== void 0);
453
+ const lastIndex = entries.length - 1;
454
+ entries.forEach(([key, value], index) => {
455
+ const prefix = index === lastIndex ? "\u2514\u2500" : "\u251C\u2500";
456
+ const formatted = formatValue(value);
457
+ console.log(` ${colors.dim}${prefix}${colors.reset} ${colors.cyan}${key}:${colors.reset} ${formatted}`);
458
+ });
459
+ }
460
+ function createLogMethod(level) {
461
+ return function logMethod(tagOrEvent, message) {
462
+ if (typeof tagOrEvent === "string" && message !== void 0) emitTaggedLog(level, tagOrEvent, message);
463
+ else if (typeof tagOrEvent === "object") emitWideEvent(level, tagOrEvent);
464
+ else emitTaggedLog(level, "log", String(tagOrEvent));
465
+ };
466
+ }
467
+ var _log = {
468
+ info: createLogMethod("info"),
469
+ error: createLogMethod("error"),
470
+ warn: createLogMethod("warn"),
471
+ debug: createLogMethod("debug")
472
+ };
473
+ var noopLogger = {
474
+ set() {
475
+ },
476
+ error() {
477
+ },
478
+ info() {
479
+ },
480
+ warn() {
481
+ },
482
+ emit() {
483
+ return null;
484
+ },
485
+ getContext() {
486
+ return {};
487
+ }
488
+ };
489
+ function createRequestLogger(options = {}) {
490
+ if (!globalEnabled) return noopLogger;
491
+ const startTime = Date.now();
492
+ let context = {
493
+ method: options.method,
494
+ path: options.path,
495
+ requestId: options.requestId
496
+ };
497
+ let hasError = false;
498
+ let hasWarn = false;
499
+ function addRequestLog(level, message) {
500
+ const entry = {
501
+ level,
502
+ message,
503
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
504
+ };
505
+ const requestLogs = Array.isArray(context.requestLogs) ? [...context.requestLogs, entry] : [entry];
506
+ context = {
507
+ ...context,
508
+ requestLogs
509
+ };
510
+ }
511
+ return {
512
+ set(data) {
513
+ context = deepDefaults(data, context);
514
+ },
515
+ error(error, errorContext) {
516
+ hasError = true;
517
+ const err = typeof error === "string" ? new Error(error) : error;
518
+ context = deepDefaults({
519
+ ...errorContext,
520
+ error: {
521
+ name: err.name,
522
+ message: err.message,
523
+ stack: err.stack,
524
+ ..."status" in err && { status: err.status },
525
+ ..."statusText" in err && { statusText: err.statusText },
526
+ ..."statusCode" in err && { statusCode: err.statusCode },
527
+ ..."statusMessage" in err && { statusMessage: err.statusMessage },
528
+ ..."data" in err && { data: err.data },
529
+ ..."cause" in err && { cause: err.cause }
530
+ }
531
+ }, context);
532
+ },
533
+ info(message, infoContext) {
534
+ addRequestLog("info", message);
535
+ if (infoContext) {
536
+ const { requestLogs: _, ...rest } = infoContext;
537
+ context = deepDefaults(rest, context);
538
+ }
539
+ },
540
+ warn(message, warnContext) {
541
+ hasWarn = true;
542
+ addRequestLog("warn", message);
543
+ if (warnContext) {
544
+ const { requestLogs: _, ...rest } = warnContext;
545
+ context = deepDefaults(rest, context);
546
+ }
547
+ },
548
+ emit(overrides) {
549
+ const durationMs = Date.now() - startTime;
550
+ const duration = formatDuration(durationMs);
551
+ const level = hasError ? "error" : hasWarn ? "warn" : "info";
552
+ const { _forceKeep, ...restOverrides } = overrides ?? {};
553
+ const tailCtx = {
554
+ status: context.status ?? restOverrides.status,
555
+ duration: durationMs,
556
+ path: context.path,
557
+ method: context.method,
558
+ context: {
559
+ ...context,
560
+ ...restOverrides
561
+ }
562
+ };
563
+ if (!(_forceKeep || shouldKeep(tailCtx)) && !shouldSample(level)) return null;
564
+ return emitWideEvent(level, {
565
+ ...context,
566
+ ...restOverrides,
567
+ duration
568
+ }, true);
569
+ },
570
+ getContext() {
571
+ return { ...context };
572
+ }
573
+ };
574
+ }
575
+
278
576
  // src/utils/logger/index.ts
279
- var import_evlog = require("evlog");
280
577
  var validLevels = ["debug", "info", "error"];
281
578
  function levelFromEnv() {
282
579
  const env = process.env.STASH_STACK_LOG;
@@ -300,7 +597,7 @@ function initStackLogger() {
300
597
  initialized = true;
301
598
  const level = levelFromEnv();
302
599
  const rates = samplingRatesForLevel(level);
303
- (0, import_evlog.initLogger)({
600
+ initLogger({
304
601
  env: { service: "@cipherstash/stack" },
305
602
  enabled: true,
306
603
  sampling: { rates }
@@ -312,7 +609,7 @@ function safeMessage(args) {
312
609
  }
313
610
  var logger = {
314
611
  debug(...args) {
315
- const log = (0, import_evlog.createRequestLogger)();
612
+ const log = createRequestLogger();
316
613
  log.set({
317
614
  level: "debug",
318
615
  source: "@cipherstash/stack",
@@ -321,18 +618,18 @@ var logger = {
321
618
  log.emit();
322
619
  },
323
620
  info(...args) {
324
- const log = (0, import_evlog.createRequestLogger)();
621
+ const log = createRequestLogger();
325
622
  log.set({ source: "@cipherstash/stack" });
326
623
  log.info(safeMessage(args));
327
624
  log.emit();
328
625
  },
329
626
  warn(...args) {
330
- const log = (0, import_evlog.createRequestLogger)();
627
+ const log = createRequestLogger();
331
628
  log.warn(safeMessage(args));
332
629
  log.emit();
333
630
  },
334
631
  error(...args) {
335
- const log = (0, import_evlog.createRequestLogger)();
632
+ const log = createRequestLogger();
336
633
  log.error(safeMessage(args));
337
634
  log.emit();
338
635
  }