@theia/metrics 1.77.0-next.47 → 1.77.0-next.49

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.
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-backend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,qBACa,qCAAsC,YAAW,8BAA8B;IAIpF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,mBAAmB,CAAC;IAHlF,MAAM,CAAC,QAAQ,SAAc;gBAGN,gBAAgB,EAAE,oBAAoB,CAAC,mBAAmB,CAAC;IAIlF,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAOzC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI;IAMjD,yBAAyB,IAAI,MAAM;CAItC"}
1
+ {"version":3,"file":"metrics-backend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,qBACa,qCAAsC,YAAW,8BAA8B;IAIpF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,mBAAmB,CAAC;IAHlF,MAAM,CAAC,QAAQ,SAAc;gBAGN,gBAAgB,EAAE,oBAAoB,CAAC,mBAAmB,CAAC;IAIlF,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAOzC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI;IAMjD,yBAAyB,IAAI,MAAM;CAMtC"}
@@ -39,7 +39,10 @@ let MetricsBackendApplicationContribution = class MetricsBackendApplicationContr
39
39
  });
40
40
  }
41
41
  fetchMetricsFromProviders() {
42
- return this.metricsProviders.getContributions().reduce((total, contribution) => total += contribution.getMetrics() + '\n', '');
42
+ return this.metricsProviders.getContributions().reduce((total, contribution) => {
43
+ const metrics = contribution.getMetrics();
44
+ return metrics ? total + metrics + '\n' : total;
45
+ }, '');
43
46
  }
44
47
  };
45
48
  exports.MetricsBackendApplicationContribution = MetricsBackendApplicationContribution;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-backend-application-contribution.js","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,4DAAyE;AAIzE,mDAA8D;AAE9D,iEAA6D;AAGtD,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;;aACvC,aAAQ,GAAG,UAAU,AAAb,CAAc;IAC7B,YAEuB,gBAA2D;QAA3D,qBAAgB,GAAhB,gBAAgB,CAA2C;IAElF,CAAC;IAED,SAAS,CAAC,GAAwB;QAC9B,GAAG,CAAC,GAAG,CAAC,uCAAqC,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,MAAkC;QACtC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAC5D,YAAY,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yBAAyB;QACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAC3E,KAAK,IAAI,YAAY,CAAC,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;;AAxBQ,sFAAqC;gDAArC,qCAAqC;IADjD,IAAA,sBAAU,GAAE;IAIJ,mBAAA,IAAA,kBAAM,EAAC,6BAAoB,CAAC,CAAA;IAAE,mBAAA,IAAA,iBAAK,EAAC,0CAAmB,CAAC,CAAA;;GAHpD,qCAAqC,CAyBjD"}
