@coast/service-common-nest 1.0.76 → 1.0.77

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.
@@ -9,19 +9,28 @@ const SensitiveSymbol_1 = require("@coast/service-common/logger/redaction/Sensit
9
9
  const common_1 = require("@nestjs/common");
10
10
  const lodash_1 = __importDefault(require("lodash"));
11
11
  const Constants_1 = require("../Constants");
12
+ const CoastMetrics_1 = require("../metrics/CoastMetrics");
12
13
  function LogMethod(options) {
13
14
  const extraLogFieldsOption = options?.extraLogFields;
15
+ const metrics = options?.metrics;
16
+ const extraTagsOption = metrics?.extraTags;
14
17
  const injectLogger = (0, common_1.Inject)(Constants_1.Constants.COAST_LOGGER);
18
+ const injectMetrics = metrics !== undefined ? (0, common_1.Inject)(CoastMetrics_1.CoastMetrics) : undefined;
15
19
  return (target, method, descriptor) => {
16
20
  if (descriptor === undefined) {
17
21
  descriptor = Object.getOwnPropertyDescriptor(target, method);
18
22
  }
19
23
  injectLogger(target, 'logger');
24
+ if (injectMetrics !== undefined) {
25
+ injectMetrics(target, 'metrics');
26
+ }
20
27
  const originalMethod = descriptor?.value;
21
28
  if (!lodash_1.default.isNil(descriptor)) {
22
29
  descriptor.value = function () {
23
30
  const coastLogger = this.logger;
24
- const resolvedExtras = resolveExtras(extraLogFieldsOption, this, coastLogger);
31
+ const coastMetrics = metrics !== undefined ? this.metrics : undefined;
32
+ const resolvedExtras = resolveOption(extraLogFieldsOption, this, coastLogger, 'extraLogFields');
33
+ const resolvedTags = resolveOption(extraTagsOption, this, coastLogger, 'metrics.extraTags');
25
34
  const className = target.constructor?.name;
26
35
  let callSucceeded = true;
27
36
  let capturedError;
@@ -44,6 +53,14 @@ function LogMethod(options) {
44
53
  }
45
54
  logMethodStart(className, method.toString(), coastLogger, loggableArguments, resolvedExtras);
46
55
  const startTime = process.hrtime.bigint();
56
+ const finish = () => {
57
+ const endTime = process.hrtime.bigint();
58
+ const latencyMs = Number(endTime - startTime) / 1_000_000;
59
+ logMethodResult(className, method, callSucceeded, latencyMs, coastLogger, resolvedExtras, capturedError);
60
+ if (coastMetrics !== undefined) {
61
+ emitMethodMetrics(className, method, callSucceeded, latencyMs, coastMetrics, resolvedTags, capturedError);
62
+ }
63
+ };
47
64
  try {
48
65
  const result = originalMethod.apply(this, arguments);
49
66
  if (result instanceof Promise) {
@@ -53,15 +70,15 @@ function LogMethod(options) {
53
70
  capturedError = e;
54
71
  throw e;
55
72
  })
56
- .finally(() => logMethodResult(className, method, callSucceeded, startTime, coastLogger, resolvedExtras, capturedError)));
73
+ .finally(finish));
57
74
  }
58
- logMethodResult(className, method, callSucceeded, startTime, coastLogger, resolvedExtras, capturedError);
75
+ finish();
59
76
  return result;
60
77
  }
61
78
  catch (e) {
62
79
  callSucceeded = false;
63
80
  capturedError = e;
64
- logMethodResult(className, method, callSucceeded, startTime, coastLogger, resolvedExtras, capturedError);
81
+ finish();
65
82
  throw e;
66
83
  }
67
84
  };
@@ -69,16 +86,16 @@ function LogMethod(options) {
69
86
  return descriptor;
70
87
  };
71
88
  }
