@arbor-css/css-eval 0.0.109 → 0.0.111

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/dist/browser.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { CssSimplifier } from './simplification.js';
2
- export declare const loadSimplifier: () => Promise<CssSimplifier>;
1
+ import { CssSimplificationOptions, CssSimplifier } from './simplification.js';
2
+ export declare const loadSimplifier: (options?: CssSimplificationOptions) => Promise<CssSimplifier>;
3
3
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtE,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,aAAa,CAG5D,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,EAEN,wBAAwB,EACxB,aAAa,EACb,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,cAAc,GAC1B,UAAU,wBAAwB,KAChC,OAAO,CAAC,aAAa,CAGvB,CAAC"}
package/dist/browser.js CHANGED
@@ -1,7 +1,7 @@
1
- import init, { transform as transformNative, } from 'https://esm.run/lightningcss-wasm';
2
- import { createSimplifier } from './simplification.js';
3
- export const loadSimplifier = async () => {
1
+ import init, { transform as transformNative, } from 'https://esm.sh/lightningcss-wasm@1.32.0';
2
+ import { createSimplifier, } from './simplification.js';
3
+ export const loadSimplifier = async (options) => {
4
4
  await init();
5
- return createSimplifier({ transform: transformNative });
5
+ return createSimplifier({ transform: transformNative, options });
6
6
  };
7
7
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EACZ,SAAS,IAAI,eAAe,GAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA4B,EAAE;IAChE,MAAM,IAAI,EAAE,CAAC;IACb,OAAO,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAsB,EAAE,CAAC,CAAC;AAChE,CAAC,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EACZ,SAAS,IAAI,eAAe,GAC5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACN,gBAAgB,GAGhB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAClC,OAAkC,EACT,EAAE;IAC3B,MAAM,IAAI,EAAE,CAAC;IACb,OAAO,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAsB,EAAE,OAAO,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC"}
@@ -1,9 +1,34 @@
1
+ import { TokenPurpose } from '@arbor-css/tokens';
1
2
  import { Css } from './interpolation.js';
3
+ import { CssEnvValues } from './resolveEnv.js';
2
4
  import { CssSimplifier } from './simplification.js';
3
5
  export interface CssResolutionContext {
6
+ /**
7
+ * Known property values to resolve and bake into the CSS. This is used to
8
+ * simplify output CSS where the dependencies of a value are known and
9
+ * hard-coded; for example, other values present in a mode.
10
+ */
4
11
  propertyValues?: Record<string, string | Css>;
12
+ /**
13
+ * Values from the runtime environment may be used to resolve and
14
+ * simplify runtime-known CSS value types like vw, vh, rem, etc.
15
+ * NOT meant for use in generating CSS for application; only really
16
+ * relevant for interactive tooling and introspection purposes.
17
+ */
18
+ envValues?: CssEnvValues;
19
+ /**
20
+ * Skip applying known property values and env values
21
+ */
5
22
  skipBaking?: boolean;
23
+ /**
24
+ * Optional; provide a simplifier implementation to reduce the size and complexity
25
+ * of the final CSS by pre-computing arithmetic and simplifying expressions.
26
+ */
6
27
  simplifier?: CssSimplifier;
28
+ /**
29
+ * Optional; helps tune simplification for particular CSS value types.
30
+ */
31
+ purpose?: TokenPurpose;
7
32
  }
8
- export declare function resolveCss(input: Css, { propertyValues, skipBaking, simplifier }: CssResolutionContext): string;
33
+ export declare function resolveCss(input: Css, { propertyValues, envValues, skipBaking, simplifier, purpose, }: CssResolutionContext): string;
9
34
  //# sourceMappingURL=computation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"computation.d.ts","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,wBAAgB,UAAU,CACzB,KAAK,EAAE,GAAG,EACV,EAAE,cAAmB,EAAE,UAAkB,EAAE,UAAU,EAAE,EAAE,oBAAoB,UAa7E"}
1
+ {"version":3,"file":"computation.d.ts","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAc,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACpC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,UAAU,CACzB,KAAK,EAAE,GAAG,EACV,EACC,cAAmB,EACnB,SAAc,EACd,UAAkB,EAClB,UAAU,EACV,OAAO,GACP,EAAE,oBAAoB,UAevB"}
@@ -1,6 +1,9 @@
1
+ import { resolveEnv } from './resolveEnv.js';
1
2
  import { resolveProperties } from './resolveProperties.js';
2
- export function resolveCss(input, { propertyValues = {}, skipBaking = false, simplifier }) {
3
- let result = skipBaking ? input.text : resolveProperties(input, propertyValues).text;
3
+ export function resolveCss(input, { propertyValues = {}, envValues = {}, skipBaking = false, simplifier, purpose, }) {
4
+ let result = skipBaking ?
5
+ input.text
6
+ : resolveEnv(resolveProperties(input, propertyValues), envValues).text;
4
7
  if (simplifier) {
5
8
  result = simplifier({
6
9
  ...input,
@@ -1 +1 @@
1
- {"version":3,"file":"computation.js","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAS3D,MAAM,UAAU,UAAU,CACzB,KAAU,EACV,EAAE,cAAc,GAAG,EAAE,EAAE,UAAU,GAAG,KAAK,EAAE,UAAU,EAAwB;IAE7E,IAAI,MAAM,GACT,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC;IAEzE,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,GAAG,UAAU,CAAC;YACnB,GAAG,KAAK;YACR,IAAI,EAAE,MAAM;SACZ,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"computation.js","sourceRoot":"","sources":["../src/computation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAgC3D,MAAM,UAAU,UAAU,CACzB,KAAU,EACV,EACC,cAAc,GAAG,EAAE,EACnB,SAAS,GAAG,EAAE,EACd,UAAU,GAAG,KAAK,EAClB,UAAU,EACV,OAAO,GACe;IAEvB,IAAI,MAAM,GACT,UAAU,CAAC,CAAC;QACX,KAAK,CAAC,IAAI;QACX,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC;IAExE,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,GAAG,UAAU,CAAC;YACnB,GAAG,KAAK;YACR,IAAI,EAAE,MAAM;SACZ,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './computation.js';
2
2
  export * from './interpolation.js';
3
3
  export * from './print.js';
4
+ export * from './resolveEnv.js';
4
5
  export * from './resolveProperties.js';
5
6
  export * from './simplification.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './computation.js';
2
2
  export * from './interpolation.js';
3
3
  export * from './print.js';
4
+ export * from './resolveEnv.js';
4
5
  export * from './resolveProperties.js';
5
6
  export * from './simplification.js';
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
package/dist/node.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const simplifier: (css: import("./interpolation.js").Css) => string;
1
+ export declare const simplifier: import("./simplification.js").CssSimplifier;
2
2
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,mDAAmD,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,6CAGrB,CAAC"}
package/dist/node.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { transform as transformNative } from 'lightningcss';
2
2
  import { createSimplifier } from './simplification.js';
3
- export const simplifier = createSimplifier({ transform: transformNative });
3
+ export const simplifier = createSimplifier({
4
+ transform: transformNative,
5
+ options: { passes: 1 },
6
+ });
4
7
  //# sourceMappingURL=node.js.map
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IAC1C,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;CACtB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Css } from './interpolation.js';
2
+ export interface CssEnvValues {
3
+ deviceWidthPx?: number;
4
+ deviceHeightPx?: number;
5
+ remPx?: number;
6
+ }
7
+ export declare function resolveEnv(css: Css, { deviceHeightPx, deviceWidthPx, remPx }: CssEnvValues): Css;
8
+ //# sourceMappingURL=resolveEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveEnv.d.ts","sourceRoot":"","sources":["../src/resolveEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,CACzB,GAAG,EAAE,GAAG,EACR,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,YAAY,GACpD,GAAG,CA+BL"}
@@ -0,0 +1,24 @@
1
+ export function resolveEnv(css, { deviceHeightPx, deviceWidthPx, remPx }) {
2
+ let text = css.text;
3
+ if (deviceWidthPx) {
4
+ text = text.replace(/([\d.]+)[dls]?v[wi]/g, (_, num) => `${(parseFloat(num) / 100) * deviceWidthPx}px`);
5
+ }
6
+ if (deviceHeightPx) {
7
+ text = text.replace(/([\d.]+)[dls]?v[hb]/g, (_, num) => `${(parseFloat(num) / 100) * deviceHeightPx}px`);
8
+ }
9
+ if (deviceWidthPx && deviceHeightPx) {
10
+ text = text.replace(/([\d.]+)[dls]?vmin/g, (_, num) => {
11
+ const vmin = Math.min(deviceWidthPx, deviceHeightPx);
12
+ return `${(parseFloat(num) / 100) * vmin}px`;
13
+ });
14
+ text = text.replace(/([\d.]+)[dls]?vmax/g, (_, num) => {
15
+ const vmax = Math.max(deviceWidthPx, deviceHeightPx);
16
+ return `${(parseFloat(num) / 100) * vmax}px`;
17
+ });
18
+ }
19
+ if (remPx) {
20
+ text = text.replace(/([\d.]+)rem/g, (_, num) => `${parseFloat(num) * remPx}px`);
21
+ }
22
+ return { ...css, text };
23
+ }
24
+ //# sourceMappingURL=resolveEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveEnv.js","sourceRoot":"","sources":["../src/resolveEnv.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,UAAU,CACzB,GAAQ,EACR,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAgB;IAEtD,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACpB,IAAI,aAAa,EAAE,CAAC;QACnB,IAAI,GAAG,IAAI,CAAC,OAAO,CAClB,sBAAsB,EACtB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,aAAa,IAAI,CAC1D,CAAC;IACH,CAAC;IACD,IAAI,cAAc,EAAE,CAAC;QACpB,IAAI,GAAG,IAAI,CAAC,OAAO,CAClB,sBAAsB,EACtB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,cAAc,IAAI,CAC3D,CAAC;IACH,CAAC;IACD,IAAI,aAAa,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YACrD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YACrD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC;QAC9C,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,GAAG,IAAI,CAAC,OAAO,CAClB,cAAc,EACd,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,CAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -1,9 +1,22 @@
1
+ import { TokenPurpose } from '@arbor-css/tokens';
1
2
  import { Css } from './interpolation.js';
2
3
  /**
3
4
  * Applies simplifications not covered by LightningCSS.
5
+ * Uses linear-time paren scanning instead of regex to avoid backtracking.
4
6
  */
5
7
  export declare function simplifyPreprocessCss(css: string): string;
6
- export type CssSimplifier = (css: Css) => string;
8
+ export interface CssSimplificationOptions {
9
+ /**
10
+ * More passes take longer but lead to further reduction
11
+ * of terms; this is really a quirk of the multiple
12
+ * tools/systems used to perform simplification.
13
+ * 2 is probably enough for anyone. Default is 1.
14
+ */
15
+ passes: number;
16
+ }
17
+ export type CssSimplifier = (css: Css, options?: {
18
+ purpose?: TokenPurpose;
19
+ }) => string;
7
20
  export type CssTransformFunction = ({ filename, code, }: {
8
21
  filename: string;
9
22
  code: Uint8Array;
@@ -15,5 +28,6 @@ export declare function createSimplifier(config: {
15
28
  * A LightningCSS transform function
16
29
  */
17
30
  transform: CssTransformFunction;
18
- }): (css: Css) => string;
31
+ options?: CssSimplificationOptions;
32
+ }): CssSimplifier;
19
33
  //# sourceMappingURL=simplification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplification.d.ts","sourceRoot":"","sources":["../src/simplification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAMzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,UAIhD;AAYD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;AACjD,MAAM,MAAM,oBAAoB,GAAG,CAAC,EACnC,QAAQ,EACR,IAAI,GACJ,EAAE;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CACjB,KAAK;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACxC;;OAEG;IACH,SAAS,EAAE,oBAAoB,CAAC;CAChC,IAGQ,KAAK,GAAG,YAoBhB"}
1
+ {"version":3,"file":"simplification.d.ts","sourceRoot":"","sources":["../src/simplification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOzD;AAYD,MAAM,WAAW,wBAAwB;IACxC;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;CACf;AACD,MAAM,MAAM,aAAa,GAAG,CAC3B,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IACT,OAAO,CAAC,EAAE,YAAY,CAAC;CACvB,KACG,MAAM,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,EACnC,QAAQ,EACR,IAAI,GACJ,EAAE;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CACjB,KAAK;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACxC;;OAEG;IACH,SAAS,EAAE,oBAAoB,CAAC;IAChC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACnC,GAAG,aAAa,CA0BhB"}
@@ -1,10 +1,16 @@
1
+ import { replaceTopLevelTerms } from '@arbor-css/util';
1
2
  import { unwrapDummyAssignment, wrapWithDummyAssignment } from './util.js';
2
- const braceMatchingCalcContentExtractor = /calc\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/g;
3
3
  /**
4
4
  * Applies simplifications not covered by LightningCSS.
5
+ * Uses linear-time paren scanning instead of regex to avoid backtracking.
5
6
  */
6
7
  export function simplifyPreprocessCss(css) {
7
- return css.replace(braceMatchingCalcContentExtractor, (match) => simplifyLikeUnitDivision(match));
8
+ return replaceTopLevelTerms(css, (term) => {
9
+ if (term.startsWith('calc(')) {
10
+ return 'calc(' + simplifyLikeUnitDivision(term.slice(5, -1)) + ')';
11
+ }
12
+ return term;
13
+ });
8
14
  }
9
15
  function simplifyLikeUnitDivision(content) {
10
16
  return content.replace(/([0-9]+)([a-z]+)\s*\/\s*([0-9]+)\2/g, (_match, num1, _unit1, num2) => {
@@ -15,20 +21,23 @@ function simplifyLikeUnitDivision(content) {
15
21
  export function createSimplifier(config) {
16
22
  const enc = new TextEncoder();
17
23
  const dec = new TextDecoder();
18
- return (css) => {
24
+ return (css, options) => {
19
25
  let cssToTransform = css.text;
20
- cssToTransform = simplifyPreprocessCss(cssToTransform);
21
- if (css.type === 'value') {
22
- cssToTransform = wrapWithDummyAssignment(cssToTransform);
23
- }
24
- const result = config.transform({
25
- filename: 'input.css',
26
- code: enc.encode(cssToTransform),
27
- });
28
- if (css.type === 'value') {
29
- return unwrapDummyAssignment(dec.decode(result.code));
26
+ for (let i = 0; i < (config.options?.passes ?? 1); i++) {
27
+ cssToTransform = simplifyPreprocessCss(cssToTransform);
28
+ if (css.type === 'value') {
29
+ cssToTransform = wrapWithDummyAssignment(cssToTransform);
30
+ }
31
+ const result = config.transform({
32
+ filename: 'input.css',
33
+ code: enc.encode(cssToTransform),
34
+ });
35
+ if (css.type === 'value') {
36
+ return unwrapDummyAssignment(dec.decode(result.code));
37
+ }
38
+ cssToTransform = dec.decode(result.code);
30
39
  }
31
- return dec.decode(result.code);
40
+ return cssToTransform;
32
41
  };
33
42
  }
34
43
  //# sourceMappingURL=simplification.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplification.js","sourceRoot":"","sources":["../src/simplification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAE3E,MAAM,iCAAiC,GACtC,iDAAiD,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,OAAO,CAAC,iCAAiC,EAAE,CAAC,KAAK,EAAE,EAAE,CAC/D,wBAAwB,CAAC,KAAK,CAAC,CAC/B,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAChD,OAAO,OAAO,CAAC,OAAO,CACrB,qCAAqC,EACrC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,eAAe,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC,CACD,CAAC;AACH,CAAC;AAWD,MAAM,UAAU,gBAAgB,CAAC,MAKhC;IACA,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAQ,EAAE,EAAE;QACnB,IAAI,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC;QAE9B,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAEvD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,cAAc,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAC/B,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"simplification.js","sourceRoot":"","sources":["../src/simplification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAE3E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAChD,OAAO,oBAAoB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAChD,OAAO,OAAO,CAAC,OAAO,CACrB,qCAAqC,EACrC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,eAAe,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC,CACD,CAAC;AACH,CAAC;AAyBD,MAAM,UAAU,gBAAgB,CAAC,MAMhC;IACA,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAQ,EAAE,OAAO,EAAE,EAAE;QAC5B,IAAI,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;YAEvD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1B,cAAc,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC/B,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1B,OAAO,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;YAED,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,cAAc,CAAC;IACvB,CAAC,CAAC;AACH,CAAC"}
package/dist/util.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { TokenPurpose } from '@arbor-css/tokens';
1
2
  /**
2
3
  * LightningCSS only supports parsing full
3
4
  * stylesheets, but we often need to resolve
@@ -5,6 +6,7 @@
5
6
  * need to apply special processing to handle that case.
6
7
  */
7
8
  export declare function isSingleValue(css: string): boolean;
8
- export declare function wrapWithDummyAssignment(css: string): string;
9
+ export declare function guessPurposeFromText(css: string): TokenPurpose;
10
+ export declare function wrapWithDummyAssignment(css: string, purpose?: TokenPurpose): string;
9
11
  export declare function unwrapDummyAssignment(css: string): string;
10
12
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUlD;AAKD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASzD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUlD;AA4BD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CA8B9D;AAED,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAwC,GAC/C,MAAM,CAKR;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASzD"}
package/dist/util.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { replaceTopLevelTerms } from '@arbor-css/util';
1
2
  /**
2
3
  * LightningCSS only supports parsing full
3
4
  * stylesheets, but we often need to resolve
@@ -12,16 +13,69 @@ export function isSingleValue(css) {
12
13
  const withoutIf = css.replace(/if\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/g, '');
13
14
  return !withoutIf.includes(':') && !withoutIf.includes(';');
14
15
  }
15
- const dummyPreamble = '[data-arbor-result]{font-size:';
16
- const dummyPostamble = '}';
17
- export function wrapWithDummyAssignment(css) {
16
+ const purposeToPropertyTarget = {
17
+ color: 'background',
18
+ background: 'background',
19
+ 'border-radius': 'border-radius',
20
+ shadow: 'box-shadow',
21
+ 'border-style': 'border-style',
22
+ 'border-width': 'border-width',
23
+ 'font-size': 'font-size',
24
+ 'font-weight': 'font-weight',
25
+ 'easing-function': 'animation-timing-function',
26
+ 'font-family': 'font-family',
27
+ 'letter-spacing': 'letter-spacing',
28
+ 'line-height': 'line-height',
29
+ duration: 'transition-duration',
30
+ 'shadow-blur': 'width',
31
+ 'shadow-color': 'background',
32
+ 'shadow-spread': 'width',
33
+ 'shadow-x': 'width',
34
+ 'shadow-y': 'width',
35
+ border: 'border',
36
+ scalar: 'line-height',
37
+ size: 'width',
38
+ spacing: 'width',
39
+ other: 'background', // picked as a versatile simplifier property
40
+ };
41
+ export function guessPurposeFromText(css) {
42
+ // values with spaces in them could be border or shadow shorthands... or
43
+ // many other kinds of shorthands...
44
+ const withoutTermContents = replaceTopLevelTerms(css, () => '<term>');
45
+ const termCount = withoutTermContents.split(/\s+/).length;
46
+ if (termCount > 1) {
47
+ if (termCount === 2) {
48
+ return 'border-style';
49
+ }
50
+ else if (termCount === 3) {
51
+ return 'border';
52
+ }
53
+ else if (termCount > 3) {
54
+ return 'shadow';
55
+ }
56
+ }
57
+ // This is a very rough heuristic to determine the purpose of a token based on its value,
58
+ // which helps us choose appropriate simplification strategies.
59
+ if (css.includes('rgb') ||
60
+ css.includes('okl') ||
61
+ css.includes('#') ||
62
+ css.includes('hsl') ||
63
+ css.includes('lab') ||
64
+ css.includes('lch') ||
65
+ css.includes('color')) {
66
+ return 'color';
67
+ }
68
+ return 'other';
69
+ }
70
+ export function wrapWithDummyAssignment(css, purpose = guessPurposeFromText(css)) {
71
+ const propertyName = purposeToPropertyTarget[purpose] || 'background';
18
72
  // Wrap the input in a dummy assignment to make it parseable as a stylesheet.
19
73
  // We can remove this later since we only care about the value of the variable.
20
- return `${dummyPreamble}${css}${dummyPostamble}`;
74
+ return `[data-arbor-result]{${propertyName}:${css};}`;
21
75
  }
22
76
  export function unwrapDummyAssignment(css) {
23
77
  // Extract the original value from the dummy assignment.
24
- const match = css.match(/\[data-arbor-result\]\s*{\s*font-size\s*:\s*(.+?)\s*;?\s*}/);
78
+ const match = css.match(/\[data-arbor-result\]\s*{\s*[\w-]+\s*:\s*(.+?)\s*;?\s*}/);
25
79
  if (!match) {
26
80
  throw new Error('Invalid dummy assignment format');
27
81
  }
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACxC,6DAA6D;IAC7D,kDAAkD;IAClD,yEAAyE;IACzE,mCAAmC;IACnC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAC5B,+CAA+C,EAC/C,EAAE,CACF,CAAC;IACF,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,aAAa,GAAG,gCAAgC,CAAC;AACvD,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,6EAA6E;IAC7E,+EAA+E;IAC/E,OAAO,GAAG,aAAa,GAAG,GAAG,GAAG,cAAc,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAChD,wDAAwD;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACtB,4DAA4D,CAC5D,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACxC,6DAA6D;IAC7D,kDAAkD;IAClD,yEAAyE;IACzE,mCAAmC;IACnC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAC5B,+CAA+C,EAC/C,EAAE,CACF,CAAC;IACF,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,uBAAuB,GAAiC;IAC7D,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,eAAe;IAChC,MAAM,EAAE,YAAY;IACpB,cAAc,EAAE,cAAc;IAC9B,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,WAAW;IACxB,aAAa,EAAE,aAAa;IAC5B,iBAAiB,EAAE,2BAA2B;IAC9C,aAAa,EAAE,aAAa;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,aAAa,EAAE,aAAa;IAC5B,QAAQ,EAAE,qBAAqB;IAC/B,aAAa,EAAE,OAAO;IACtB,cAAc,EAAE,YAAY;IAC5B,eAAe,EAAE,OAAO;IACxB,UAAU,EAAE,OAAO;IACnB,UAAU,EAAE,OAAO;IACnB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,YAAY,EAAE,4CAA4C;CACjE,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC/C,wEAAwE;IACxE,oCAAoC;IACpC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,cAAc,CAAC;QACvB,CAAC;aAAM,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;aAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IAED,yFAAyF;IACzF,+DAA+D;IAC/D,IACC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACjB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EACpB,CAAC;QACF,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,GAAW,EACX,UAAwB,oBAAoB,CAAC,GAAG,CAAC;IAEjD,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC;IACtE,6EAA6E;IAC7E,+EAA+E;IAC/E,OAAO,uBAAuB,YAAY,IAAI,GAAG,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAChD,wDAAwD;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACtB,yDAAyD,CACzD,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbor-css/css-eval",
3
- "version": "0.0.109",
3
+ "version": "0.0.111",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -39,7 +39,8 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "lightningcss": "^1.32.0",
42
- "@arbor-css/tokens": "0.0.109"
42
+ "@arbor-css/tokens": "0.0.111",
43
+ "@arbor-css/util": "0.0.111"
43
44
  },
44
45
  "scripts": {
45
46
  "build": "tsc",