1
+ {"version":3,"file":"metrics-backend-application-contribution.js","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,4DAAyE;AAIzE,mDAA8D;AAE9D,iEAA6D;AAGtD,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;;aACvC,aAAQ,GAAG,UAAU,AAAb,CAAc;IAC7B,YAEuB,gBAA2D;QAA3D,qBAAgB,GAAhB,gBAAgB,CAA2C;IAElF,CAAC;IAED,SAAS,CAAC,GAAwB;QAC9B,GAAG,CAAC,GAAG,CAAC,uCAAqC,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,MAAkC;QACtC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAC5D,YAAY,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yBAAyB;QACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;YAC3E,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACpD,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;;AA1BQ,sFAAqC;gDAArC,qCAAqC;IADjD,IAAA,sBAAU,GAAE;IAIJ,mBAAA,IAAA,kBAAM,EAAC,6BAAoB,CAAC,CAAA;IAAE,mBAAA,IAAA,iBAAK,EAAC,0CAAmB,CAAC,CAAA;;GAHpD,qCAAqC,CA2BjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics-backend-application-contribution.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-backend-application-contribution.spec.d.ts","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 Sahil Gupta and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const inversify_1 = require("@theia/core/shared/inversify");
19
+ const common_1 = require("@theia/core/lib/common");
20
+ const metrics_backend_application_contribution_1 = require("./metrics-backend-application-contribution");
21
+ const metrics_contribution_1 = require("./metrics-contribution");
22
+ const assert = require("assert");
23
+ describe('MetricsBackendApplicationContribution:', () => {
24
+ let testContainer;
25
+ function createBackendContribution(contributions) {
26
+ testContainer = new inversify_1.Container();
27
+ const module = new inversify_1.ContainerModule(bind => {
28
+ bind(common_1.ContributionProvider).toConstantValue({
29
+ getContributions: () => contributions
30
+ }).whenTargetNamed(metrics_contribution_1.MetricsContribution);
31
+ bind(metrics_backend_application_contribution_1.MetricsBackendApplicationContribution).toSelf().inSingletonScope();
32
+ });
33
+ testContainer.load(module);
34
+ return testContainer.get(metrics_backend_application_contribution_1.MetricsBackendApplicationContribution);
35
+ }
36
+ describe('fetchMetricsFromProviders:', () => {
37
+ it('should concatenate multiple contribution results with newlines', () => {
38
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
39
+ const contrib2 = { getMetrics: () => 'metric2 100', startCollecting: () => { } };
40
+ const backend = createBackendContribution([contrib1, contrib2]);
41
+ const result = backend.fetchMetricsFromProviders();
42
+ assert.strictEqual(result, 'metric1 42\nmetric2 100\n');
43
+ });
44
+ it('should skip contributions that return empty string', () => {
45
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
46
+ const contrib2 = { getMetrics: () => '', startCollecting: () => { } };
47
+ const contrib3 = { getMetrics: () => 'metric3 200', startCollecting: () => { } };
48
+ const backend = createBackendContribution([contrib1, contrib2, contrib3]);
49
+ const result = backend.fetchMetricsFromProviders();
50
+ // A contribution that returns an empty string must not contribute a separator of its own
51
+ assert.strictEqual(result, 'metric1 42\nmetric3 200\n');
52
+ assert.strictEqual(result.includes('\n\n'), false, 'should not contain double newlines');
53
+ });
54
+ it('should skip contributions that return undefined (defensive)', () => {
55
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
56
+ const contrib2 = { getMetrics: () => undefined, startCollecting: () => { } };
57
+ const contrib3 = { getMetrics: () => 'metric3 200', startCollecting: () => { } };
58
+ const backend = createBackendContribution([contrib1, contrib2, contrib3]);
59
+ const result = backend.fetchMetricsFromProviders();
60
+ // undefined should not corrupt the output
61
+ assert.strictEqual(result, 'metric1 42\nmetric3 200\n');
62
+ assert.strictEqual(result.includes('undefined'), false, 'should not contain literal "undefined"');
63
+ });
64
+ it('should return empty string when all contributions return empty', () => {
65
+ const contrib1 = { getMetrics: () => '', startCollecting: () => { } };
66
+ const contrib2 = { getMetrics: () => '', startCollecting: () => { } };
67
+ const backend = createBackendContribution([contrib1, contrib2]);
68
+ const result = backend.fetchMetricsFromProviders();
69
+ assert.strictEqual(result, '');
70
+ });
71
+ it('should return empty string when there are no contributions', () => {
72
+ const backend = createBackendContribution([]);
73
+ const result = backend.fetchMetricsFromProviders();
74
+ assert.strictEqual(result, '');
75
+ });
76
+ it('should end a single contribution with exactly one newline', () => {
77
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
78
+ const backend = createBackendContribution([contrib1]);
79
+ const result = backend.fetchMetricsFromProviders();
80
+ // Single contribution should end with exactly one newline, not two
81
+ assert.strictEqual(result, 'metric1 42\n');
82
+ assert.strictEqual(result.endsWith('\n\n'), false);
83
+ });
84
+ });
85
+ });
86
+ //# sourceMappingURL=metrics-backend-application-contribution.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-backend-application-contribution.spec.js","sourceRoot":"","sources":["../../src/node/metrics-backend-application-contribution.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@theia/metrics",
3
- "version": "1.77.0-next.47+e16adde42",
3
+ "version": "1.77.0-next.49+19f3aa746",
4
4
  "description": "Theia - Metrics Extension",
5
5
  "dependencies": {
6
- "@theia/core": "1.77.0-next.47+e16adde42",
7
- "@theia/telemetry": "1.77.0-next.47+e16adde42",
6
+ "@theia/core": "1.77.0-next.49+19f3aa746",
7
+ "@theia/telemetry": "1.77.0-next.49+19f3aa746",
8
8
  "prom-client": "^10.2.3",
9
9
  "tslib": "^2.8.1"
10
10
  },
@@ -50,5 +50,5 @@
50
50
  "nyc": {
51
51
  "extends": "../../configs/nyc.json"
52
52
  },
53
- "gitHead": "e16adde42dd7f932f85efb6d701d665149c04f47"
53
+ "gitHead": "19f3aa746ad23091ba655bc1509d18e4f961fb39"
54
54
  }
