@edynamix/mf-isolation 0.0.2 → 0.0.4

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/README.md CHANGED
@@ -5,7 +5,7 @@ CSS isolation and Angular overlay helpers for microfrontends.
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- npm install @edynamix/mf-isolation
8
+ bun add @edynamix/mf-isolation@latest
9
9
  ```
10
10
 
11
11
  ## Runtime boundary
@@ -62,16 +62,61 @@ Run this plugin through Vite/PostCSS before Angular AOT compilation. Do not comb
62
62
 
63
63
  ## Angular CDK overlays
64
64
 
65
+ The Angular integration targets Angular/CDK 19.x. In a hosted application, install the complete provider array so global and connected overlays share the module boundary's viewport and coordinate system:
66
+
65
67
  ```ts
66
68
  import { provideMfOverlayRoot } from '@edynamix/mf-isolation/angular';
67
69
 
68
- const providers = provideMfOverlayRoot(mountElement);
70
+ const providers = provideMfOverlayRoot(overlayRoot);
71
+ ```
72
+
73
+ Pass all of `providers` through the application bootstrap. Calling `provideMfOverlayRoot()` without an element preserves CDK's normal document-viewport behavior.
74
+
75
+ Legacy NgModule applications that receive the root through an injection token must install both providers through the token-aware helper:
76
+
77
+ ```ts
78
+ import { InjectionToken, NgModule } from '@angular/core';
79
+ import { provideMfOverlayRootFromToken } from '@edynamix/mf-isolation/angular';
80
+
81
+ export const MF_OVERLAY_ROOT = new InjectionToken<HTMLElement>('MF_OVERLAY_ROOT');
82
+
83
+ @NgModule({
84
+ providers: [...provideMfOverlayRootFromToken(MF_OVERLAY_ROOT)],
85
+ })
86
+ export class AppModule {}
87
+ ```
88
+
89
+ Provide the runtime `MF_OVERLAY_ROOT` value through the existing platform/bootstrap injector. Do not extract only the first provider from `provideMfOverlayRoot()`; that installs the container but omits boundary-aware connected positioning.
90
+
91
+ The Angular entry point requires `@angular/core`, `@angular/common`, and `@angular/cdk` 19.x.
92
+
93
+ ## Host-owned Zone.js
94
+
95
+ Standalone Angular applications load their own Zone.js runtime as usual:
96
+
97
+ ```ts
98
+ import 'zone.js';
99
+ ```
100
+
101
+ When the application runs as a hosted lifecycle, the host owns the single Zone.js runtime. Check that runtime before dynamically importing any Angular code:
102
+
103
+ ```ts
104
+ import { assertHostZoneRuntime } from '@edynamix/mf-isolation/angular-runtime';
105
+ import type { IShellContext } from './shell-context';
106
+
107
+ export const mount = async (host: HTMLElement, context: IShellContext): Promise<void> => {
108
+ assertHostZoneRuntime();
109
+
110
+ const lifecycle = await import('./lifecycle-impl');
111
+ return lifecycle.mount(host, context);
112
+ };
69
113
  ```
70
114
 
71
- The Angular entry point requires `@angular/core` and `@angular/cdk`.
115
+ `angular-runtime` is framework-free. It verifies that `globalThis.Zone` is a function; it does not load or modify Zone.js.
72
116
 
73
117
  ## Exports
74
118
 
75
119
  - `@edynamix/mf-isolation`
76
120
  - `@edynamix/mf-isolation/angular`
121
+ - `@edynamix/mf-isolation/angular-runtime`
77
122
  - `@edynamix/mf-isolation/postcss`
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Verifies the host-owned Zone.js runtime before Angular is loaded.
3
+ *
4
+ * This check is intentionally framework-free and must run before dynamically
5
+ * importing an Angular bootstrap module.
6
+ */
7
+ export declare const assertHostZoneRuntime: () => void;
8
+ //# sourceMappingURL=angular-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-runtime.d.ts","sourceRoot":"","sources":["../src/angular-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAO,IAMxC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Verifies the host-owned Zone.js runtime before Angular is loaded.
3
+ *
4
+ * This check is intentionally framework-free and must run before dynamically
5
+ * importing an Angular bootstrap module.
6
+ */
7
+ export const assertHostZoneRuntime = () => {
8
+ const zoneRuntime = globalThis.Zone;
9
+ if (typeof zoneRuntime !== 'function') {
10
+ throw new Error('Host Zone.js runtime is missing. Expected globalThis.Zone to be a function before loading Angular.');
11
+ }
12
+ };
13
+ //# sourceMappingURL=angular-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-runtime.js","sourceRoot":"","sources":["../src/angular-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC9C,MAAM,WAAW,GAAI,UAAqD,CAAC,IAAI,CAAC;IAEhF,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;IACxH,CAAC;AACH,CAAC,CAAC"}
package/dist/angular.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import type { StaticProvider } from '@angular/core';
1
+ import type { ProviderToken, StaticProvider } from '@angular/core';
2
2
  export declare const provideMfOverlayRoot: (overlayRoot?: HTMLElement) => StaticProvider[];
3
+ export declare const provideMfOverlayRootFromToken: (overlayRootToken: ProviderToken<HTMLElement>) => StaticProvider[];
3
4
  //# sourceMappingURL=angular.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular.d.ts","sourceRoot":"","sources":["../src/angular.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAkBpD,eAAO,MAAM,oBAAoB,GAAI,cAAc,WAAW,KAAG,cAAc,EAW9E,CAAC"}
1
+ {"version":3,"file":"angular.d.ts","sourceRoot":"","sources":["../src/angular.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA2SnE,eAAO,MAAM,oBAAoB,GAAI,cAAc,WAAW,KAAG,cAAc,EAkB9E,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,kBAAkB,aAAa,CAAC,WAAW,CAAC,KAAG,cAAc,EAE1G,CAAC"}
package/dist/angular.js CHANGED
@@ -1,17 +1,246 @@
1
- import { OverlayContainer } from '@angular/cdk/overlay';
1
+ import { FlexibleConnectedPositionStrategy, GlobalPositionStrategy, OverlayContainer, OverlayPositionBuilder, } from '@angular/cdk/overlay';
2
+ import { Platform } from '@angular/cdk/platform';
3
+ import { ViewportRuler } from '@angular/cdk/scrolling';
4
+ import { DOCUMENT } from '@angular/common';
5
+ // Mirrors the CDK 19 overlay-prebuilt.css structural rules while intentionally excluding document-level scroll blocking.
6
+ const CDK_OVERLAY_STRUCTURAL_CSS = `
7
+ .cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}
8
+ .cdk-overlay-container{position:fixed;z-index:1000}
9
+ .cdk-overlay-container:empty{display:none}
10
+ .cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}
11
+ .cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%;z-index:1000}
12
+ .cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation;z-index:1000;transition:opacity 400ms cubic-bezier(0.25,0.8,0.25,1)}
13
+ @media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}
14
+ .cdk-overlay-backdrop-showing{opacity:1}
15
+ @media(forced-colors:active){.cdk-overlay-backdrop-showing{opacity:.6}}
16
+ .cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}
17
+ .cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}
18
+ .cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}
19
+ .cdk-overlay-backdrop-noop-animation{transition:none}
20
+ .cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px;z-index:1000}
21
+ `;
22
+ const translateRectToBoundary = (rect, boundary) => {
23
+ const left = rect.left - boundary.left;
24
+ const top = rect.top - boundary.top;
25
+ return {
26
+ bottom: top + rect.height,
27
+ height: rect.height,
28
+ left,
29
+ right: left + rect.width,
30
+ top,
31
+ width: rect.width,
32
+ x: left,
33
+ y: top,
34
+ };
35
+ };
36
+ const getBoundaryRect = (overlayRoot) => {
37
+ const { height, width } = overlayRoot.getBoundingClientRect();
38
+ return {
39
+ bottom: height,
40
+ height,
41
+ left: 0,
42
+ right: width,
43
+ top: 0,
44
+ width,
45
+ x: 0,
46
+ y: 0,
47
+ };
48
+ };
49
+ const createBoundaryDocument = (document, overlayRoot) => {
50
+ const boundaryDocumentElement = new Proxy(document.documentElement, {
51
+ get: (target, property, receiver) => {
52
+ if (property === 'clientHeight') {
53
+ return overlayRoot.getBoundingClientRect().height;
54
+ }
55
+ if (property === 'clientWidth') {
56
+ return overlayRoot.getBoundingClientRect().width;
57
+ }
58
+ return Reflect.get(target, property, receiver);
59
+ },
60
+ });
61
+ return new Proxy(document, {
62
+ get: (target, property, receiver) => {
63
+ if (property === 'documentElement') {
64
+ return boundaryDocumentElement;
65
+ }
66
+ return Reflect.get(target, property, receiver);
67
+ },
68
+ });
69
+ };
70
+ const createBoundaryViewportRuler = (viewportRuler, overlayRoot) => {
71
+ const boundaryViewportRuler = Object.create(viewportRuler);
72
+ boundaryViewportRuler.getViewportRect = () => getBoundaryRect(overlayRoot);
73
+ boundaryViewportRuler.getViewportScrollPosition = () => ({ left: 0, top: 0 });
74
+ boundaryViewportRuler.getViewportSize = () => {
75
+ const { height, width } = getBoundaryRect(overlayRoot);
76
+ return { height, width };
77
+ };
78
+ return boundaryViewportRuler;
79
+ };
80
+ const adaptConnectedPositionStrategy = (strategy, overlayRoot, observeBoundary) => {
81
+ const internals = strategy;
82
+ const getOriginRect = internals._getOriginRect.bind(strategy);
83
+ const getOriginPoint = internals._getOriginPoint.bind(strategy);
84
+ const attach = strategy.attach.bind(strategy);
85
+ const detach = strategy.detach.bind(strategy);
86
+ const dispose = strategy.dispose.bind(strategy);
87
+ let stopObserving = () => { };
88
+ internals._getOriginRect = () => {
89
+ return translateRectToBoundary(getOriginRect(), overlayRoot.getBoundingClientRect());
90
+ };
91
+ internals._getOriginPoint = (originRect, _containerRect, position) => {
92
+ return getOriginPoint(originRect, getBoundaryRect(overlayRoot), position);
93
+ };
94
+ strategy.attach = (overlayRef) => {
95
+ attach(overlayRef);
96
+ stopObserving();
97
+ stopObserving = observeBoundary(() => strategy.apply());
98
+ };
99
+ strategy.detach = () => {
100
+ stopObserving();
101
+ stopObserving = () => { };
102
+ detach();
103
+ };
104
+ strategy.dispose = () => {
105
+ stopObserving();
106
+ stopObserving = () => { };
107
+ dispose();
108
+ };
109
+ return strategy;
110
+ };
111
+ class MfOverlayPositionBuilder extends OverlayPositionBuilder {
112
+ #document;
113
+ #overlayContainer;
114
+ #overlayRoot;
115
+ #platform;
116
+ #viewportRuler;
117
+ constructor(viewportRuler, document, platform, overlayContainer, overlayRoot) {
118
+ super();
119
+ this.#viewportRuler = viewportRuler;
120
+ this.#document = document;
121
+ this.#platform = platform;
122
+ this.#overlayContainer = overlayContainer;
123
+ this.#overlayRoot = overlayRoot;
124
+ }
125
+ global() {
126
+ return new GlobalPositionStrategy();
127
+ }
128
+ flexibleConnectedTo(origin) {
129
+ const boundaryDocument = createBoundaryDocument(this.#document, this.#overlayRoot);
130
+ const boundaryViewportRuler = createBoundaryViewportRuler(this.#viewportRuler, this.#overlayRoot);
131
+ const strategy = new FlexibleConnectedPositionStrategy(origin, boundaryViewportRuler, boundaryDocument, this.#platform, this.#overlayContainer);
132
+ const overlayContainer = this.#overlayContainer;
133
+ return adaptConnectedPositionStrategy(strategy, this.#overlayRoot, (callback) => overlayContainer.observeBoundary(callback));
134
+ }
135
+ }
2
136
  class MfOverlayContainer extends OverlayContainer {
137
+ #boundaryObservers = new Set();
3
138
  #overlayRoot;
139
+ #animationFrame = null;
140
+ #boundaryRect = null;
141
+ #restoreRootPosition = null;
142
+ #shadowStyle = null;
4
143
  constructor(overlayRoot) {
5
144
  super();
6
145
  this.#overlayRoot = overlayRoot;
7
146
  }
147
+ ngOnDestroy() {
148
+ if (this.#animationFrame !== null) {
149
+ this.#overlayRoot.ownerDocument.defaultView?.cancelAnimationFrame(this.#animationFrame);
150
+ }
151
+ this.#animationFrame = null;
152
+ this.#boundaryObservers.clear();
153
+ super.ngOnDestroy();
154
+ this.#shadowStyle?.remove();
155
+ this.#shadowStyle = null;
156
+ this.#restoreRootPosition?.();
157
+ this.#restoreRootPosition = null;
158
+ }
159
+ observeBoundary(callback) {
160
+ this.#boundaryObservers.add(callback);
161
+ if (this.#boundaryObservers.size === 1) {
162
+ this.#boundaryRect = this.#overlayRoot.getBoundingClientRect();
163
+ this.#scheduleBoundaryCheck();
164
+ }
165
+ return () => {
166
+ this.#boundaryObservers.delete(callback);
167
+ if (this.#boundaryObservers.size === 0 && this.#animationFrame !== null) {
168
+ this.#overlayRoot.ownerDocument.defaultView?.cancelAnimationFrame(this.#animationFrame);
169
+ this.#animationFrame = null;
170
+ this.#boundaryRect = null;
171
+ }
172
+ };
173
+ }
8
174
  _createContainer() {
175
+ if (this.#overlayRoot.ownerDocument.defaultView?.getComputedStyle(this.#overlayRoot).position === 'static') {
176
+ const previousPosition = this.#overlayRoot.style.position;
177
+ this.#overlayRoot.style.position = 'relative';
178
+ this.#restoreRootPosition = () => {
179
+ this.#overlayRoot.style.position = previousPosition;
180
+ };
181
+ }
182
+ const rootNode = this.#overlayRoot.getRootNode();
183
+ const ShadowRootConstructor = this.#overlayRoot.ownerDocument.defaultView?.ShadowRoot;
184
+ if (ShadowRootConstructor && rootNode instanceof ShadowRootConstructor) {
185
+ const style = this._document.createElement('style');
186
+ style.setAttribute('data-edyn-mf-cdk-overlay-styles', '');
187
+ style.textContent = CDK_OVERLAY_STRUCTURAL_CSS;
188
+ rootNode.appendChild(style);
189
+ this.#shadowStyle = style;
190
+ }
9
191
  const container = this._document.createElement('div');
10
192
  container.classList.add('cdk-overlay-container');
193
+ container.style.inset = '0';
194
+ container.style.position = 'absolute';
11
195
  this.#overlayRoot.appendChild(container);
12
196
  this._containerElement = container;
13
197
  }
198
+ #scheduleBoundaryCheck() {
199
+ const window = this.#overlayRoot.ownerDocument.defaultView;
200
+ if (!window || this.#animationFrame !== null || this.#boundaryObservers.size === 0) {
201
+ return;
202
+ }
203
+ this.#animationFrame = window.requestAnimationFrame(() => {
204
+ this.#animationFrame = null;
205
+ const previous = this.#boundaryRect;
206
+ const current = this.#overlayRoot.getBoundingClientRect();
207
+ this.#boundaryRect = current;
208
+ if (previous &&
209
+ (previous.height !== current.height || previous.left !== current.left || previous.top !== current.top || previous.width !== current.width)) {
210
+ for (const observer of this.#boundaryObservers) {
211
+ observer();
212
+ }
213
+ }
214
+ this.#scheduleBoundaryCheck();
215
+ });
216
+ }
14
217
  }
218
+ const isDocumentViewportRoot = (overlayRoot) => {
219
+ return overlayRoot === overlayRoot.ownerDocument.body || overlayRoot === overlayRoot.ownerDocument.documentElement;
220
+ };
221
+ const createOverlayContainer = (overlayRoot) => {
222
+ return isDocumentViewportRoot(overlayRoot) ? new OverlayContainer() : new MfOverlayContainer(overlayRoot);
223
+ };
224
+ const createOverlayPositionBuilder = (viewportRuler, document, platform, overlayContainer, overlayRoot) => {
225
+ if (isDocumentViewportRoot(overlayRoot)) {
226
+ return new OverlayPositionBuilder();
227
+ }
228
+ return new MfOverlayPositionBuilder(viewportRuler, document, platform, overlayContainer, overlayRoot);
229
+ };
230
+ const createTokenProviders = (overlayRootToken) => {
231
+ return [
232
+ {
233
+ provide: OverlayContainer,
234
+ useFactory: createOverlayContainer,
235
+ deps: [overlayRootToken],
236
+ },
237
+ {
238
+ provide: OverlayPositionBuilder,
239
+ useFactory: createOverlayPositionBuilder,
240
+ deps: [ViewportRuler, DOCUMENT, Platform, OverlayContainer, overlayRootToken],
241
+ },
242
+ ];
243
+ };
15
244
  export const provideMfOverlayRoot = (overlayRoot) => {
16
245
  if (!overlayRoot) {
17
246
  return [];
@@ -19,8 +248,18 @@ export const provideMfOverlayRoot = (overlayRoot) => {
19
248
  return [
20
249
  {
21
250
  provide: OverlayContainer,
22
- useFactory: () => new MfOverlayContainer(overlayRoot),
251
+ useFactory: () => createOverlayContainer(overlayRoot),
252
+ },
253
+ {
254
+ provide: OverlayPositionBuilder,
255
+ useFactory: (viewportRuler, document, platform, overlayContainer) => {
256
+ return createOverlayPositionBuilder(viewportRuler, document, platform, overlayContainer, overlayRoot);
257
+ },
258
+ deps: [ViewportRuler, DOCUMENT, Platform, OverlayContainer],
23
259
  },
24
260
  ];
25
261
  };
262
+ export const provideMfOverlayRootFromToken = (overlayRootToken) => {
263
+ return createTokenProviders(overlayRootToken);
264
+ };
26
265
  //# sourceMappingURL=angular.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular.js","sourceRoot":"","sources":["../src/angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,kBAAmB,SAAQ,gBAAgB;IACtC,YAAY,CAAc;IAEnC,YAAY,WAAwB;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAEkB,gBAAgB;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtD,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACrC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAyB,EAAoB,EAAE;IAClF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL;YACE,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,CAAC,WAAW,CAAC;SACtD;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"angular.js","sourceRoot":"","sources":["../src/angular.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "name": "@edynamix/mf-isolation",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "CSS and overlay isolation helpers for eDynamix microfrontends.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
7
+ "packageManager": "bun@1.3.13",
8
+ "engines": {
9
+ "bun": ">=1.3.0",
10
+ "node": ">=22"
11
+ },
7
12
  "sideEffects": false,
8
13
  "files": [
9
14
  "dist",
@@ -20,6 +25,10 @@
20
25
  "types": "./dist/angular.d.ts",
21
26
  "import": "./dist/angular.js"
22
27
  },
28
+ "./angular-runtime": {
29
+ "types": "./dist/angular-runtime.d.ts",
30
+ "import": "./dist/angular-runtime.js"
31
+ },
23
32
  "./postcss": {
24
33
  "types": "./dist/postcss.d.ts",
25
34
  "import": "./dist/postcss.js"
@@ -29,9 +38,17 @@
29
38
  "scripts": {
30
39
  "build": "bun run clean && tsc -p tsconfig.build.json",
31
40
  "clean": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"",
41
+ "format": "biome format --write .",
42
+ "knip": "knip",
43
+ "lint": "biome check .",
44
+ "lint:fix": "biome check --write .",
32
45
  "pack:check": "bun run build && bun pm pack --dry-run --ignore-scripts",
46
+ "package:smoke": "bun run scripts/package-smoke.ts",
33
47
  "prepack": "bun run build",
34
- "typecheck": "tsc --noEmit"
48
+ "test": "bun test src",
49
+ "test:browser": "playwright test",
50
+ "typecheck": "tsc --noEmit",
51
+ "verify": "bun run lint && bun run typecheck && bun run knip && bun run test && bun run test:browser && bun run build && bun run package:smoke"
35
52
  },
36
53
  "publishConfig": {
37
54
  "access": "public"
@@ -42,19 +59,34 @@
42
59
  "postcss-value-parser": "^4.2.0"
43
60
  },
44
61
  "devDependencies": {
45
- "@angular/cdk": "^19.2.0",
46
- "@angular/compiler": "^19.2.0",
47
- "@angular/core": "^19.2.0",
48
- "@types/node": "^22.20.0"
62
+ "@angular/cdk": "19.2.19",
63
+ "@angular/common": "19.2.25",
64
+ "@angular/compiler": "19.2.25",
65
+ "@angular/core": "19.2.25",
66
+ "@angular/platform-browser": "19.2.25",
67
+ "@angular/platform-browser-dynamic": "19.2.25",
68
+ "@biomejs/biome": "2.5.2",
69
+ "@happy-dom/global-registrator": "20.11.2",
70
+ "@playwright/test": "1.60.0",
71
+ "@types/bun": "1.3.14",
72
+ "@types/node": "22.20.1",
73
+ "knip": "6.32.2",
74
+ "typescript": "5.8.2",
75
+ "vite": "8.0.16",
76
+ "zone.js": "0.15.1"
49
77
  },
50
78
  "peerDependencies": {
51
79
  "@angular/cdk": "^19.0.0",
80
+ "@angular/common": "^19.0.0",
52
81
  "@angular/core": "^19.0.0"
53
82
  },
54
83
  "peerDependenciesMeta": {
55
84
  "@angular/cdk": {
56
85
  "optional": true
57
86
  },
87
+ "@angular/common": {
88
+ "optional": true
89
+ },
58
90
  "@angular/core": {
59
91
  "optional": true
60
92
  }