@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/CHANGELOG.md +12 -0
- package/README.md +19 -19
- package/dist/{chunk-YPAPL3IC.js → chunk-46S3YFRK.js} +2 -2
- package/dist/chunk-6FD7OBGM.js +365 -0
- package/dist/chunk-6FD7OBGM.js.map +1 -0
- package/dist/dynamodb/index.cjs +303 -6
- package/dist/dynamodb/index.cjs.map +1 -1
- package/dist/dynamodb/index.js +1 -1
- package/dist/encryption/index.cjs +323 -26
- package/dist/encryption/index.cjs.map +1 -1
- package/dist/encryption/index.js +2 -2
- package/dist/identity/index.cjs +303 -6
- package/dist/identity/index.cjs.map +1 -1
- package/dist/identity/index.js +1 -1
- package/dist/index.cjs +323 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/supabase/index.cjs +303 -6
- package/dist/supabase/index.cjs.map +1 -1
- package/dist/supabase/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-Q5FTQLYG.js +0 -68
- package/dist/chunk-Q5FTQLYG.js.map +0 -1
- /package/dist/{chunk-YPAPL3IC.js.map → chunk-46S3YFRK.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Encryption
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
14
|
+
import "./chunk-6FD7OBGM.js";
|
|
15
15
|
import "./chunk-LBMC4D6D.js";
|
|
16
16
|
export {
|
|
17
17
|
Encryption,
|
package/dist/supabase/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
627
|
+
const log = createRequestLogger();
|
|
331
628
|
log.warn(safeMessage(args));
|
|
332
629
|
log.emit();
|
|
333
630
|
},
|
|
334
631
|
error(...args) {
|
|
335
|
-
const log =
|
|
632
|
+
const log = createRequestLogger();
|
|
336
633
|
log.error(safeMessage(args));
|
|
337
634
|
log.emit();
|
|
338
635
|
}
|