@dotcom-tool-kit/base 2.0.0 → 2.1.0-beta.1

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
@@ -66,6 +66,28 @@
66
66
  * dependencies
67
67
  * @dotcom-tool-kit/logger bumped from ^4.1.1 to ^4.2.0
68
68
 
69
+ ## [2.1.0](https://github.com/Financial-Times/dotcom-tool-kit/compare/base-v2.0.0...base-v2.1.0) (2026-01-13)
70
+
71
+
72
+ ### Features
73
+
74
+ * **telemetry:** add package to send client side metrics ([fcdea77](https://github.com/Financial-Times/dotcom-tool-kit/commit/fcdea779f0f95e635a100fbf62a1b7e3d31a45d4))
75
+
76
+
77
+ ### Bug Fixes
78
+
79
+ * it's not a conflict if there's only one child installation lol ([afa7863](https://github.com/Financial-Times/dotcom-tool-kit/commit/afa7863554744a65887507e9fea52b203fbb8cbb))
80
+
81
+
82
+ ### Dependencies
83
+
84
+ * The following workspace dependencies were updated
85
+ * dependencies
86
+ * @dotcom-tool-kit/conflict bumped from ^2.0.0 to ^2.0.1
87
+ * devDependencies
88
+ * @dotcom-tool-kit/config bumped from ^2.0.0 to ^2.0.1
89
+ * @dotcom-tool-kit/plugin bumped from ^2.0.0 to ^2.1.0
90
+
69
91
  ## [2.0.0](https://github.com/Financial-Times/dotcom-tool-kit/compare/base-v1.3.1...base-v2.0.0) (2025-10-28)
70
92
 
71
93
 
package/lib/hook.d.ts CHANGED
@@ -4,6 +4,7 @@ import { typeSymbol } from './symbols';
4
4
  import type { z } from 'zod';
5
5
  import type { Plugin } from '@dotcom-tool-kit/plugin';
6
6
  import { Conflict } from '@dotcom-tool-kit/conflict';
7
+ import { type TelemetryRecorder } from '@dotcom-tool-kit/telemetry';
7
8
  import type { Default } from './type-utils';
8
9
  export interface HookInstallation<Options = Record<string, unknown>> {
9
10
  options: Options;
@@ -19,12 +20,13 @@ export declare abstract class Hook<Options extends {
19
20
  options: z.output<Default<Options['hook'], z.ZodObject<Record<string, never>>>>;
20
21
  pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>;
21
22
  logger: Logger;
23
+ metrics: TelemetryRecorder;
22
24
  installGroup?: string;
23
25
  static get [typeSymbol](): symbol;
24
26
  get [typeSymbol](): symbol;
25
27
  static mergeChildInstallations(plugin: Plugin, childInstallations: (HookInstallation | Conflict<HookInstallation>)[]): (HookInstallation | Conflict<HookInstallation>)[];
26
28
  static overrideChildInstallations(plugin: Plugin, parentInstallation: HookInstallation, _childInstallations: (HookInstallation | Conflict<HookInstallation>)[]): (HookInstallation | Conflict<HookInstallation>)[];
27
- constructor(logger: Logger, id: string, options: z.output<Default<Options['hook'], z.ZodObject<Record<string, never>>>>, pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>);
29
+ constructor(logger: Logger, id: string, options: z.output<Default<Options['hook'], z.ZodObject<Record<string, never>>>>, pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>, metrics?: TelemetryRecorder);
28
30
  abstract isInstalled(): Promise<boolean>;
29
31
  abstract install(state?: State): Promise<State>;
30
32
  commitInstall(_state: State): Promise<void>;
@@ -33,7 +35,7 @@ export type HookConstructor = {
33
35
  new <O extends {
34
36
  plugin: z.ZodTypeAny;
35
37
  hook: z.ZodTypeAny;
36
- }>(logger: Logger, id: string, options: z.infer<O['hook']>, pluginOptions: z.infer<O['plugin']>): Hook<O, unknown>;
38
+ }>(logger: Logger, id: string, options: z.infer<O['hook']>, pluginOptions: z.infer<O['plugin']>, metrics?: TelemetryRecorder): Hook<O, unknown>;
37
39
  };
38
40
  export type HookClass = HookConstructor & typeof Hook;
39
41
  //# sourceMappingURL=hook.d.ts.map
package/lib/hook.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
package/lib/hook.js CHANGED
@@ -4,11 +4,13 @@ exports.Hook = void 0;
4
4
  const base_1 = require("./base");
5
5
  const symbols_1 = require("./symbols");
6
6
  const conflict_1 = require("@dotcom-tool-kit/conflict");
7
+ const telemetry_1 = require("@dotcom-tool-kit/telemetry");
7
8
  class Hook extends base_1.Base {
8
9
  id;
9
10
  options;
10
11
  pluginOptions;
11
12
  logger;
13
+ metrics;
12
14
  // This field is used to collect hooks that share state when running their
13
15
  // install methods. All hooks in the same group will run their install method
14
16
  // one after the other, and then their commitInstall method will be run with
@@ -21,6 +23,9 @@ class Hook extends base_1.Base {
21
23
  return symbols_1.hookSymbol;
22
24
  }
23
25
  static mergeChildInstallations(plugin, childInstallations) {
26
+ if (childInstallations.length === 1) {
27
+ return childInstallations;
28
+ }
24
29
  return [
25
30
  {
26
31
  plugin,
@@ -31,12 +36,15 @@ class Hook extends base_1.Base {
31
36
  static overrideChildInstallations(plugin, parentInstallation, _childInstallations) {
32
37
  return [parentInstallation];
33
38
  }
34
- constructor(logger, id, options, pluginOptions) {
39
+ constructor(logger, id, options, pluginOptions,
40
+ // TODO:IM:20251215 make this a required parameter in the next major version
41
+ metrics = new telemetry_1.MockTelemetryClient()) {
35
42
  super();
36
43
  this.id = id;
37
44
  this.options = options;
38
45
  this.pluginOptions = pluginOptions;
39
46
  this.logger = logger.child({ hook: this.constructor.name });
47
+ this.metrics = metrics.scoped({ hook: this.constructor.name });
40
48
  }
41
49
  async commitInstall(_state) {
42
50
  return;
package/lib/task.d.ts CHANGED
@@ -3,6 +3,7 @@ import { Base } from './base';
3
3
  import { typeSymbol } from './symbols';
4
4
  import type { Logger } from 'winston';
5
5
  import type { ValidConfig } from '@dotcom-tool-kit/config';
6
+ import { type TelemetryRecorder } from '@dotcom-tool-kit/telemetry';
6
7
  import { Plugin } from '@dotcom-tool-kit/plugin';
7
8
  import type { Default } from './type-utils';
8
9
  import type { ReadonlyDeep } from 'type-fest';
@@ -23,7 +24,8 @@ export declare abstract class Task<Options extends {
23
24
  static get [typeSymbol](): symbol;
24
25
  get [typeSymbol](): symbol;
25
26
  logger: Logger;
26
- constructor(logger: Logger, id: string, pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>, options: z.output<Default<Options['task'], z.ZodObject<Record<string, never>>>>, plugin: Plugin);
27
+ metrics: TelemetryRecorder;
28
+ constructor(logger: Logger, id: string, pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>, options: z.output<Default<Options['task'], z.ZodObject<Record<string, never>>>>, plugin: Plugin, metrics?: TelemetryRecorder);
27
29
  abstract run(runContext: TaskRunContext): Promise<void>;
28
30
  stop(): Promise<void>;
29
31
  }
@@ -31,7 +33,7 @@ export type TaskConstructor = {
31
33
  new <O extends {
32
34
  plugin: z.ZodTypeAny;
33
35
  task: z.ZodTypeAny;
34
- }>(logger: Logger, id: string, pluginOptions: Partial<z.infer<O['plugin']>>, options: Partial<z.infer<O['task']>>, plugin: Plugin): Task<O>;
36
+ }>(logger: Logger, id: string, pluginOptions: Partial<z.infer<O['plugin']>>, options: Partial<z.infer<O['task']>>, plugin: Plugin, metrics?: TelemetryRecorder): Task<O>;
35
37
  };
36
38
  export type TaskClass = TaskConstructor & typeof Task;
37
39
  //# sourceMappingURL=task.d.ts.map
package/lib/task.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAc,UAAU,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;CAClC,CAAA;AAED,8BAAsB,IAAI,CACxB,OAAO,SAAS;IACd,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAA;IACrB,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAA;CACpB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CACxB,SAAQ,IAAI;IAaH,EAAE,EAAE,MAAM;IACV,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,MAAM;IAfvB,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,MAAM,CAEhC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAEzB;IAED,MAAM,EAAE,MAAM,CAAA;gBAGZ,MAAM,EAAE,MAAM,EACP,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EACvF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAC/E,MAAM,EAAE,MAAM;IAMvB,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,SAAS;QAAE,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;QAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAA;KAAE,EACzD,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC5C,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,IAAI,CAAC,CAAC,CAAC,CAAA;CACX,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,OAAO,IAAI,CAAA"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"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"}
package/lib/task.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Task = void 0;
4
4
  const base_1 = require("./base");
5
5
  const symbols_1 = require("./symbols");
6
+ const telemetry_1 = require("@dotcom-tool-kit/telemetry");
6
7
  class Task extends base_1.Base {
7
8
  id;
8
9
  pluginOptions;
@@ -15,13 +16,17 @@ class Task extends base_1.Base {
15
16
  return symbols_1.taskSymbol;
16
17
  }
17
18
  logger;
18
- constructor(logger, id, pluginOptions, options, plugin) {
19
+ metrics;
20
+ constructor(logger, id, pluginOptions, options, plugin,
21
+ // TODO:IM:20251215 make this a required parameter in the next major version
22
+ metrics = new telemetry_1.MockTelemetryClient()) {
19
23
  super();
20
24
  this.id = id;
21
25
  this.pluginOptions = pluginOptions;
22
26
  this.options = options;
23
27
  this.plugin = plugin;
24
28
  this.logger = logger.child({ task: id });
29
+ this.metrics = metrics.scoped({ task: id });
25
30
  }
26
31
  // not abstract for default behaviour of doing nothing
27
32
  // eslint-disable-next-line @typescript-eslint/no-empty-function
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotcom-tool-kit/base",
3
- "version": "2.0.0",
3
+ "version": "2.1.0-beta.1",
4
4
  "description": "",
5
5
  "main": "lib",
6
6
  "scripts": {
@@ -10,15 +10,16 @@
10
10
  "author": "",
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
- "@dotcom-tool-kit/conflict": "^2.0.0",
13
+ "@dotcom-tool-kit/conflict": "^2.0.1-beta.1",
14
14
  "@dotcom-tool-kit/logger": "^5.0.0",
15
+ "@dotcom-tool-kit/telemetry": "^1.0.0",
15
16
  "@dotcom-tool-kit/validated": "^2.0.0",
16
17
  "semver": "^7.7.3",
17
18
  "winston": "^3.17.0"
18
19
  },
19
20
  "devDependencies": {
20
- "@dotcom-tool-kit/config": "^2.0.0",
21
- "@dotcom-tool-kit/plugin": "^2.0.0",
21
+ "@dotcom-tool-kit/config": "^2.0.1-beta.1",
22
+ "@dotcom-tool-kit/plugin": "^2.1.0-beta.1",
22
23
  "type-fest": "^4.41.0",
23
24
  "winston": "^3.17.0",
24
25
  "zod": "^3.24.4"
@@ -29,4 +30,4 @@
29
30
  "engines": {
30
31
  "node": ">=20.x"
31
32
  }
32
- }
33
+ }
package/src/hook.ts CHANGED
@@ -4,6 +4,7 @@ import { hookSymbol, typeSymbol } from './symbols'
4
4
  import type { z } from 'zod'
5
5
  import type { Plugin } from '@dotcom-tool-kit/plugin'
6
6
  import { Conflict, isConflict } from '@dotcom-tool-kit/conflict'
7
+ import { MockTelemetryClient, type TelemetryRecorder } from '@dotcom-tool-kit/telemetry'
7
8
  import type { Default } from './type-utils'
8
9
 
9
10
  export interface HookInstallation<Options = Record<string, unknown>> {
@@ -21,6 +22,7 @@ export abstract class Hook<
21
22
  State = unknown
22
23
  > extends Base {
23
24
  logger: Logger
25
+ metrics: TelemetryRecorder
24
26
  // This field is used to collect hooks that share state when running their
25
27
  // install methods. All hooks in the same group will run their install method
26
28
  // one after the other, and then their commitInstall method will be run with
@@ -39,6 +41,10 @@ export abstract class Hook<
39
41
  plugin: Plugin,
40
42
  childInstallations: (HookInstallation | Conflict<HookInstallation>)[]
41
43
  ): (HookInstallation | Conflict<HookInstallation>)[] {
44
+ if (childInstallations.length === 1) {
45
+ return childInstallations
46
+ }
47
+
42
48
  return [
43
49
  {
44
50
  plugin,
@@ -61,10 +67,13 @@ export abstract class Hook<
61
67
  logger: Logger,
62
68
  public id: string,
63
69
  public options: z.output<Default<Options['hook'], z.ZodObject<Record<string, never>>>>,
64
- public pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>
70
+ public pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>,
71
+ // TODO:IM:20251215 make this a required parameter in the next major version
72
+ metrics: TelemetryRecorder = new MockTelemetryClient()
65
73
  ) {
66
74
  super()
67
75
  this.logger = logger.child({ hook: this.constructor.name })
76
+ this.metrics = metrics.scoped({ hook: this.constructor.name })
68
77
  }
69
78
 
70
79
  abstract isInstalled(): Promise<boolean>
@@ -79,7 +88,8 @@ export type HookConstructor = {
79
88
  logger: Logger,
80
89
  id: string,
81
90
  options: z.infer<O['hook']>,
82
- pluginOptions: z.infer<O['plugin']>
91
+ pluginOptions: z.infer<O['plugin']>,
92
+ metrics?: TelemetryRecorder
83
93
  ): Hook<O, unknown>
84
94
  }
85
95
 
package/src/task.ts CHANGED
@@ -3,6 +3,7 @@ import { Base } from './base'
3
3
  import { taskSymbol, typeSymbol } from './symbols'
4
4
  import type { Logger } from 'winston'
5
5
  import type { ValidConfig } from '@dotcom-tool-kit/config'
6
+ import { MockTelemetryClient, type TelemetryRecorder } from '@dotcom-tool-kit/telemetry'
6
7
  import { Plugin } from '@dotcom-tool-kit/plugin'
7
8
  import type { Default } from './type-utils'
8
9
  import type { ReadonlyDeep } from 'type-fest'
@@ -29,16 +30,20 @@ export abstract class Task<
29
30
  }
30
31
 
31
32
  logger: Logger
33
+ metrics: TelemetryRecorder
32
34
 
33
35
  constructor(
34
36
  logger: Logger,
35
37
  public id: string,
36
38
  public pluginOptions: z.output<Default<Options['plugin'], z.ZodObject<Record<string, never>>>>,
37
39
  public options: z.output<Default<Options['task'], z.ZodObject<Record<string, never>>>>,
38
- public plugin: Plugin
40
+ public plugin: Plugin,
41
+ // TODO:IM:20251215 make this a required parameter in the next major version
42
+ metrics: TelemetryRecorder = new MockTelemetryClient()
39
43
  ) {
40
44
  super()
41
45
  this.logger = logger.child({ task: id })
46
+ this.metrics = metrics.scoped({ task: id })
42
47
  }
43
48
 
44
49
  abstract run(runContext: TaskRunContext): Promise<void>
@@ -54,7 +59,8 @@ export type TaskConstructor = {
54
59
  id: string,
55
60
  pluginOptions: Partial<z.infer<O['plugin']>>,
56
61
  options: Partial<z.infer<O['task']>>,
57
- plugin: Plugin
62
+ plugin: Plugin,
63
+ metrics?: TelemetryRecorder
58
64
  ): Task<O>
59
65
  }
60
66
 
package/tsconfig.json CHANGED
@@ -15,6 +15,9 @@
15
15
  },
16
16
  {
17
17
  "path": "../config"
18
+ },
19
+ {
20
+ "path": "../telemetry"
18
21
  }
19
22
  ],
20
23
  "compilerOptions": {