@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 +54 -0
- package/dist/angular.d.ts +3 -0
- package/dist/angular.d.ts.map +1 -0
- package/dist/angular.js +26 -0
- package/dist/angular.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/postcss.d.ts +6 -0
- package/dist/postcss.d.ts.map +1 -0
- package/dist/postcss.js +100 -0
- package/dist/postcss.js.map +1 -0
- package/package.json +60 -0
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 @@
|
|
|
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"}
|
package/dist/angular.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/postcss.js
ADDED
|
@@ -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":"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"}
|
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
|
+
}
|