@edynamix/mf-isolation 0.0.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/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # @edynamix/mf-isolation
2
+
3
+ CSS isolation and Angular overlay helpers for microfrontends.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @edynamix/mf-isolation
9
+ ```
10
+
11
+ ## Runtime boundary
12
+
13
+ ```ts
14
+ import { prepareMfBoundary } from '@edynamix/mf-isolation';
15
+
16
+ const disposeBoundary = prepareMfBoundary(element, {
17
+ scopeId: 'portal',
18
+ });
19
+
20
+ // When the microfrontend unmounts:
21
+ disposeBoundary();
22
+ ```
23
+
24
+ ## Build-time CSS isolation
25
+
26
+ ```ts
27
+ import { scopeRemoteCss } from '@edynamix/mf-isolation/postcss';
28
+
29
+ export default {
30
+ css: {
31
+ postcss: {
32
+ plugins: [scopeRemoteCss({ scopeId: 'portal' })],
33
+ },
34
+ },
35
+ };
36
+ ```
37
+
38
+ The host and remote must use the same `scopeId`.
39
+
40
+ ## Angular CDK overlays
41
+
42
+ ```ts
43
+ import { provideMfOverlayRoot } from '@edynamix/mf-isolation/angular';
44
+
45
+ const providers = provideMfOverlayRoot(mountElement);
46
+ ```
47
+
48
+ The Angular entry point requires `@angular/core` and `@angular/cdk`.
49
+
50
+ ## Exports
51
+
52
+ - `@edynamix/mf-isolation`
53
+ - `@edynamix/mf-isolation/angular`
54
+ - `@edynamix/mf-isolation/postcss`
@@ -0,0 +1,3 @@
1
+ import type { StaticProvider } from '@angular/core';
2
+ export declare const provideMfOverlayRoot: (overlayRoot?: HTMLElement) => StaticProvider[];
3
+ //# sourceMappingURL=angular.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,26 @@
1
+ import { OverlayContainer } from '@angular/cdk/overlay';
2
+ class MfOverlayContainer extends OverlayContainer {
3
+ #overlayRoot;
4
+ constructor(overlayRoot) {
5
+ super();
6
+ this.#overlayRoot = overlayRoot;
7
+ }
8
+ _createContainer() {
9
+ const container = this._document.createElement('div');
10
+ container.classList.add('cdk-overlay-container');
11
+ this.#overlayRoot.appendChild(container);
12
+ this._containerElement = container;
13
+ }
14
+ }
15
+ export const provideMfOverlayRoot = (overlayRoot) => {
16
+ if (!overlayRoot) {
17
+ return [];
18
+ }
19
+ return [
20
+ {
21
+ provide: OverlayContainer,
22
+ useFactory: () => new MfOverlayContainer(overlayRoot),
23
+ },
24
+ ];
25
+ };
26
+ //# sourceMappingURL=angular.js.map
@@ -0,0 +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"}
@@ -0,0 +1,10 @@
1
+ export declare const MF_SCOPE_ATTRIBUTE = "data-edyn-mf";
2
+ export declare const MF_ROOT_SELECTOR = ":mf-root";
3
+ export interface IPrepareMfBoundaryOptions {
4
+ scopeId: string;
5
+ theme?: Record<string, string>;
6
+ }
7
+ export declare const validateMfScopeId: (scopeId: string) => string;
8
+ export declare const getMfScopeSelector: (scopeId: string) => string;
9
+ export declare const prepareMfBoundary: (element: HTMLElement, { scopeId, theme }: IPrepareMfBoundaryOptions) => (() => void);
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAI3C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,KAAG,MAMnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,MAEpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,SAAS,WAAW,EAAE,oBAAyB,yBAAyB,KAAG,CAAC,MAAM,IAAI,CA2CvH,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ export const MF_SCOPE_ATTRIBUTE = 'data-edyn-mf';
2
+ export const MF_ROOT_SELECTOR = ':mf-root';
3
+ const SCOPE_ID_PATTERN = /^[a-z][a-z0-9-]*$/;
4
+ export const validateMfScopeId = (scopeId) => {
5
+ if (!SCOPE_ID_PATTERN.test(scopeId)) {
6
+ throw new Error(`Invalid microfrontend scope id: "${scopeId}".`);
7
+ }
8
+ return scopeId;
9
+ };
10
+ export const getMfScopeSelector = (scopeId) => {
11
+ return `:where([${MF_SCOPE_ATTRIBUTE}="${validateMfScopeId(scopeId)}"])`;
12
+ };
13
+ export const prepareMfBoundary = (element, { scopeId, theme = {} }) => {
14
+ validateMfScopeId(scopeId);
15
+ for (const name of Object.keys(theme)) {
16
+ if (!name.startsWith('--')) {
17
+ throw new Error(`Microfrontend theme token must be a CSS custom property: "${name}".`);
18
+ }
19
+ }
20
+ const previousScope = element.getAttribute(MF_SCOPE_ATTRIBUTE);
21
+ const hadRootClass = element.classList.contains('edx-root');
22
+ const previousTheme = new Map();
23
+ element.setAttribute(MF_SCOPE_ATTRIBUTE, scopeId);
24
+ element.classList.add('edx-root');
25
+ for (const [name, value] of Object.entries(theme)) {
26
+ previousTheme.set(name, {
27
+ priority: element.style.getPropertyPriority(name),
28
+ value: element.style.getPropertyValue(name),
29
+ });
30
+ element.style.setProperty(name, value);
31
+ }
32
+ return () => {
33
+ if (previousScope === null) {
34
+ element.removeAttribute(MF_SCOPE_ATTRIBUTE);
35
+ }
36
+ else {
37
+ element.setAttribute(MF_SCOPE_ATTRIBUTE, previousScope);
38
+ }
39
+ if (!hadRootClass) {
40
+ element.classList.remove('edx-root');
41
+ }
42
+ for (const [name, previous] of previousTheme) {
43
+ if (previous.value) {
44
+ element.style.setProperty(name, previous.value, previous.priority);
45
+ }
46
+ else {
47
+ element.style.removeProperty(name);
48
+ }
49
+ }
50
+ };
51
+ };
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAE3C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAO7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE;IAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAU,EAAE;IAC5D,OAAO,WAAW,kBAAkB,KAAK,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAoB,EAAE,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,EAA6B,EAAgB,EAAE;IAC1H,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6DAA6D,IAAI,IAAI,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+C,CAAC;IAE7E,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE;YACtB,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACjD,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,EAAE;QACV,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC;YAC7C,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Plugin } from 'postcss';
2
+ export interface IScopeRemoteCssOptions {
3
+ scopeId: string;
4
+ }
5
+ export declare const scopeRemoteCss: ({ scopeId }: IScopeRemoteCssOptions) => Plugin;
6
+ //# sourceMappingURL=postcss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss.d.ts","sourceRoot":"","sources":["../src/postcss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,SAAS,CAAC;AAK5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AA0ED,eAAO,MAAM,cAAc,GAAI,aAAa,sBAAsB,KAAG,MAyCpE,CAAC"}
@@ -0,0 +1,100 @@
1
+ import selectorParser from 'postcss-selector-parser';
2
+ import valueParser from 'postcss-value-parser';
3
+ import { getMfScopeSelector, MF_ROOT_SELECTOR, MF_SCOPE_ATTRIBUTE, validateMfScopeId } from './index.js';
4
+ const isKeyframesRule = (rule) => {
5
+ const parent = rule.parent;
6
+ return parent?.type === 'atrule' && /keyframes$/i.test(parent.name);
7
+ };
8
+ const isRootNode = (node) => {
9
+ return ((node.type === 'tag' && (node.value.toLowerCase() === 'html' || node.value.toLowerCase() === 'body')) ||
10
+ (node.type === 'pseudo' && (node.value === ':root' || node.value === MF_ROOT_SELECTOR)));
11
+ };
12
+ const isScopeNode = (node, scopeId) => {
13
+ const normalized = node?.toString().replaceAll('"', '').replaceAll("'", '');
14
+ return node?.type === 'pseudo' && normalized === `:where([${MF_SCOPE_ATTRIBUTE}=${scopeId}])`;
15
+ };
16
+ const scopeSelectorList = (selectorList, scopeId, scopeSelector) => {
17
+ return selectorParser((root) => {
18
+ const sourceSelectors = [...root.nodes];
19
+ for (const selector of sourceSelectors) {
20
+ const rootNodes = selector.nodes.filter(isRootNode);
21
+ if (rootNodes.length > 0) {
22
+ const [firstRoot, ...duplicateRoots] = rootNodes;
23
+ const scopeNode = selectorParser().astSync(scopeSelector).first.first.clone();
24
+ firstRoot?.replaceWith(scopeNode);
25
+ for (const duplicateRoot of duplicateRoots) {
26
+ const previous = duplicateRoot.prev();
27
+ if (previous?.type === 'combinator') {
28
+ previous.remove();
29
+ }
30
+ duplicateRoot.remove();
31
+ }
32
+ continue;
33
+ }
34
+ if (isScopeNode(selector.first, scopeId)) {
35
+ continue;
36
+ }
37
+ const first = selector.first;
38
+ const needsBoundaryVariant = first?.type === 'universal' || (first?.type === 'pseudo' && first.value.startsWith('::'));
39
+ if (needsBoundaryVariant) {
40
+ const hasSiblingCombinator = selector.nodes.some((node) => node.type === 'combinator' && (node.value === '+' || node.value === '~'));
41
+ if (!hasSiblingCombinator) {
42
+ const boundaryVariant = selector.clone();
43
+ const boundaryScope = selectorParser().astSync(scopeSelector).first.first.clone();
44
+ boundaryVariant.first.rawSpaceBefore = '';
45
+ if (boundaryVariant.first.type === 'universal') {
46
+ boundaryVariant.first.replaceWith(boundaryScope);
47
+ }
48
+ else {
49
+ boundaryVariant.prepend(boundaryScope);
50
+ }
51
+ root.insertBefore(selector, boundaryVariant);
52
+ }
53
+ }
54
+ const descendantScope = selectorParser().astSync(`${scopeSelector} *`).first;
55
+ const prefixNodes = descendantScope.nodes.slice(0, -1).map((node) => node.clone());
56
+ selector.first.rawSpaceBefore = '';
57
+ for (const prefixNode of prefixNodes.reverse()) {
58
+ selector.prepend(prefixNode);
59
+ }
60
+ }
61
+ }).processSync(selectorList);
62
+ };
63
+ export const scopeRemoteCss = ({ scopeId }) => {
64
+ const validScopeId = validateMfScopeId(scopeId);
65
+ const scopeSelector = getMfScopeSelector(validScopeId);
66
+ const keyframePrefix = `edyn-mf-${validScopeId}--`;
67
+ const keyframes = new Map();
68
+ return {
69
+ postcssPlugin: `edyn-mf-isolation-${validScopeId}`,
70
+ Once(root) {
71
+ root.walkAtRules((atRule) => {
72
+ if (!/keyframes$/i.test(atRule.name) || atRule.params.startsWith(keyframePrefix)) {
73
+ return;
74
+ }
75
+ const originalName = atRule.params.trim();
76
+ const scopedName = `${keyframePrefix}${originalName}`;
77
+ keyframes.set(originalName, scopedName);
78
+ atRule.params = scopedName;
79
+ });
80
+ root.walkRules((rule) => {
81
+ if (!isKeyframesRule(rule)) {
82
+ rule.selector = scopeSelectorList(rule.selector, validScopeId, scopeSelector);
83
+ }
84
+ });
85
+ root.walkDecls((declaration) => {
86
+ if (!/^(?:-webkit-)?animation(?:-name)?$/i.test(declaration.prop) && !declaration.prop.startsWith('--animate-')) {
87
+ return;
88
+ }
89
+ const parsed = valueParser(declaration.value);
90
+ parsed.walk((node) => {
91
+ if (node.type === 'word') {
92
+ node.value = keyframes.get(node.value) ?? node.value;
93
+ }
94
+ });
95
+ declaration.value = parsed.toString();
96
+ });
97
+ },
98
+ };
99
+ };
100
+ //# sourceMappingURL=postcss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss.js","sourceRoot":"","sources":["../src/postcss.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,yBAAyB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMzG,MAAM,eAAe,GAAG,CAAC,IAAU,EAAW,EAAE;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAyB,EAAW,EAAE;IACxD,OAAO,CACL,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;QACrG,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC,CACxF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAqC,EAAE,OAAe,EAAW,EAAE;IACtF,MAAM,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,UAAU,KAAK,WAAW,kBAAkB,IAAI,OAAO,IAAI,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,YAAoB,EAAE,OAAe,EAAE,aAAqB,EAAU,EAAE;IACjG,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7B,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExC,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEpD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,SAAS,EAAE,GAAG,cAAc,CAAC,GAAG,SAAS,CAAC;gBACjD,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9E,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;gBAElC,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;oBAC3C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;oBACtC,IAAI,QAAQ,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;wBACpC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACpB,CAAC;oBACD,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAEvH,IAAI,oBAAoB,EAAE,CAAC;gBACzB,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC;gBAErI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACzC,MAAM,aAAa,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBAClF,eAAe,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC;oBAC1C,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAC/C,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;oBACnD,CAAC;yBAAM,CAAC;wBACN,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBACzC,CAAC;oBACD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC;YAC7E,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnF,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC;YACnC,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC/C,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAA0B,EAAU,EAAE;IAC5E,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,WAAW,YAAY,IAAI,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,OAAO;QACL,aAAa,EAAE,qBAAqB,YAAY,EAAE;QAClD,IAAI,CAAC,IAAI;YACP,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;oBACjF,OAAO;gBACT,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,GAAG,cAAc,GAAG,YAAY,EAAE,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC7B,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChH,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@edynamix/mf-isolation",
3
+ "version": "0.0.1",
4
+ "description": "CSS and overlay isolation helpers for eDynamix microfrontends.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./angular": {
20
+ "types": "./dist/angular.d.ts",
21
+ "import": "./dist/angular.js"
22
+ },
23
+ "./postcss": {
24
+ "types": "./dist/postcss.d.ts",
25
+ "import": "./dist/postcss.js"
26
+ },
27
+ "./package.json": "./package.json"
28
+ },
29
+ "scripts": {
30
+ "build": "bun run clean && tsc -p tsconfig.build.json",
31
+ "clean": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true });\"",
32
+ "pack:check": "bun run build && bun pm pack --dry-run --ignore-scripts",
33
+ "prepack": "bun run build",
34
+ "typecheck": "tsc --noEmit"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "postcss": "^8.5.16",
41
+ "postcss-selector-parser": "^7.1.4",
42
+ "postcss-value-parser": "^4.2.0"
43
+ },
44
+ "devDependencies": {
45
+ "@angular/cdk": "^19.2.0",
46
+ "@angular/core": "^19.2.0"
47
+ },
48
+ "peerDependencies": {
49
+ "@angular/cdk": "^19.0.0",
50
+ "@angular/core": "^19.0.0"
51
+ },
52
+ "peerDependenciesMeta": {
53
+ "@angular/cdk": {
54
+ "optional": true
55
+ },
56
+ "@angular/core": {
57
+ "optional": true
58
+ }
59
+ }
60
+ }