72
- function resolveExtras(extras, self, coastLogger) {
73
- if (typeof extras !== 'function') {
74
- return extras;
89
+ function resolveOption(option, self, coastLogger, fieldName) {
90
+ if (typeof option !== 'function') {
91
+ return option;
75
92
  }
76
93
  try {
77
- return extras(self);
94
+ return option(self);
78
95
  }
79
96
  catch (e) {
80
97
  coastLogger?.warn({
81
- msg: 'LogMethod extraLogFields resolver threw; emitting log without extras',
98
+ msg: `LogMethod ${fieldName} resolver threw; falling back without it`,
82
99
  errorClass: e instanceof Error ? e.constructor.name : undefined,
83
100
  });
84
101
  return undefined;
@@ -103,9 +120,7 @@ function logMethodStart(className, methodName, coastLogger, loggableArguments, e
103
120
  msg: `Method start: ${className}.${methodName.toString()}(${loggableArgs})`,
104
121
  });
105
122
  }
106
- function logMethodResult(className, methodName, callSucceeded, startTime, coastLogger, extraLogFields, error) {
107
- const endTime = process.hrtime.bigint();
108
- const latencyMs = Number(endTime - startTime) / 1_000_000;
123
+ function logMethodResult(className, methodName, callSucceeded, latencyMs, coastLogger, extraLogFields, error) {
109
124
  const errorFields = error instanceof Error ? { errorClass: error.constructor.name } : undefined;
110
125
  coastLogger?.log({
111
126
  ...extraLogFields,
@@ -116,4 +131,16 @@ function logMethodResult(className, methodName, callSucceeded, startTime, coastL
116
131
  msg: 'Method ended',
117
132
  });
118
133
  }
134
+ function emitMethodMetrics(className, methodName, callSucceeded, latencyMs, coastMetrics, extraTags, error) {
135
+ const attrs = {
136
+ ...extraTags,
137
+ method: `${className}.${methodName.toString()}`,
138
+ callSucceeded,
139
+ };
140
+ if (error instanceof Error) {
141
+ attrs.errorClass = error.constructor.name;
142
+ }
143
+ coastMetrics.counter('method.invocations', 1, attrs);
144
+ coastMetrics.histogram('method.latency_ms', latencyMs, attrs);
145
+ }
119
146
  //# sourceMappingURL=LogMethod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogMethod.js","sourceRoot":"","sources":["../../../lib/logger/LogMethod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LogMethod.js","sourceRoot":"","sources":["../../../lib/logger/LogMethod.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { ExtraLogFields } from './ExtraLogFields';
2
+ import { MetricsConfig } from './MetricsConfig';
2
3
  export interface LogMethodOptions<T = unknown> {
3
4
  extraLogFields?: ((self: T) => ExtraLogFields) | ExtraLogFields;
5
+ metrics?: MetricsConfig<T>;
4
6
  }
@@ -0,0 +1 @@
1
+ export type MetricTags = Record<string, boolean | number | string>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MetricTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricTags.js","sourceRoot":"","sources":["../../../lib/logger/MetricTags.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { MetricTags } from './MetricTags';
2
+ export interface MetricsConfig<T = unknown> {
3
+ extraTags?: ((self: T) => MetricTags) | MetricTags;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MetricsConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsConfig.js","sourceRoot":"","sources":["../../../lib/logger/MetricsConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class LogMethodMetricsTestModule {
2
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LogMethodMetricsTestModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const CoastMetrics_1 = require("../../metrics/CoastMetrics");
13
+ const LoggerModule_1 = require("../LoggerModule");
14
+ const TestMetricsLoggedMethods_1 = require("./TestMetricsLoggedMethods");
15
+ const stubMetricService = {
16
+ getGauge: () => ({ record: () => { } }),
17
+ getHistogram: () => ({ record: () => { } }),
18
+ getUpDownCounter: () => ({ add: () => { } }),
19
+ };
20
+ let LogMethodMetricsTestModule = class LogMethodMetricsTestModule {
21
+ };
22
+ exports.LogMethodMetricsTestModule = LogMethodMetricsTestModule;
23
+ exports.LogMethodMetricsTestModule = LogMethodMetricsTestModule = __decorate([
24
+ (0, common_1.Module)({
25
+ imports: [
26
+ config_1.ConfigModule.forRoot({
27
+ isGlobal: true,
28
+ }),
29
+ LoggerModule_1.LoggerModule.forRootAsync({
30
+ imports: [config_1.ConfigModule],
31
+ inject: [config_1.ConfigService],
32
+ useFactory: async (configService) => ({
33
+ level: configService.get('LOG_LEVEL'),
34
+ pretty: configService.get('LOG_PRETTY'),
35
+ }),
36
+ }),
37
+ ],
38
+ providers: [{ provide: CoastMetrics_1.CoastMetrics, useValue: new CoastMetrics_1.CoastMetrics(stubMetricService) }, TestMetricsLoggedMethods_1.TestMetricsLoggedMethods],
39
+ })
40
+ ], LogMethodMetricsTestModule);
41
+ //# sourceMappingURL=LogMethodMetricsTestModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogMethodMetricsTestModule.js","sourceRoot":"","sources":["../../../../lib/logger/test/LogMethodMetricsTestModule.ts"],"names":[],"mappings":";;;;;;;;;AACA,2CAAwC;AACxC,2CAA6D;AAG7D,6DAA0D;AAC1D,kDAA+C;AAC/C,yEAAsE;AAEtE,MAAM,iBAAiB,GAAG;IACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAS,EAAE,GAAE,CAAC,EAAE,CAAC;IAC5C,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAS,EAAE,GAAE,CAAC,EAAE,CAAC;IAChD,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAS,EAAE,GAAE,CAAC,EAAE,CAAC;CACxB,CAAC;AAkBvB,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;CAAG,CAAA;AAA7B,gEAA0B;qCAA1B,0BAA0B;IAhBtC,IAAA,eAAM,EAAC;QACJ,OAAO,EAAE;YACL,qBAAY,CAAC,OAAO,CAAC;gBACjB,QAAQ,EAAE,IAAI;aACjB,CAAC;YACF,2BAAY,CAAC,YAAY,CAAC;gBACtB,OAAO,EAAE,CAAC,qBAAY,CAAC;gBACvB,MAAM,EAAE,CAAC,sBAAa,CAAC;gBACvB,UAAU,EAAE,KAAK,EAAE,aAA4B,EAAE,EAAE,CAAC,CAAC;oBACjD,KAAK,EAAE,aAAa,CAAC,GAAG,CAAW,WAAW,CAAC;oBAC/C,MAAM,EAAE,aAAa,CAAC,GAAG,CAAU,YAAY,CAAC;iBACnD,CAAC;aACL,CAAC;SACL;QACD,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,2BAAY,EAAE,QAAQ,EAAE,IAAI,2BAAY,CAAC,iBAAiB,CAAC,EAAE,EAAE,mDAAwB,CAAC;KAClH,CAAC;GACW,0BAA0B,CAAG"}
@@ -0,0 +1,16 @@
1
+ interface Named {
2
+ name: string;
3
+ }
4
+ export declare class TestMetricsLoggedMethods implements Named {
5
+ readonly name = "metrics_test_class";
6
+ metricsNoTags(): void;
7
+ metricsWithTagsAndLogFields(): void;
8
+ metricsAsyncResolve(): Promise<void>;
9
+ metricsAsyncReject(): Promise<void>;
10
+ metricsSyncThrow(): void;
11
+ metricsTagsCollision(): void;
12
+ noMetricsConfig(): void;
13
+ metricsWithFunctionTags(): void;
14
+ metricsWithThrowingTagsResolver(): void;
15
+ }
16
+ export {};
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TestMetricsLoggedMethods = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const LogMethod_1 = require("../LogMethod");
15
+ class FakeError extends Error {
16
+ constructor() {
17
+ super('metrics test boom');
18
+ this.name = 'FakeError';
19
+ }
20
+ }
21
+ let TestMetricsLoggedMethods = class TestMetricsLoggedMethods {
22
+ constructor() {
23
+ this.name = 'metrics_test_class';
24
+ }
25
+ metricsNoTags() { }
26
+ metricsWithTagsAndLogFields() { }
27
+ async metricsAsyncResolve() {
28
+ await Promise.resolve();
29
+ }
30
+ async metricsAsyncReject() {
31
+ await Promise.resolve();
32
+ throw new FakeError();
33
+ }
34
+ metricsSyncThrow() {
35
+ throw new FakeError();
36
+ }
37
+ metricsTagsCollision() { }
38
+ noMetricsConfig() { }
39
+ metricsWithFunctionTags() { }
40
+ metricsWithThrowingTagsResolver() { }
41
+ };
42
+ exports.TestMetricsLoggedMethods = TestMetricsLoggedMethods;
43
+ __decorate([
44
+ (0, LogMethod_1.LogMethod)({ metrics: {} }),
45
+ __metadata("design:type", Function),
46
+ __metadata("design:paramtypes", []),
47
+ __metadata("design:returntype", void 0)
48
+ ], TestMetricsLoggedMethods.prototype, "metricsNoTags", null);
49
+ __decorate([
50
+ (0, LogMethod_1.LogMethod)({
51
+ extraLogFields: { requestId: 'high-cardinality-ok' },
52
+ metrics: { extraTags: { toolName: 'create_automation' } },
53
+ }),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", []),
56
+ __metadata("design:returntype", void 0)
57
+ ], TestMetricsLoggedMethods.prototype, "metricsWithTagsAndLogFields", null);
58
+ __decorate([
59
+ (0, LogMethod_1.LogMethod)({ metrics: { extraTags: { toolName: 'async_resolve' } } }),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", []),
62
+ __metadata("design:returntype", Promise)
63
+ ], TestMetricsLoggedMethods.prototype, "metricsAsyncResolve", null);
64
+ __decorate([
65
+ (0, LogMethod_1.LogMethod)({ metrics: { extraTags: { toolName: 'async_reject' } } }),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", []),
68
+ __metadata("design:returntype", Promise)
69
+ ], TestMetricsLoggedMethods.prototype, "metricsAsyncReject", null);
70
+ __decorate([
71
+ (0, LogMethod_1.LogMethod)({ metrics: { extraTags: { toolName: 'sync_throw' } } }),
72
+ __metadata("design:type", Function),
73
+ __metadata("design:paramtypes", []),
74
+ __metadata("design:returntype", void 0)
75
+ ], TestMetricsLoggedMethods.prototype, "metricsSyncThrow", null);
76
+ __decorate([
77
+ (0, LogMethod_1.LogMethod)({ metrics: { extraTags: { method: 'overridden', toolName: 'collision' } } }),
78
+ __metadata("design:type", Function),
79
+ __metadata("design:paramtypes", []),
80
+ __metadata("design:returntype", void 0)
81
+ ], TestMetricsLoggedMethods.prototype, "metricsTagsCollision", null);
82
+ __decorate([
83
+ (0, LogMethod_1.LogMethod)(),
84
+ __metadata("design:type", Function),
85
+ __metadata("design:paramtypes", []),
86
+ __metadata("design:returntype", void 0)
87
+ ], TestMetricsLoggedMethods.prototype, "noMetricsConfig", null);
88
+ __decorate([
89
+ (0, LogMethod_1.LogMethod)({ metrics: { extraTags: (self) => ({ toolName: self.name }) } }),
90
+ __metadata("design:type", Function),
91
+ __metadata("design:paramtypes", []),
92
+ __metadata("design:returntype", void 0)
93
+ ], TestMetricsLoggedMethods.prototype, "metricsWithFunctionTags", null);
94
+ __decorate([
95
+ (0, LogMethod_1.LogMethod)({
96
+ metrics: {
97
+ extraTags: () => {
98
+ throw new Error('tags resolver boom');
99
+ },
100
+ },
101
+ }),
102
+ __metadata("design:type", Function),
103
+ __metadata("design:paramtypes", []),
104
+ __metadata("design:returntype", void 0)
105
+ ], TestMetricsLoggedMethods.prototype, "metricsWithThrowingTagsResolver", null);
106
+ exports.TestMetricsLoggedMethods = TestMetricsLoggedMethods = __decorate([
107
+ (0, common_1.Injectable)()
108
+ ], TestMetricsLoggedMethods);
109
+ //# sourceMappingURL=TestMetricsLoggedMethods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestMetricsLoggedMethods.js","sourceRoot":"","sources":["../../../../lib/logger/test/TestMetricsLoggedMethods.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,4CAAyC;AAEzC,MAAM,SAAU,SAAQ,KAAK;IACzB;QACI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;CACJ;AAOM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAA9B;QACa,SAAI,GAAG,oBAAoB,CAAC;IA4ChD,CAAC;IAzCG,aAAa,KAAU,CAAC;IAMxB,2BAA2B,KAAU,CAAC;IAGhC,AAAN,KAAK,CAAC,mBAAmB;QACrB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAGK,AAAN,KAAK,CAAC,kBAAkB;QACpB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,EAAE,CAAC;IAC1B,CAAC;IAGD,gBAAgB;QACZ,MAAM,IAAI,SAAS,EAAE,CAAC;IAC1B,CAAC;IAGD,oBAAoB,KAAU,CAAC;IAG/B,eAAe,KAAU,CAAC;IAG1B,uBAAuB,KAAU,CAAC;IASlC,+BAA+B,KAAU,CAAC;CAC7C,CAAA;AA7CY,4DAAwB;AAIjC;IADC,IAAA,qBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;;;;6DACH;AAMxB;IAJC,IAAA,qBAAS,EAAC;QACP,cAAc,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE;QACpD,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE;KAC5D,CAAC;;;;2EACoC;AAGhC;IADL,IAAA,qBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;;;;mEAGpE;AAGK;IADL,IAAA,qBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;;;;kEAInE;AAGD;IADC,IAAA,qBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;;;;gEAGjE;AAGD;IADC,IAAA,qBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;;;;oEACxD;AAG/B;IADC,IAAA,qBAAS,GAAE;;;;+DACc;AAG1B;IADC,IAAA,qBAAS,EAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;;;;uEAChD;AASlC;IAPC,IAAA,qBAAS,EAAC;QACP,OAAO,EAAE;YACL,SAAS,EAAE,GAAG,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC1C,CAAC;SACJ;KACJ,CAAC;;;;+EACwC;mCA5CjC,wBAAwB;IADpC,IAAA,mBAAU,GAAE;GACA,wBAAwB,CA6CpC"}
@@ -14,6 +14,7 @@ let CoastMetricsModule = class CoastMetricsModule {
14
14
  };
15
15
  exports.CoastMetricsModule = CoastMetricsModule;
16
16
  exports.CoastMetricsModule = CoastMetricsModule = __decorate([
17
+ (0, common_1.Global)(),
17
18
  (0, common_1.Module)({
18
19
  providers: [CoastMetrics_1.CoastMetrics, nestjs_otel_1.MetricService],
19
20
  exports: [CoastMetrics_1.CoastMetrics],
@@ -1 +1 @@
1
- {"version":3,"file":"CoastMetricsModule.js","sourceRoot":"","sources":["../../../lib/metrics/CoastMetricsModule.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6CAA4C;AAE5C,iDAA8C;AAMvC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IAJ9B,IAAA,eAAM,EAAC;QACJ,SAAS,EAAE,CAAC,2BAAY,EAAE,2BAAa,CAAC;QACxC,OAAO,EAAE,CAAC,2BAAY,CAAC;KAC1B,CAAC;GACW,kBAAkB,CAAG"}
1
+ {"version":3,"file":"CoastMetricsModule.js","sourceRoot":"","sources":["../../../lib/metrics/CoastMetricsModule.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,6CAA4C;AAE5C,iDAA8C;AAOvC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IAL9B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACJ,SAAS,EAAE,CAAC,2BAAY,EAAE,2BAAa,CAAC;QACxC,OAAO,EAAE,CAAC,2BAAY,CAAC;KAC1B,CAAC;GACW,kBAAkB,CAAG"}