@equinor/fusion-framework 7.3.20 → 7.4.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Change Log
2
2
 
3
+ ## 7.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#3492](https://github.com/equinor/fusion-framework/pull/3492) [`7ba4713`](https://github.com/equinor/fusion-framework/commit/7ba47139a8d7cfbb757bd4626425c611e22c2126) Thanks [@odinr](https://github.com/odinr)! - Integrate telemetry module into framework core.
8
+
9
+ - Add TelemetryModule to FusionModules type definition
10
+ - Enable telemetry in FrameworkConfigurator with default configuration
11
+ - Add event$ observable with framework-specific event prefixing
12
+ - Include framework metadata in telemetry collection
13
+
14
+ resolves: [#3491](https://github.com/equinor/fusion-framework/issues/3491)
15
+
16
+ ### Patch Changes
17
+
18
+ - [#3490](https://github.com/equinor/fusion-framework/pull/3490) [`45954e5`](https://github.com/equinor/fusion-framework/commit/45954e5db471a2faa24e88e41fc6d6c18817d6d1) Thanks [@odinr](https://github.com/odinr)! - Remove explicit logger initialization from configurator constructors in favor of telemetry.
19
+
20
+ - Removed `this.logger = new ModuleConsoleLogger(...)` from FrameworkConfigurator, AppConfigurator, and WidgetConfigurator constructors
21
+ - Logger functionality will be handled through telemetry module with console logging adapter
22
+
23
+ This prepares the configurators to use telemetry for logging instead of direct console logger initialization.
24
+
25
+ - Updated dependencies [[`6cb288b`](https://github.com/equinor/fusion-framework/commit/6cb288b9e1ec4fae68ae6899735c176837bb4275), [`a66d70a`](https://github.com/equinor/fusion-framework/commit/a66d70a9fa40ab14f2534be4f22b6d1f602097a0), [`45954e5`](https://github.com/equinor/fusion-framework/commit/45954e5db471a2faa24e88e41fc6d6c18817d6d1), [`4e78565`](https://github.com/equinor/fusion-framework/commit/4e7856590f73fee840b065a0e4d89962e167ed9e), [`0bad642`](https://github.com/equinor/fusion-framework/commit/0bad642205a7f780dcb6685243102b65b3755fa2), [`45954e5`](https://github.com/equinor/fusion-framework/commit/45954e5db471a2faa24e88e41fc6d6c18817d6d1)]:
26
+ - @equinor/fusion-framework-module-context@7.0.1
27
+ - @equinor/fusion-framework-module-http@7.0.2
28
+ - @equinor/fusion-framework-module@5.0.3
29
+ - @equinor/fusion-framework-module-telemetry@4.2.0
30
+ - @equinor/fusion-framework-module-service-discovery@9.0.2
31
+
3
32
  ## 7.3.20
4
33
 
5
34
  ### Patch Changes
@@ -1,26 +1,132 @@
1
- import { ModuleConsoleLogger, ModulesConfigurator, } from '@equinor/fusion-framework-module';
1
+ import { ModulesConfigurator, } from '@equinor/fusion-framework-module';
2
2
  import event from '@equinor/fusion-framework-module-event';
3
3
  import http, { configureHttpClient, configureHttp, } from '@equinor/fusion-framework-module-http';
4
4
  import auth from '@equinor/fusion-framework-module-msal';
5
5
  import context from '@equinor/fusion-framework-module-context';
6
6
  import disco from '@equinor/fusion-framework-module-service-discovery';
7
7
  import services from '@equinor/fusion-framework-module-services';
8
+ import telemetry, { enableTelemetry } from '@equinor/fusion-framework-module-telemetry';
9
+ import { version } from './version.js';
8
10
  /**
9
11
  * Module configurator for Framework modules
10
12
  * @template TModules - Addition modules
11
13
  * @template TRef - usually undefined, optional references
12
14
  */
13
15
  export class FrameworkConfigurator extends ModulesConfigurator {
16
+ /**
17
+ * Creates a new FrameworkConfigurator instance with default telemetry configuration.
18
+ *
19
+ * Initializes the framework with core modules (event, auth, http, service discovery,
20
+ * services, context, and telemetry) and sets up default telemetry that includes
21
+ * framework version metadata and 'framework' scope for all telemetry events.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const configurator = new FrameworkConfigurator();
26
+ * // Now ready to configure additional modules
27
+ * ```
28
+ */
14
29
  constructor() {
15
- super([event, auth, http, disco, services, context]);
16
- this.logger = new ModuleConsoleLogger('FrameworkConfigurator');
30
+ super([event, auth, http, disco, services, context, telemetry]);
31
+ // default configuration
32
+ enableTelemetry(this, {
33
+ configure: (builder) => {
34
+ builder.setMetadata({
35
+ fusion: {
36
+ type: 'framework-telemetry',
37
+ framework: {
38
+ version,
39
+ },
40
+ },
41
+ });
42
+ builder.setDefaultScope(['framework']);
43
+ },
44
+ });
17
45
  }
46
+ /**
47
+ * Configures the global HTTP module settings such as base URLs, default headers,
48
+ * request/response interceptors, and timeout settings.
49
+ *
50
+ * This affects all HTTP requests made through the framework's HTTP module.
51
+ * Use this for application-wide HTTP configuration.
52
+ *
53
+ * @param args - HTTP module configuration arguments (same as configureHttp function)
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * configurator.configureHttp({
58
+ * baseUri: 'https://api.example.com',
59
+ * defaultHeaders: { 'X-App-Version': '1.0.0' }
60
+ * });
61
+ * ```
62
+ */
18
63
  configureHttp(...args) {
19
64
  this.addConfig(configureHttp(...args));
20
65
  }
66
+ /**
67
+ * Configures a named HTTP client instance with specific settings.
68
+ *
69
+ * Unlike configureHttp which sets global HTTP settings, this creates a named client
70
+ * that can have its own base URL, headers, interceptors, and other HTTP-specific
71
+ * configuration. Useful for connecting to different APIs or services with different requirements.
72
+ *
73
+ * @param args - HTTP client configuration arguments: [name, clientOptions]
74
+ * where name is a string identifier and clientOptions contains HTTP settings
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Configure a client for external API
79
+ * configurator.configureHttpClient('external-api', {
80
+ * baseUri: 'https://external-api.com',
81
+ * defaultHeaders: { 'Authorization': 'Bearer token' }
82
+ * });
83
+ *
84
+ * // Configure a client for internal services
85
+ * configurator.configureHttpClient('internal', {
86
+ * baseUri: 'https://internal.company.com',
87
+ * timeout: 10000
88
+ * });
89
+ * ```
90
+ */
21
91
  configureHttpClient(...args) {
22
92
  this.addConfig(configureHttpClient(...args));
23
93
  }
94
+ /**
95
+ * Configures Microsoft Authentication Library (MSAL) authentication for the framework.
96
+ *
97
+ * This sets up OAuth 2.0 / OpenID Connect authentication using Azure AD or other
98
+ * MSAL-compatible identity providers. The authentication module will handle token
99
+ * acquisition, refresh, and user session management.
100
+ *
101
+ * @param cb_or_config - Authentication configuration. Can be either:
102
+ * - A callback function that receives an auth builder for advanced configuration
103
+ * - A client configuration object with MSAL settings
104
+ * @param requiresAuth - Whether the application requires authentication to function.
105
+ * When true (default), unauthenticated users cannot access the app.
106
+ * When false, authentication is optional but available when needed.
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * // Simple configuration with client config object
111
+ * configurator.configureMsal({
112
+ * clientId: 'your-client-id',
113
+ * authority: 'https://login.microsoftonline.com/your-tenant-id'
114
+ * });
115
+ *
116
+ * // Advanced configuration with callback
117
+ * configurator.configureMsal((builder) => {
118
+ * builder.setClientConfig({
119
+ * clientId: 'your-client-id',
120
+ * authority: 'https://login.microsoftonline.com/your-tenant-id'
121
+ * });
122
+ * builder.setScopes(['User.Read', 'api://your-api/scope']);
123
+ * builder.setRequiresAuth(true);
124
+ * });
125
+ *
126
+ * // Optional authentication
127
+ * configurator.configureMsal(config, false);
128
+ * ```
129
+ */
24
130
  configureMsal(cb_or_config, requiresAuth = true) {
25
131
  this.addConfig({
26
132
  module: auth,
@@ -37,9 +143,70 @@ export class FrameworkConfigurator extends ModulesConfigurator {
37
143
  },
38
144
  });
39
145
  }
146
+ /**
147
+ * Configures the service discovery module to automatically find and connect to services.
148
+ *
149
+ * Service discovery allows the framework to dynamically locate microservices and APIs
150
+ * at runtime rather than hardcoding their URLs. This is essential in distributed systems
151
+ * where services may be deployed across multiple environments or scaled dynamically.
152
+ *
153
+ * @param args - Configuration object for service discovery
154
+ * @param args.client - HTTP client configuration used to communicate with the
155
+ * service discovery registry. Typically includes base URL,
156
+ * authentication, and timeout settings.
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * configurator.configureServiceDiscovery({
161
+ * client: {
162
+ * baseUri: 'https://service-registry.company.com',
163
+ * defaultHeaders: { 'Authorization': 'Bearer token' },
164
+ * timeout: 5000
165
+ * }
166
+ * });
167
+ * ```
168
+ */
40
169
  configureServiceDiscovery(args) {
41
170
  this.configureHttpClient('service_discovery', args.client);
42
171
  }
172
+ /**
173
+ * Configures application telemetry and observability settings.
174
+ *
175
+ * Telemetry enables tracking of application usage, performance metrics, errors,
176
+ * and custom events. This helps with monitoring, debugging, and understanding
177
+ * how your application is being used. The framework comes with default telemetry
178
+ * that includes framework version and scope information.
179
+ *
180
+ * @param cb - Configuration callback function that receives a telemetry builder.
181
+ * Use this to customize telemetry settings like event scopes, metadata,
182
+ * sampling rates, and custom instrumentation.
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * configurator.configureTelemetry((builder) => {
187
+ * // Add custom metadata to all telemetry events
188
+ * builder.setMetadata({
189
+ * application: 'my-app',
190
+ * environment: 'production',
191
+ * version: '1.2.3'
192
+ * });
193
+ *
194
+ * // Set custom scopes for filtering events
195
+ * builder.setDefaultScope(['app', 'performance']);
196
+ *
197
+ * // Configure sampling (only send 10% of events)
198
+ * builder.setSamplingRate(0.1);
199
+ *
200
+ * // Add custom instrumentation
201
+ * builder.addInstrumentation('custom-operation', (context) => {
202
+ * // Track custom metrics
203
+ * });
204
+ * });
205
+ * ```
206
+ */
207
+ configureTelemetry(cb) {
208
+ enableTelemetry(this, cb);
209
+ }
43
210
  }
44
211
  export default FrameworkConfigurator;
45
212
  //# sourceMappingURL=FrameworkConfigurator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameworkConfigurator.js","sourceRoot":"","sources":["../../src/FrameworkConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,MAAM,wCAAwC,CAAC;AAE3D,OAAO,IAAI,EAAE,EACX,mBAAmB,EACnB,aAAa,GAEd,MAAM,uCAAuC,CAAC;AAG/C,OAAO,IAA2B,MAAM,uCAAuC,CAAC;AAEhF,OAAO,OAAO,MAAM,0CAA0C,CAAC;AAE/D,OAAO,KAAK,MAAM,oDAAoD,CAAC;AACvE,OAAO,QAAQ,MAAM,2CAA2C,CAAC;AAKjE;;;;GAIG;AACH,MAAM,OAAO,qBAIX,SAAQ,mBAAkD;IAC1D;QACE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,GAAG,IAAsC;QAC5D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAEM,mBAAmB,CAAC,GAAG,IAA4C;QACxE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEM,aAAa,CAAC,YAA6C,EAAE,YAAY,GAAG,IAAI;QACrF,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;oBACvC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,yBAAyB,CAAC,IAAmD;QAClF,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"FrameworkConfigurator.js","sourceRoot":"","sources":["../../src/FrameworkConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,GAEpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,MAAM,wCAAwC,CAAC;AAE3D,OAAO,IAAI,EAAE,EACX,mBAAmB,EACnB,aAAa,GAEd,MAAM,uCAAuC,CAAC;AAG/C,OAAO,IAA2B,MAAM,uCAAuC,CAAC;AAEhF,OAAO,OAAO,MAAM,0CAA0C,CAAC;AAE/D,OAAO,KAAK,MAAM,oDAAoD,CAAC;AACvE,OAAO,QAAQ,MAAM,2CAA2C,CAAC;AACjE,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAIxF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC;;;;GAIG;AACH,MAAM,OAAO,qBAIX,SAAQ,mBAAkD;IAC1D;;;;;;;;;;;;OAYG;IACH;QACE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAEhE,wBAAwB;QACxB,eAAe,CAAC,IAAI,EAAE;YACpB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,OAAO,CAAC,WAAW,CAAC;oBAClB,MAAM,EAAE;wBACN,IAAI,EAAE,qBAAqB;wBAC3B,SAAS,EAAE;4BACT,OAAO;yBACR;qBACF;iBACF,CAAC,CAAC;gBACH,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACzC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,aAAa,CAAC,GAAG,IAAsC;QAC5D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACI,mBAAmB,CAAC,GAAG,IAA4C;QACxE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACI,aAAa,CAAC,YAA6C,EAAE,YAAY,GAAG,IAAI;QACrF,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;oBACvC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,yBAAyB,CAAC,IAAmD;QAClF,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACI,kBAAkB,CAAC,EAAyC;QACjE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { firstValueFrom, take } from 'rxjs';
3
+ import { FrameworkConfigurator } from '../FrameworkConfigurator.js';
4
+ import { SemanticVersion } from '@equinor/fusion-framework-module';
5
+ describe('FrameworkConfigurator', () => {
6
+ let configurator;
7
+ // Create a mock module for testing
8
+ const createMockModule = (name, version = '1.0.0') => ({
9
+ name,
10
+ version: new SemanticVersion(version),
11
+ initialize: () => ({ mockInstance: true }),
12
+ });
13
+ beforeEach(() => {
14
+ configurator = new FrameworkConfigurator();
15
+ });
16
+ describe('Event Name Prefixing', () => {
17
+ it('should prefix event names with "FrameworkConfigurator::"', async () => {
18
+ // Trigger event by adding a config
19
+ configurator.addConfig({
20
+ module: createMockModule('test', '1.0.0'),
21
+ configure: () => { },
22
+ });
23
+ // Wait for the first event to be emitted
24
+ const event = await firstValueFrom(configurator.event$.pipe(take(1)));
25
+ expect(event.name).toMatch(/^FrameworkConfigurator::/);
26
+ });
27
+ });
28
+ });
29
+ //# sourceMappingURL=FrameworkConfigurator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameworkConfigurator.test.js","sourceRoot":"","sources":["../../../src/__tests__/FrameworkConfigurator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,YAAmC,CAAC;IAExC,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,OAAO,GAAG,OAAO,EAAa,EAAE,CAAC,CAAC;QACxE,IAAI;QACJ,OAAO,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC;QACrC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,YAAY,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,mCAAmC;YACnC,YAAY,CAAC,SAAS,CAAC;gBACrB,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;gBACzC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;aACpB,CAAC,CAAC;YAEH,yCAAyC;YACzC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '7.3.20';
2
+ export const version = '7.4.0';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}