@@ -0,0 +1,106 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 Sahil Gupta and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { Container, ContainerModule } from '@theia/core/shared/inversify';
18
+ import { ContributionProvider } from '@theia/core/lib/common';
19
+ import { MetricsBackendApplicationContribution } from './metrics-backend-application-contribution';
20
+ import { MetricsContribution } from './metrics-contribution';
21
+ import * as assert from 'assert';
22
+
23
+ describe('MetricsBackendApplicationContribution:', () => {
24
+ let testContainer: Container;
25
+
26
+ function createBackendContribution(contributions: MetricsContribution[]): MetricsBackendApplicationContribution {
27
+ testContainer = new Container();
28
+
29
+ const module = new ContainerModule(bind => {
30
+ bind(ContributionProvider).toConstantValue({
31
+ getContributions: () => contributions
32
+ } as ContributionProvider<MetricsContribution>).whenTargetNamed(MetricsContribution);
33
+
34
+ bind(MetricsBackendApplicationContribution).toSelf().inSingletonScope();
35
+ });
36
+
37
+ testContainer.load(module);
38
+ return testContainer.get(MetricsBackendApplicationContribution);
39
+ }
40
+
41
+ describe('fetchMetricsFromProviders:', () => {
42
+ it('should concatenate multiple contribution results with newlines', () => {
43
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
44
+ const contrib2 = { getMetrics: () => 'metric2 100', startCollecting: () => { } };
45
+
46
+ const backend = createBackendContribution([contrib1, contrib2]);
47
+ const result = backend.fetchMetricsFromProviders();
48
+
49
+ assert.strictEqual(result, 'metric1 42\nmetric2 100\n');
50
+ });
51
+
52
+ it('should skip contributions that return empty string', () => {
53
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
54
+ const contrib2 = { getMetrics: () => '', startCollecting: () => { } };
55
+ const contrib3 = { getMetrics: () => 'metric3 200', startCollecting: () => { } };
56
+
57
+ const backend = createBackendContribution([contrib1, contrib2, contrib3]);
58
+ const result = backend.fetchMetricsFromProviders();
59
+
60
+ // A contribution that returns an empty string must not contribute a separator of its own
61
+ assert.strictEqual(result, 'metric1 42\nmetric3 200\n');
62
+ assert.strictEqual(result.includes('\n\n'), false, 'should not contain double newlines');
63
+ });
64
+
65
+ it('should skip contributions that return undefined (defensive)', () => {
66
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
67
+ const contrib2 = { getMetrics: () => undefined as unknown as string, startCollecting: () => { } };
68
+ const contrib3 = { getMetrics: () => 'metric3 200', startCollecting: () => { } };
69
+
70
+ const backend = createBackendContribution([contrib1, contrib2, contrib3]);
71
+ const result = backend.fetchMetricsFromProviders();
72
+
73
+ // undefined should not corrupt the output
74
+ assert.strictEqual(result, 'metric1 42\nmetric3 200\n');
75
+ assert.strictEqual(result.includes('undefined'), false, 'should not contain literal "undefined"');
76
+ });
77
+
78
+ it('should return empty string when all contributions return empty', () => {
79
+ const contrib1 = { getMetrics: () => '', startCollecting: () => { } };
80
+ const contrib2 = { getMetrics: () => '', startCollecting: () => { } };
81
+
82
+ const backend = createBackendContribution([contrib1, contrib2]);
83
+ const result = backend.fetchMetricsFromProviders();
84
+
85
+ assert.strictEqual(result, '');
86
+ });
87
+
88
+ it('should return empty string when there are no contributions', () => {
89
+ const backend = createBackendContribution([]);
90
+ const result = backend.fetchMetricsFromProviders();
91
+
92
+ assert.strictEqual(result, '');
93
+ });
94
+
95
+ it('should end a single contribution with exactly one newline', () => {
96
+ const contrib1 = { getMetrics: () => 'metric1 42', startCollecting: () => { } };
97
+
98
+ const backend = createBackendContribution([contrib1]);
99
+ const result = backend.fetchMetricsFromProviders();
100
+
101
+ // Single contribution should end with exactly one newline, not two
102
+ assert.strictEqual(result, 'metric1 42\n');
103
+ assert.strictEqual(result.endsWith('\n\n'), false);
104
+ });
105
+ });
106
+ });
@@ -45,7 +45,9 @@ export class MetricsBackendApplicationContribution implements BackendApplication
45
45
  }
46
46
 
47
47
  fetchMetricsFromProviders(): string {
48
- return this.metricsProviders.getContributions().reduce((total, contribution) =>
49
- total += contribution.getMetrics() + '\n', '');
48
+ return this.metricsProviders.getContributions().reduce((total, contribution) => {
49
+ const metrics = contribution.getMetrics();
50
+ return metrics ? total + metrics + '\n' : total;
51
+ }, '');
50
52
  }
51
53
  }