@dasasian/firebase-structured-logger 1.1.0 → 1.3.0-rc.0

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.
Files changed (45) hide show
  1. package/README.md +202 -33
  2. package/dist/client/breadcrumbs.d.ts +35 -6
  3. package/dist/client/breadcrumbs.d.ts.map +1 -1
  4. package/dist/client/breadcrumbs.js +87 -10
  5. package/dist/client/breadcrumbs.js.map +1 -1
  6. package/dist/client/logger.d.ts.map +1 -1
  7. package/dist/client/logger.js +2 -7
  8. package/dist/client/logger.js.map +1 -1
  9. package/dist/client/navigation/adapterShared.d.ts +18 -0
  10. package/dist/client/navigation/adapterShared.d.ts.map +1 -0
  11. package/dist/client/navigation/adapterShared.js +49 -0
  12. package/dist/client/navigation/adapterShared.js.map +1 -0
  13. package/dist/client/navigation/react-router.d.ts +30 -0
  14. package/dist/client/navigation/react-router.d.ts.map +1 -0
  15. package/dist/client/navigation/react-router.js +57 -0
  16. package/dist/client/navigation/react-router.js.map +1 -0
  17. package/dist/client/navigation/vue-router.d.ts +28 -0
  18. package/dist/client/navigation/vue-router.d.ts.map +1 -0
  19. package/dist/client/navigation/vue-router.js +47 -0
  20. package/dist/client/navigation/vue-router.js.map +1 -0
  21. package/dist/client/navigation.d.ts +29 -4
  22. package/dist/client/navigation.d.ts.map +1 -1
  23. package/dist/client/navigation.js +60 -4
  24. package/dist/client/navigation.js.map +1 -1
  25. package/dist/client/timing.d.ts +20 -0
  26. package/dist/client/timing.d.ts.map +1 -0
  27. package/dist/client/timing.js +133 -0
  28. package/dist/client/timing.js.map +1 -0
  29. package/dist/functions/index.d.ts +2 -0
  30. package/dist/functions/index.d.ts.map +1 -1
  31. package/dist/functions/index.js +5 -1
  32. package/dist/functions/index.js.map +1 -1
  33. package/dist/functions/trace.d.ts +13 -0
  34. package/dist/functions/trace.d.ts.map +1 -0
  35. package/dist/functions/trace.js +68 -0
  36. package/dist/functions/trace.js.map +1 -0
  37. package/dist/shared/trace.d.ts +59 -0
  38. package/dist/shared/trace.d.ts.map +1 -0
  39. package/dist/shared/trace.js +131 -0
  40. package/dist/shared/trace.js.map +1 -0
  41. package/dist/shared/types.d.ts +14 -9
  42. package/dist/shared/types.d.ts.map +1 -1
  43. package/package.json +31 -4
  44. package/skills/logs/SKILL.md +20 -13
  45. package/skills/query-logs/SKILL.md +5 -1
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureTraces = configureTraces;
4
+ exports.startTrace = startTrace;
5
+ exports.trace = trace;
6
+ const logger_1 = require("./logger");
7
+ const trace_1 = require("../shared/trace");
8
+ function newPageLocalRunId() {
9
+ return `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;
10
+ }
11
+ let config = {};
12
+ /** Replaces every limit. Read when a run starts, so configure before the first one. */
13
+ function configureTraces(newConfig) {
14
+ config = newConfig;
15
+ }
16
+ const WATCHDOG_INTERVAL_MS = 1000;
17
+ const LATE_THRESHOLD_MS = 5000;
18
+ const activeRuns = new Set();
19
+ let watchdogId;
20
+ let visibilityWired = false;
21
+ let lastTickAt;
22
+ function now() {
23
+ return performance.now();
24
+ }
25
+ function markName(run, step, kind) {
26
+ return `fsl:${run.name}:${run.run}:${step}:${kind}`;
27
+ }
28
+ function disqualifyActiveRuns() {
29
+ for (const active of activeRuns)
30
+ active.disqualified = true;
31
+ }
32
+ function onVisibilityChange() {
33
+ if (document.visibilityState === 'hidden')
34
+ disqualifyActiveRuns();
35
+ }
36
+ /** No-op outside a browser (Node, SSR) — nothing there can ever go hidden. */
37
+ function wireVisibility() {
38
+ if (visibilityWired)
39
+ return;
40
+ visibilityWired = true;
41
+ if (typeof document === 'undefined')
42
+ return;
43
+ document.addEventListener('visibilitychange', onVisibilityChange);
44
+ }
45
+ function reportRun(run, report) {
46
+ (0, logger_1.getClientLogger)().warning((0, trace_1.traceMessage)(run.name, report), (0, trace_1.traceLabels)(run.name, run.run, report), (0, trace_1.traceContext)(report));
47
+ }
48
+ function tick() {
49
+ const nowMs = Date.now();
50
+ const late = lastTickAt !== undefined && nowMs - lastTickAt - WATCHDOG_INTERVAL_MS >= LATE_THRESHOLD_MS;
51
+ lastTickAt = nowMs;
52
+ if (late)
53
+ disqualifyActiveRuns();
54
+ for (const active of activeRuns) {
55
+ if (active.disqualified || active.run.hasReported)
56
+ continue;
57
+ const report = active.run.check();
58
+ if (!report)
59
+ continue;
60
+ active.run.markReported();
61
+ reportRun(active.run, report);
62
+ }
63
+ }
64
+ function ensureWatchdog() {
65
+ wireVisibility();
66
+ if (watchdogId !== undefined)
67
+ return;
68
+ lastTickAt = Date.now();
69
+ watchdogId = setInterval(tick, WATCHDOG_INTERVAL_MS);
70
+ }
71
+ function stopWatchdogIfIdle() {
72
+ if (activeRuns.size > 0 || watchdogId === undefined)
73
+ return;
74
+ clearInterval(watchdogId);
75
+ watchdogId = undefined;
76
+ }
77
+ async function runStep(run, active, name, fn) {
78
+ if (run.isEnded)
79
+ return fn();
80
+ const startMark = markName(run, name, 'start');
81
+ const endMark = markName(run, name, 'end');
82
+ const measureName = markName(run, name, 'measure');
83
+ active.marks.push(startMark, endMark);
84
+ active.measures.push(measureName);
85
+ performance.mark(startMark);
86
+ run.startStep(name);
87
+ try {
88
+ return await fn();
89
+ }
90
+ finally {
91
+ run.endStep(name);
92
+ performance.mark(endMark);
93
+ performance.measure(measureName, startMark, endMark);
94
+ }
95
+ }
96
+ function endRun(run, active) {
97
+ if (run.isEnded)
98
+ return;
99
+ run.end();
100
+ for (const mark of active.marks)
101
+ performance.clearMarks(mark);
102
+ for (const measure of active.measures)
103
+ performance.clearMeasures(measure);
104
+ activeRuns.delete(active);
105
+ stopWatchdogIfIdle();
106
+ }
107
+ function startRun(name) {
108
+ const run = new trace_1.TraceRun(name, config[name], now, newPageLocalRunId());
109
+ const active = { run, disqualified: false, marks: [], measures: [] };
110
+ if (config[name]) {
111
+ activeRuns.add(active);
112
+ ensureWatchdog();
113
+ }
114
+ return {
115
+ step: (stepName, fn) => runStep(run, active, stepName, fn),
116
+ end: () => endRun(run, active),
117
+ };
118
+ }
119
+ /** `startTrace(name)` returns the object; call `.end()` when the flow is over. */
120
+ function startTrace(name) {
121
+ return startRun(name);
122
+ }
123
+ /** Runs `fn` with a trace object and ends the trace when `fn` settles, either way. */
124
+ async function trace(name, fn) {
125
+ const handle = startRun(name);
126
+ try {
127
+ return await fn(handle);
128
+ }
129
+ finally {
130
+ handle.end();
131
+ }
132
+ }
133
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/client/timing.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export { initLogger } from './logger';
3
3
  export type { LogWriter } from './logger';
4
4
  export { withLogging, getLogger } from './requestLogger';
5
5
  export { configureAttachments } from './sourceMapCache';
6
+ export { trace, startTrace, configureTraces } from './trace';
7
+ export type { Trace, TraceConfig, TraceLimits } from './trace';
6
8
  export { createClientLogHandler, createClientLogFunction, ClientLogError } from './logHandler';
7
9
  export { createHttpLogHandler } from './httpHandler';
8
10
  export type { ClientLogHandlerConfig, ClientLogRequest, LogRequest } from './logHandler';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACxF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC1F,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE1E,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA;AACrG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAG,IAAoC,CAAA;AACxG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAG,IAAiC,CAAA;AAClG,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC5D,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACxF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC1F,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE1E,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA;AACrG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAG,IAAoC,CAAA;AACxG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAG,IAAiC,CAAA;AAClG,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.logDebug = exports.logInfo = exports.logWarn = exports.logError = exports.createHttpLogHandler = exports.ClientLogError = exports.createClientLogFunction = exports.createClientLogHandler = exports.configureAttachments = exports.getLogger = exports.withLogging = exports.initLogger = void 0;
3
+ exports.logDebug = exports.logInfo = exports.logWarn = exports.logError = exports.createHttpLogHandler = exports.ClientLogError = exports.createClientLogFunction = exports.createClientLogHandler = exports.configureTraces = exports.startTrace = exports.trace = exports.configureAttachments = exports.getLogger = exports.withLogging = exports.initLogger = void 0;
4
4
  const requestLogger_1 = require("./requestLogger");
5
5
  var logger_1 = require("./logger");
6
6
  Object.defineProperty(exports, "initLogger", { enumerable: true, get: function () { return logger_1.initLogger; } });
@@ -9,6 +9,10 @@ Object.defineProperty(exports, "withLogging", { enumerable: true, get: function
9
9
  Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return requestLogger_2.getLogger; } });
10
10
  var sourceMapCache_1 = require("./sourceMapCache");
11
11
  Object.defineProperty(exports, "configureAttachments", { enumerable: true, get: function () { return sourceMapCache_1.configureAttachments; } });
12
+ var trace_1 = require("./trace");
13
+ Object.defineProperty(exports, "trace", { enumerable: true, get: function () { return trace_1.trace; } });
14
+ Object.defineProperty(exports, "startTrace", { enumerable: true, get: function () { return trace_1.startTrace; } });
15
+ Object.defineProperty(exports, "configureTraces", { enumerable: true, get: function () { return trace_1.configureTraces; } });
12
16
  var logHandler_1 = require("./logHandler");
13
17
  Object.defineProperty(exports, "createClientLogHandler", { enumerable: true, get: function () { return logHandler_1.createClientLogHandler; } });
14
18
  Object.defineProperty(exports, "createClientLogFunction", { enumerable: true, get: function () { return logHandler_1.createClientLogFunction; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA2C;AAG3C,mCAAqC;AAA5B,oGAAA,UAAU,OAAA;AAEnB,iDAAwD;AAA/C,4GAAA,WAAW,OAAA;AAAE,0GAAA,SAAS,OAAA;AAC/B,mDAAuD;AAA9C,sHAAA,oBAAoB,OAAA;AAC7B,2CAA8F;AAArF,oHAAA,sBAAsB,OAAA;AAAE,qHAAA,uBAAuB,OAAA;AAAE,4GAAA,cAAc,OAAA;AACxE,6CAAoD;AAA3C,mHAAA,oBAAoB,OAAA;AAKtB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF;AAC9F,MAAM,OAAO,GAAG,CAAC,GAAG,IAAsC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAA3F,QAAA,OAAO,WAAoF;AACjG,MAAM,OAAO,GAAG,CAAC,GAAG,IAAmC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAArF,QAAA,OAAO,WAA8E;AAC3F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA2C;AAG3C,mCAAqC;AAA5B,oGAAA,UAAU,OAAA;AAEnB,iDAAwD;AAA/C,4GAAA,WAAW,OAAA;AAAE,0GAAA,SAAS,OAAA;AAC/B,mDAAuD;AAA9C,sHAAA,oBAAoB,OAAA;AAC7B,iCAA4D;AAAnD,8FAAA,KAAK,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,wGAAA,eAAe,OAAA;AAE3C,2CAA8F;AAArF,oHAAA,sBAAsB,OAAA;AAAE,qHAAA,uBAAuB,OAAA;AAAE,4GAAA,cAAc,OAAA;AACxE,6CAAoD;AAA3C,mHAAA,oBAAoB,OAAA;AAKtB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF;AAC9F,MAAM,OAAO,GAAG,CAAC,GAAG,IAAsC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAA3F,QAAA,OAAO,WAAoF;AACjG,MAAM,OAAO,GAAG,CAAC,GAAG,IAAmC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAArF,QAAA,OAAO,WAA8E;AAC3F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF"}
@@ -0,0 +1,13 @@
1
+ import { type TraceConfig } from '../shared/trace';
2
+ export type { TraceConfig, TraceLimits } from '../shared/trace';
3
+ export interface Trace {
4
+ step<T>(name: string, fn: () => T | Promise<T>): Promise<T>;
5
+ end(): void;
6
+ }
7
+ /** Replaces every limit. Read when a run starts, so configure before the first one. */
8
+ export declare function configureTraces(newConfig: TraceConfig): void;
9
+ /** `startTrace(name)` returns the object; call `.end()` when the flow is over. */
10
+ export declare function startTrace(name: string): Trace;
11
+ /** Runs `fn` with a trace object and ends the trace when `fn` settles, either way. */
12
+ export declare function trace<T>(name: string, fn: (t: Trace) => T | Promise<T>): Promise<T>;
13
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/functions/trace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqD,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAErG,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE/D,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3D,GAAG,IAAI,IAAI,CAAA;CACZ;AAID,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAE5D;AAyCD,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAE9C;AAED,sFAAsF;AACtF,wBAAsB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOzF"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureTraces = configureTraces;
4
+ exports.startTrace = startTrace;
5
+ exports.trace = trace;
6
+ const ulid_1 = require("ulid");
7
+ const requestLogger_1 = require("./requestLogger");
8
+ const trace_1 = require("../shared/trace");
9
+ let config = {};
10
+ /** Replaces every limit. Read when a run starts, so configure before the first one. */
11
+ function configureTraces(newConfig) {
12
+ config = newConfig;
13
+ }
14
+ function now() {
15
+ return Date.now();
16
+ }
17
+ /**
18
+ * Judged only when a step finishes or the trace ends — no timer, since Cloud
19
+ * Functions and Cloud Run can throttle the CPU once a response is sent (see
20
+ * CLAUDE.md, "Traces report misbehaviour, nothing else"). Sent through the
21
+ * request-scoped writer, so it carries that request's labels like any other entry.
22
+ */
23
+ function report(run, found) {
24
+ if (!found)
25
+ return;
26
+ run.markReported();
27
+ (0, requestLogger_1.getLogger)().warning((0, trace_1.traceMessage)(run.name, found), (0, trace_1.traceLabels)(run.name, run.run, found), (0, trace_1.traceContext)(found));
28
+ }
29
+ function startRun(name) {
30
+ const run = new trace_1.TraceRun(name, config[name], now, (0, ulid_1.ulid)());
31
+ return {
32
+ async step(stepName, fn) {
33
+ if (run.isEnded)
34
+ return fn();
35
+ run.startStep(stepName);
36
+ try {
37
+ return await fn();
38
+ }
39
+ finally {
40
+ const ms = run.endStep(stepName);
41
+ if (ms !== undefined)
42
+ report(run, run.checkFinishedStep(stepName, ms));
43
+ report(run, run.check());
44
+ }
45
+ },
46
+ end() {
47
+ if (run.isEnded)
48
+ return;
49
+ report(run, run.check());
50
+ run.end();
51
+ },
52
+ };
53
+ }
54
+ /** `startTrace(name)` returns the object; call `.end()` when the flow is over. */
55
+ function startTrace(name) {
56
+ return startRun(name);
57
+ }
58
+ /** Runs `fn` with a trace object and ends the trace when `fn` settles, either way. */
59
+ async function trace(name, fn) {
60
+ const handle = startRun(name);
61
+ try {
62
+ return await fn(handle);
63
+ }
64
+ finally {
65
+ handle.end();
66
+ }
67
+ }
68
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/functions/trace.ts"],"names":[],"mappings":";;AAcA,0CAEC;AA0CD,gCAEC;AAGD,sBAOC;AAtED,+BAA2B;AAC3B,mDAA2C;AAC3C,2CAAqG;AASrG,IAAI,MAAM,GAAgB,EAAE,CAAA;AAE5B,uFAAuF;AACvF,SAAgB,eAAe,CAAC,SAAsB;IACpD,MAAM,GAAG,SAAS,CAAA;AACpB,CAAC;AAED,SAAS,GAAG;IACV,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,GAAa,EAAE,KAAoC;IACjE,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,GAAG,CAAC,YAAY,EAAE,CAAA;IAClB,IAAA,yBAAS,GAAE,CAAC,OAAO,CAAC,IAAA,oBAAY,EAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAA;AAChH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,GAAG,GAAG,IAAI,gBAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAA,WAAI,GAAE,CAAC,CAAA;IAEzD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACrB,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,EAAE,EAAE,CAAA;YAC5B,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACvB,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAA;YACnB,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAChC,IAAI,EAAE,KAAK,SAAS;oBAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;gBACtE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,GAAG;YACD,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAM;YACvB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;YACxB,GAAG,CAAC,GAAG,EAAE,CAAA;QACX,CAAC;KACF,CAAA;AACH,CAAC;AAED,kFAAkF;AAClF,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAED,sFAAsF;AAC/E,KAAK,UAAU,KAAK,CAAI,IAAY,EAAE,EAAgC;IAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The pure bookkeeping behind `/client/timing` and `/functions`' `trace`/`startTrace` —
3
+ * which steps are finished (with their ms) and which are still running, checked
4
+ * against configured limits through an injected monotonic clock so tests never wait
5
+ * for real time. The two entry points differ only in how often they call `check()`
6
+ * (a watchdog tick in the browser, a step/trace boundary on the server, per
7
+ * CLAUDE.md "Traces report misbehaviour, nothing else") and in what they do with
8
+ * the `TraceReport` it returns.
9
+ */
10
+ export interface TraceLimits {
11
+ warnAfterMs?: number;
12
+ steps?: Record<string, number>;
13
+ }
14
+ /** `configureTraces({ name: { warnAfterMs?, steps? } })` — see README, "Timing". */
15
+ export type TraceConfig = Record<string, TraceLimits>;
16
+ export interface TraceReport {
17
+ slow: 'trace' | 'step';
18
+ step?: string;
19
+ elapsedMs: number;
20
+ limitMs: number;
21
+ steps: Record<string, number>;
22
+ waiting: string[];
23
+ }
24
+ export declare class TraceRun {
25
+ readonly name: string;
26
+ private readonly limits;
27
+ private readonly clock;
28
+ readonly run: string;
29
+ private readonly startedAt;
30
+ private readonly finishedSteps;
31
+ private readonly runningSteps;
32
+ private reported;
33
+ private ended;
34
+ constructor(name: string, limits: TraceLimits | undefined, clock: () => number, runId: string);
35
+ get isEnded(): boolean;
36
+ get hasReported(): boolean;
37
+ startStep(name: string): void;
38
+ endStep(name: string): number | undefined;
39
+ end(): void;
40
+ /**
41
+ * The first limit crossed right now, or undefined. Does not itself mark the
42
+ * run as reported — callers do that only once they have actually sent it.
43
+ */
44
+ check(): TraceReport | undefined;
45
+ /**
46
+ * The server's counterpart to `check()`'s step loop: a step that has already
47
+ * been moved into `finishedSteps` (so `endStep` has already run for it) is no
48
+ * longer in `runningSteps` for `check()` to see, yet the instant it finished
49
+ * is the only one the server — with no timer — gets to judge it against its
50
+ * own limit. `ms` is the duration `endStep` just returned for it.
51
+ */
52
+ checkFinishedStep(name: string, ms: number): TraceReport | undefined;
53
+ markReported(): void;
54
+ }
55
+ /** The message README, "Timing" shows: `"app_boot slow: products passed 3000 ms, still waiting"`. */
56
+ export declare function traceMessage(name: string, report: TraceReport): string;
57
+ export declare function traceLabels(name: string, run: string, report: TraceReport): Record<string, string>;
58
+ export declare function traceContext(report: TraceReport): Record<string, unknown>;
59
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/shared/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAErD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,qBAAa,QAAQ;IASjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAVxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,KAAK,CAAQ;gBAGV,IAAI,EAAE,MAAM,EACJ,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,MAAM,EACpC,KAAK,EAAE,MAAM;IAMf,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASzC,GAAG,IAAI,IAAI;IAIX;;;OAGG;IACH,KAAK,IAAI,WAAW,GAAG,SAAS;IAkChC;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAcpE,YAAY,IAAI,IAAI;CAGrB;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAGtE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzE"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TraceRun = void 0;
4
+ exports.traceMessage = traceMessage;
5
+ exports.traceLabels = traceLabels;
6
+ exports.traceContext = traceContext;
7
+ class TraceRun {
8
+ name;
9
+ limits;
10
+ clock;
11
+ run;
12
+ startedAt;
13
+ finishedSteps = {};
14
+ runningSteps = new Map();
15
+ reported = false;
16
+ ended = false;
17
+ constructor(name, limits, clock, runId) {
18
+ this.name = name;
19
+ this.limits = limits;
20
+ this.clock = clock;
21
+ this.run = runId;
22
+ this.startedAt = clock();
23
+ }
24
+ get isEnded() {
25
+ return this.ended;
26
+ }
27
+ get hasReported() {
28
+ return this.reported;
29
+ }
30
+ startStep(name) {
31
+ if (this.ended)
32
+ return;
33
+ this.runningSteps.set(name, this.clock());
34
+ }
35
+ endStep(name) {
36
+ const startedAt = this.runningSteps.get(name);
37
+ if (startedAt === undefined)
38
+ return undefined;
39
+ this.runningSteps.delete(name);
40
+ const ms = this.clock() - startedAt;
41
+ this.finishedSteps[name] = ms;
42
+ return ms;
43
+ }
44
+ end() {
45
+ this.ended = true;
46
+ }
47
+ /**
48
+ * The first limit crossed right now, or undefined. Does not itself mark the
49
+ * run as reported — callers do that only once they have actually sent it.
50
+ */
51
+ check() {
52
+ if (this.reported || !this.limits)
53
+ return undefined;
54
+ const limits = this.limits;
55
+ const elapsedMs = this.clock() - this.startedAt;
56
+ if (limits.warnAfterMs !== undefined && elapsedMs >= limits.warnAfterMs) {
57
+ return {
58
+ slow: 'trace',
59
+ elapsedMs,
60
+ limitMs: limits.warnAfterMs,
61
+ steps: { ...this.finishedSteps },
62
+ waiting: [...this.runningSteps.keys()],
63
+ };
64
+ }
65
+ for (const [stepName, startedAt] of this.runningSteps) {
66
+ const limitMs = limits.steps?.[stepName];
67
+ if (limitMs === undefined)
68
+ continue;
69
+ const stepElapsedMs = this.clock() - startedAt;
70
+ if (stepElapsedMs >= limitMs) {
71
+ return {
72
+ slow: 'step',
73
+ step: stepName,
74
+ elapsedMs: stepElapsedMs,
75
+ limitMs,
76
+ steps: { ...this.finishedSteps },
77
+ waiting: [...this.runningSteps.keys()],
78
+ };
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ /**
84
+ * The server's counterpart to `check()`'s step loop: a step that has already
85
+ * been moved into `finishedSteps` (so `endStep` has already run for it) is no
86
+ * longer in `runningSteps` for `check()` to see, yet the instant it finished
87
+ * is the only one the server — with no timer — gets to judge it against its
88
+ * own limit. `ms` is the duration `endStep` just returned for it.
89
+ */
90
+ checkFinishedStep(name, ms) {
91
+ if (this.reported || !this.limits)
92
+ return undefined;
93
+ const limitMs = this.limits.steps?.[name];
94
+ if (limitMs === undefined || ms < limitMs)
95
+ return undefined;
96
+ return {
97
+ slow: 'step',
98
+ step: name,
99
+ elapsedMs: ms,
100
+ limitMs,
101
+ steps: { ...this.finishedSteps },
102
+ waiting: [...this.runningSteps.keys()],
103
+ };
104
+ }
105
+ markReported() {
106
+ this.reported = true;
107
+ }
108
+ }
109
+ exports.TraceRun = TraceRun;
110
+ /** The message README, "Timing" shows: `"app_boot slow: products passed 3000 ms, still waiting"`. */
111
+ function traceMessage(name, report) {
112
+ const subject = report.slow === 'step' ? `${report.step} ` : '';
113
+ return `${name} slow: ${subject}passed ${report.limitMs} ms, still waiting`;
114
+ }
115
+ function traceLabels(name, run, report) {
116
+ const labels = { trace: name, run, slow: report.slow };
117
+ if (report.step !== undefined)
118
+ labels.step = report.step;
119
+ return labels;
120
+ }
121
+ function traceContext(report) {
122
+ return {
123
+ timing: {
124
+ elapsedMs: report.elapsedMs,
125
+ limitMs: report.limitMs,
126
+ steps: report.steps,
127
+ waiting: report.waiting,
128
+ },
129
+ };
130
+ }
131
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/shared/trace.ts"],"names":[],"mappings":"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"}
@@ -8,23 +8,28 @@ export interface BaseLabels {
8
8
  releaseId?: string;
9
9
  errorType?: string;
10
10
  errorCategory?: string;
11
- /** The route pattern, e.g. `/orders/:id/items`. Set by `enableNavigation()`. */
11
+ /** The route pattern, e.g. `/orders/:id/items`. Set by `enableNavigation()` or `navigatedTo()`. */
12
12
  route?: string;
13
- /** The real path, e.g. `/orders/1042/items`. Omitted when `enableNavigation({ path: false })`. */
13
+ /** The real path, e.g. `/orders/1042/items`. Set by `enableNavigation()` or `navigatedTo()`. */
14
14
  path?: string;
15
- /** Whether `route` came from `routeFor` or the id rule. Set by `enableNavigation()`. */
15
+ /**
16
+ * Whether `route` came from the deprecated `routeFor` or the id rule.
17
+ * @deprecated Removed in 2.0 — a `labelsFor` answer is final and carries no source.
18
+ */
16
19
  routeSource?: 'router' | 'pattern';
17
20
  }
18
21
  /**
19
- * What `enableNavigation()` (`@dasasian/firebase-structured-logger/client/navigation`)
20
- * hands to the core logger for the current page, through `setCurrentRoute` in
21
- * `client/breadcrumbs.ts`. `path` is absent exactly when `enableNavigation` was
22
- * given `{ path: false }`.
22
+ * What `enableNavigation()` and `navigatedTo()` (both
23
+ * `@dasasian/firebase-structured-logger/client/navigation`) hand to the core logger for
24
+ * the current page, through `setCurrentRoute` in `client/breadcrumbs.ts`. Used exactly
25
+ * as given — a field left out is not logged — so every field is optional.
23
26
  */
24
27
  export interface NavigationLabels {
25
- route: string;
28
+ route?: string;
29
+ screen?: string;
26
30
  path?: string;
27
- routeSource: 'router' | 'pattern';
31
+ /** @deprecated Removed in 2.0. Set only by `defaultLabelsFor()` and the deprecated `routeFor`/`cleanPath`/`path: false`. */
32
+ routeSource?: 'router' | 'pattern';
28
33
  }
29
34
  export interface ErrorPayload {
30
35
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAE3E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kGAAkG;IAClG,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wFAAwF;IACxF,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,CAAC,EAAE,YAAY,CAAA;KACrB,CAAA;IACD,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAE3E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4HAA4H;IAC5H,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,CAAC,EAAE,YAAY,CAAA;KACrB,CAAA;IACD,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dasasian/firebase-structured-logger",
3
- "version": "1.1.0",
3
+ "version": "1.3.0-rc.0",
4
4
  "description": "Structured logging for Firebase and Google Cloud web apps — browser, backend, and tools",
5
5
  "license": "MIT",
6
6
  "author": "Dasasian",
@@ -38,6 +38,18 @@
38
38
  "types": "./dist/client/navigation.d.ts",
39
39
  "default": "./dist/client/navigation.js"
40
40
  },
41
+ "./client/navigation/vue-router": {
42
+ "types": "./dist/client/navigation/vue-router.d.ts",
43
+ "default": "./dist/client/navigation/vue-router.js"
44
+ },
45
+ "./client/navigation/react-router": {
46
+ "types": "./dist/client/navigation/react-router.d.ts",
47
+ "default": "./dist/client/navigation/react-router.js"
48
+ },
49
+ "./client/timing": {
50
+ "types": "./dist/client/timing.d.ts",
51
+ "default": "./dist/client/timing.js"
52
+ },
41
53
  "./functions": {
42
54
  "types": "./dist/functions/index.d.ts",
43
55
  "default": "./dist/functions/index.js"
@@ -55,6 +67,15 @@
55
67
  "client/navigation": [
56
68
  "dist/client/navigation.d.ts"
57
69
  ],
70
+ "client/navigation/vue-router": [
71
+ "dist/client/navigation/vue-router.d.ts"
72
+ ],
73
+ "client/navigation/react-router": [
74
+ "dist/client/navigation/react-router.d.ts"
75
+ ],
76
+ "client/timing": [
77
+ "dist/client/timing.d.ts"
78
+ ],
58
79
  "functions": [
59
80
  "dist/functions/index.d.ts"
60
81
  ],
@@ -64,7 +85,7 @@
64
85
  }
65
86
  },
66
87
  "bin": {
67
- "fsl": "./dist/tools/index.js"
88
+ "fsl": "dist/tools/index.js"
68
89
  },
69
90
  "files": [
70
91
  "dist",
@@ -75,7 +96,7 @@
75
96
  "build:watch": "tsc --watch",
76
97
  "clean": "rm -rf dist",
77
98
  "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.check.json",
78
- "test": "tsx tests/logger.ts && tsx tests/browserBundle.ts && tsx tests/breadcrumbs.ts && tsx tests/navigation.ts && tsx tests/rateLimiter.ts && tsx tests/errorHandler.ts && tsx tests/attachments.ts && tsx tests/feedback.ts && tsx tests/paths.ts && tsx tests/loadsWithoutOptionalPeers.ts && tsx tests/sourceMapStripping.ts && FUNCTIONS_EMULATOR=true tsx tests/errorPayload.ts && FUNCTIONS_EMULATOR=true tsx tests/requestLogger.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/httpHandler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts && FUNCTIONS_EMULATOR=true tsx tests/publicApi.ts && FUNCTIONS_EMULATOR=true tsx tests/configureTwice.ts && FUNCTIONS_EMULATOR=true tsx tests/deprecatedNames.ts && tsx tests/productionOutput.ts && tsx tests/storageChain.ts && tsx tests/entrySize.ts && tsx tests/handlerSymbolication.ts && tsx tests/releaseResolution.ts && tsx tests/sourceMapCacheBounds.ts && tsx tests/doctor.ts && tsx tests/doctorProcess.ts && tsx tests/uploadSourcemapsBackend.ts",
99
+ "test": "tsx tests/logger.ts && tsx tests/browserBundle.ts && tsx tests/breadcrumbs.ts && tsx tests/navigation.ts && tsx tests/vueRouterNavigation.ts && tsx tests/reactRouterNavigation.ts && tsx tests/timing.ts && tsx tests/rateLimiter.ts && tsx tests/errorHandler.ts && tsx tests/attachments.ts && tsx tests/feedback.ts && tsx tests/paths.ts && tsx tests/loadsWithoutOptionalPeers.ts && tsx tests/sourceMapStripping.ts && FUNCTIONS_EMULATOR=true tsx tests/errorPayload.ts && FUNCTIONS_EMULATOR=true tsx tests/requestLogger.ts && FUNCTIONS_EMULATOR=true tsx tests/serverTrace.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/httpHandler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts && FUNCTIONS_EMULATOR=true tsx tests/publicApi.ts && FUNCTIONS_EMULATOR=true tsx tests/configureTwice.ts && FUNCTIONS_EMULATOR=true tsx tests/deprecatedNames.ts && tsx tests/productionOutput.ts && tsx tests/storageChain.ts && tsx tests/entrySize.ts && tsx tests/handlerSymbolication.ts && tsx tests/releaseResolution.ts && tsx tests/sourceMapCacheBounds.ts && tsx tests/doctor.ts && tsx tests/doctorProcess.ts && tsx tests/uploadSourcemapsBackend.ts",
79
100
  "prepublishOnly": "npm run clean && npm run build",
80
101
  "smoke:deploy": "cd smoke/functions && npm install && npm run build && cd .. && firebase deploy --only functions --project $(grep '^FSL_SMOKE_PROJECT=' .env.local | cut -d= -f2)",
81
102
  "smoke:deploy:run": "bash smoke/cloudrun/deploy.sh",
@@ -112,8 +133,14 @@
112
133
  "firebase-admin": "^14.5.0",
113
134
  "firebase-functions": "^7.4.0",
114
135
  "jsdom": "^30.1.1",
136
+ "react": "^19.3.0",
137
+ "react-dom": "^19.3.0",
138
+ "react-router-6": "npm:react-router@^6.30",
139
+ "react-router-7": "npm:react-router@^7.18",
115
140
  "tsx": "^4.23.15",
116
- "typescript": "~6.0.3"
141
+ "typescript": "~6.0.3",
142
+ "vue": "^3.5.43",
143
+ "vue-router": "^4.6.4"
117
144
  },
118
145
  "engines": {
119
146
  "node": ">=22"