@weapp-tailwindcss/css-compat 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_layers = require("./layers-CT2GtJgP.cjs");
3
+ exports.compileCascadeLayers = require_layers.compileCascadeLayers;
4
+ exports.createCascadeLayersPlugin = require_layers.createCascadeLayersPlugin;
@@ -0,0 +1,17 @@
1
+ import { CascadeLayerDiagnostic } from "./diagnostics.cjs";
2
+ import { Plugin, Root } from "postcss";
3
+ //#region src/layers.d.ts
4
+ export interface CascadeLayerOptions {
5
+ mode: 'ordered' | 'preserve';
6
+ onConflict?: 'warning' | 'error' | undefined;
7
+ inputStage?: 'native' | 'polyfilled' | undefined;
8
+ }
9
+ export interface CascadeLayerCompilation {
10
+ root: Root;
11
+ diagnostics: CascadeLayerDiagnostic[];
12
+ }
13
+ /** 只编译当前 Root 的级联作用域;错误时不修改输入 AST。 */
14
+ export declare function compileCascadeLayers(root: Root, options: CascadeLayerOptions): CascadeLayerCompilation;
15
+ /** 在其他插件完成 import/nesting 后编译,并将定位诊断交给 PostCSS。 */
16
+ export declare function createCascadeLayersPlugin(options: CascadeLayerOptions): Plugin;
17
+ //#endregion
@@ -0,0 +1,17 @@
1
+ import { CascadeLayerDiagnostic } from "./diagnostics.mjs";
2
+ import { Plugin, Root } from "postcss";
3
+ //#region src/layers.d.ts
4
+ export interface CascadeLayerOptions {
5
+ mode: 'ordered' | 'preserve';
6
+ onConflict?: 'warning' | 'error' | undefined;
7
+ inputStage?: 'native' | 'polyfilled' | undefined;
8
+ }
9
+ export interface CascadeLayerCompilation {
10
+ root: Root;
11
+ diagnostics: CascadeLayerDiagnostic[];
12
+ }
13
+ /** 只编译当前 Root 的级联作用域;错误时不修改输入 AST。 */
14
+ export declare function compileCascadeLayers(root: Root, options: CascadeLayerOptions): CascadeLayerCompilation;
15
+ /** 在其他插件完成 import/nesting 后编译,并将定位诊断交给 PostCSS。 */
16
+ export declare function createCascadeLayersPlugin(options: CascadeLayerOptions): Plugin;
17
+ //#endregion
@@ -0,0 +1,2 @@
1
+ import { n as createCascadeLayersPlugin, t as compileCascadeLayers } from "./layers-D0OJtr2q.mjs";
2
+ export { compileCascadeLayers, createCascadeLayersPlugin };
@@ -0,0 +1,160 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rolldown_runtime = require("./rolldown-runtime-y5ARvAq5.cjs");
3
+ let postcss = require("postcss");
4
+ postcss = require_rolldown_runtime.__toESM(postcss, 1);
5
+ //#region src/legacy.ts
6
+ const LAYER_PATH_SEPARATOR = "";
7
+ const LAYER_INSERTION_ANCHOR = "__weapp_tailwindcss_layer_anchor__";
8
+ function splitLayerNames(params) {
9
+ return params.split(",").map((name) => name.trim()).filter(Boolean);
10
+ }
11
+ function splitLayerPath(name) {
12
+ return name.split(".").map((segment) => segment.trim()).filter(Boolean);
13
+ }
14
+ function createLayerPath(segments) {
15
+ return {
16
+ key: segments.join(LAYER_PATH_SEPARATOR),
17
+ segments
18
+ };
19
+ }
20
+ function isContainer(node) {
21
+ return "nodes" in node && Array.isArray(node.nodes);
22
+ }
23
+ function cloneWrapper(node, children) {
24
+ const wrapper = node.clone({ nodes: [] });
25
+ wrapper.append(...children);
26
+ return wrapper;
27
+ }
28
+ function wrapLayerNodes(atRule, nodes, root) {
29
+ let wrapped = nodes;
30
+ let parent = atRule.parent;
31
+ while (parent && parent !== root) {
32
+ if (parent.type !== "atrule" || parent.name !== "layer") {
33
+ if (isContainer(parent)) wrapped = [cloneWrapper(parent, wrapped)];
34
+ }
35
+ parent = parent.parent;
36
+ }
37
+ return wrapped;
38
+ }
39
+ function removeEmptyLayerAncestors(node, root) {
40
+ let parent = node.parent;
41
+ node.remove();
42
+ while (parent && parent !== root && parent.type === "atrule" && parent.nodes?.length === 0) {
43
+ const nextParent = parent.parent;
44
+ parent.remove();
45
+ parent = nextParent;
46
+ }
47
+ }
48
+ function isLayerDescendant(candidate, parent) {
49
+ return candidate.length > parent.length && parent.every((segment, index) => candidate[index] === segment);
50
+ }
51
+ function findParentLayerPath(atRule, paths) {
52
+ let parent = atRule.parent;
53
+ while (parent) {
54
+ if (parent.type === "atrule" && parent.name === "layer") return paths.get(parent)?.segments ?? [];
55
+ parent = parent.parent;
56
+ }
57
+ return [];
58
+ }
59
+ function createLayerInsertionAnchor(root, atRule) {
60
+ let topLevelNode = atRule;
61
+ while (topLevelNode.parent && topLevelNode.parent !== root) topLevelNode = topLevelNode.parent;
62
+ const anchor = postcss.default.comment({ text: LAYER_INSERTION_ANCHOR });
63
+ topLevelNode.before(anchor);
64
+ return anchor;
65
+ }
66
+ function insertLayeredNodes(root, anchor, nodes) {
67
+ if (!anchor.parent) {
68
+ root.append(nodes);
69
+ return;
70
+ }
71
+ if (nodes.length === 0) {
72
+ anchor.remove();
73
+ return;
74
+ }
75
+ anchor.replaceWith(nodes);
76
+ }
77
+ /**
78
+ * 按 cascade layer 声明顺序重排规则并移除 `@layer` 语法。
79
+ *
80
+ * 该转换只模拟 layer 的顺序语义,不通过提高选择器权重模拟完整 specificity 规则。
81
+ */
82
+ function consumeCascadeLayers(root) {
83
+ const layerAtRules = [];
84
+ const paths = /* @__PURE__ */ new WeakMap();
85
+ const siblingOrders = /* @__PURE__ */ new Map();
86
+ const buckets = /* @__PURE__ */ new Map();
87
+ const topLayerOccurrences = /* @__PURE__ */ new Map();
88
+ let anonymousLayerIndex = 0;
89
+ const registerPath = (segments, occurrence) => {
90
+ let parentKey = "";
91
+ for (const [index, segment] of segments.entries()) {
92
+ let siblings = siblingOrders.get(parentKey);
93
+ if (!siblings) {
94
+ siblings = /* @__PURE__ */ new Map();
95
+ siblingOrders.set(parentKey, siblings);
96
+ }
97
+ if (!siblings.has(segment)) siblings.set(segment, siblings.size);
98
+ if (index === 0 && !topLayerOccurrences.has(segment)) topLayerOccurrences.set(segment, occurrence);
99
+ parentKey = parentKey ? `${parentKey}${LAYER_PATH_SEPARATOR}${segment}` : segment;
100
+ }
101
+ const path = createLayerPath(segments);
102
+ if (!buckets.has(path.key)) buckets.set(path.key, {
103
+ ...path,
104
+ nodes: []
105
+ });
106
+ return path;
107
+ };
108
+ root.walkAtRules("layer", (atRule) => {
109
+ layerAtRules.push(atRule);
110
+ const parentLayer = findParentLayerPath(atRule, paths);
111
+ const names = splitLayerNames(atRule.params);
112
+ if (!atRule.nodes) {
113
+ for (const name of names) registerPath([...parentLayer, ...splitLayerPath(name)], atRule);
114
+ return;
115
+ }
116
+ const ownSegments = names[0] ? splitLayerPath(names[0]) : [`\u0000anonymous-${anonymousLayerIndex++}`];
117
+ paths.set(atRule, registerPath([...parentLayer, ...ownSegments], atRule));
118
+ });
119
+ if (layerAtRules.length === 0) return;
120
+ const insertionAnchors = /* @__PURE__ */ new Map();
121
+ for (const [segment, occurrence] of topLayerOccurrences) insertionAnchors.set(segment, createLayerInsertionAnchor(root, occurrence));
122
+ for (const atRule of [...layerAtRules].reverse()) {
123
+ if (!atRule.parent) continue;
124
+ const path = paths.get(atRule);
125
+ if (!path || !atRule.nodes) {
126
+ removeEmptyLayerAncestors(atRule, root);
127
+ continue;
128
+ }
129
+ const nodes = atRule.nodes.map((node) => node.clone());
130
+ if (nodes.length > 0) buckets.get(path.key)?.nodes.unshift(...wrapLayerNodes(atRule, nodes, root));
131
+ removeEmptyLayerAncestors(atRule, root);
132
+ }
133
+ const compareBuckets = (left, right) => {
134
+ if (isLayerDescendant(left.segments, right.segments)) return -1;
135
+ if (isLayerDescendant(right.segments, left.segments)) return 1;
136
+ const size = Math.min(left.segments.length, right.segments.length);
137
+ let parentKey = "";
138
+ for (let index = 0; index < size; index++) {
139
+ const leftSegment = left.segments[index];
140
+ const rightSegment = right.segments[index];
141
+ if (leftSegment !== rightSegment) {
142
+ const siblings = siblingOrders.get(parentKey);
143
+ return (siblings?.get(leftSegment) ?? 0) - (siblings?.get(rightSegment) ?? 0);
144
+ }
145
+ parentKey = parentKey ? `${parentKey}${LAYER_PATH_SEPARATOR}${leftSegment}` : leftSegment;
146
+ }
147
+ return left.segments.length - right.segments.length;
148
+ };
149
+ const bucketsByTopLayer = /* @__PURE__ */ new Map();
150
+ for (const bucket of buckets.values()) {
151
+ const topLayer = bucket.segments[0];
152
+ if (!topLayer || bucket.nodes.length === 0) continue;
153
+ const group = bucketsByTopLayer.get(topLayer) ?? [];
154
+ group.push(bucket);
155
+ bucketsByTopLayer.set(topLayer, group);
156
+ }
157
+ for (const [segment, anchor] of insertionAnchors) insertLayeredNodes(root, anchor, (bucketsByTopLayer.get(segment) ?? []).sort(compareBuckets).flatMap((bucket) => bucket.nodes));
158
+ }
159
+ //#endregion
160
+ exports.consumeCascadeLayers = consumeCascadeLayers;
@@ -0,0 +1,9 @@
1
+ import { Root } from "postcss";
2
+ //#region src/legacy.d.ts
3
+ /**
4
+ * 按 cascade layer 声明顺序重排规则并移除 `@layer` 语法。
5
+ *
6
+ * 该转换只模拟 layer 的顺序语义,不通过提高选择器权重模拟完整 specificity 规则。
7
+ */
8
+ export declare function consumeCascadeLayers(root: Root): void;
9
+ //#endregion
@@ -0,0 +1,9 @@
1
+ import { Root } from "postcss";
2
+ //#region src/legacy.d.ts
3
+ /**
4
+ * 按 cascade layer 声明顺序重排规则并移除 `@layer` 语法。
5
+ *
6
+ * 该转换只模拟 layer 的顺序语义,不通过提高选择器权重模拟完整 specificity 规则。
7
+ */
8
+ export declare function consumeCascadeLayers(root: Root): void;
9
+ //#endregion
@@ -0,0 +1,157 @@
1
+ import postcss from "postcss";
2
+ //#region src/legacy.ts
3
+ const LAYER_PATH_SEPARATOR = "";
4
+ const LAYER_INSERTION_ANCHOR = "__weapp_tailwindcss_layer_anchor__";
5
+ function splitLayerNames(params) {
6
+ return params.split(",").map((name) => name.trim()).filter(Boolean);
7
+ }
8
+ function splitLayerPath(name) {
9
+ return name.split(".").map((segment) => segment.trim()).filter(Boolean);
10
+ }
11
+ function createLayerPath(segments) {
12
+ return {
13
+ key: segments.join(LAYER_PATH_SEPARATOR),
14
+ segments
15
+ };
16
+ }
17
+ function isContainer(node) {
18
+ return "nodes" in node && Array.isArray(node.nodes);
19
+ }
20
+ function cloneWrapper(node, children) {
21
+ const wrapper = node.clone({ nodes: [] });
22
+ wrapper.append(...children);
23
+ return wrapper;
24
+ }
25
+ function wrapLayerNodes(atRule, nodes, root) {
26
+ let wrapped = nodes;
27
+ let parent = atRule.parent;
28
+ while (parent && parent !== root) {
29
+ if (parent.type !== "atrule" || parent.name !== "layer") {
30
+ if (isContainer(parent)) wrapped = [cloneWrapper(parent, wrapped)];
31
+ }
32
+ parent = parent.parent;
33
+ }
34
+ return wrapped;
35
+ }
36
+ function removeEmptyLayerAncestors(node, root) {
37
+ let parent = node.parent;
38
+ node.remove();
39
+ while (parent && parent !== root && parent.type === "atrule" && parent.nodes?.length === 0) {
40
+ const nextParent = parent.parent;
41
+ parent.remove();
42
+ parent = nextParent;
43
+ }
44
+ }
45
+ function isLayerDescendant(candidate, parent) {
46
+ return candidate.length > parent.length && parent.every((segment, index) => candidate[index] === segment);
47
+ }
48
+ function findParentLayerPath(atRule, paths) {
49
+ let parent = atRule.parent;
50
+ while (parent) {
51
+ if (parent.type === "atrule" && parent.name === "layer") return paths.get(parent)?.segments ?? [];
52
+ parent = parent.parent;
53
+ }
54
+ return [];
55
+ }
56
+ function createLayerInsertionAnchor(root, atRule) {
57
+ let topLevelNode = atRule;
58
+ while (topLevelNode.parent && topLevelNode.parent !== root) topLevelNode = topLevelNode.parent;
59
+ const anchor = postcss.comment({ text: LAYER_INSERTION_ANCHOR });
60
+ topLevelNode.before(anchor);
61
+ return anchor;
62
+ }
63
+ function insertLayeredNodes(root, anchor, nodes) {
64
+ if (!anchor.parent) {
65
+ root.append(nodes);
66
+ return;
67
+ }
68
+ if (nodes.length === 0) {
69
+ anchor.remove();
70
+ return;
71
+ }
72
+ anchor.replaceWith(nodes);
73
+ }
74
+ /**
75
+ * 按 cascade layer 声明顺序重排规则并移除 `@layer` 语法。
76
+ *
77
+ * 该转换只模拟 layer 的顺序语义,不通过提高选择器权重模拟完整 specificity 规则。
78
+ */
79
+ function consumeCascadeLayers(root) {
80
+ const layerAtRules = [];
81
+ const paths = /* @__PURE__ */ new WeakMap();
82
+ const siblingOrders = /* @__PURE__ */ new Map();
83
+ const buckets = /* @__PURE__ */ new Map();
84
+ const topLayerOccurrences = /* @__PURE__ */ new Map();
85
+ let anonymousLayerIndex = 0;
86
+ const registerPath = (segments, occurrence) => {
87
+ let parentKey = "";
88
+ for (const [index, segment] of segments.entries()) {
89
+ let siblings = siblingOrders.get(parentKey);
90
+ if (!siblings) {
91
+ siblings = /* @__PURE__ */ new Map();
92
+ siblingOrders.set(parentKey, siblings);
93
+ }
94
+ if (!siblings.has(segment)) siblings.set(segment, siblings.size);
95
+ if (index === 0 && !topLayerOccurrences.has(segment)) topLayerOccurrences.set(segment, occurrence);
96
+ parentKey = parentKey ? `${parentKey}${LAYER_PATH_SEPARATOR}${segment}` : segment;
97
+ }
98
+ const path = createLayerPath(segments);
99
+ if (!buckets.has(path.key)) buckets.set(path.key, {
100
+ ...path,
101
+ nodes: []
102
+ });
103
+ return path;
104
+ };
105
+ root.walkAtRules("layer", (atRule) => {
106
+ layerAtRules.push(atRule);
107
+ const parentLayer = findParentLayerPath(atRule, paths);
108
+ const names = splitLayerNames(atRule.params);
109
+ if (!atRule.nodes) {
110
+ for (const name of names) registerPath([...parentLayer, ...splitLayerPath(name)], atRule);
111
+ return;
112
+ }
113
+ const ownSegments = names[0] ? splitLayerPath(names[0]) : [`\u0000anonymous-${anonymousLayerIndex++}`];
114
+ paths.set(atRule, registerPath([...parentLayer, ...ownSegments], atRule));
115
+ });
116
+ if (layerAtRules.length === 0) return;
117
+ const insertionAnchors = /* @__PURE__ */ new Map();
118
+ for (const [segment, occurrence] of topLayerOccurrences) insertionAnchors.set(segment, createLayerInsertionAnchor(root, occurrence));
119
+ for (const atRule of [...layerAtRules].reverse()) {
120
+ if (!atRule.parent) continue;
121
+ const path = paths.get(atRule);
122
+ if (!path || !atRule.nodes) {
123
+ removeEmptyLayerAncestors(atRule, root);
124
+ continue;
125
+ }
126
+ const nodes = atRule.nodes.map((node) => node.clone());
127
+ if (nodes.length > 0) buckets.get(path.key)?.nodes.unshift(...wrapLayerNodes(atRule, nodes, root));
128
+ removeEmptyLayerAncestors(atRule, root);
129
+ }
130
+ const compareBuckets = (left, right) => {
131
+ if (isLayerDescendant(left.segments, right.segments)) return -1;
132
+ if (isLayerDescendant(right.segments, left.segments)) return 1;
133
+ const size = Math.min(left.segments.length, right.segments.length);
134
+ let parentKey = "";
135
+ for (let index = 0; index < size; index++) {
136
+ const leftSegment = left.segments[index];
137
+ const rightSegment = right.segments[index];
138
+ if (leftSegment !== rightSegment) {
139
+ const siblings = siblingOrders.get(parentKey);
140
+ return (siblings?.get(leftSegment) ?? 0) - (siblings?.get(rightSegment) ?? 0);
141
+ }
142
+ parentKey = parentKey ? `${parentKey}${LAYER_PATH_SEPARATOR}${leftSegment}` : leftSegment;
143
+ }
144
+ return left.segments.length - right.segments.length;
145
+ };
146
+ const bucketsByTopLayer = /* @__PURE__ */ new Map();
147
+ for (const bucket of buckets.values()) {
148
+ const topLayer = bucket.segments[0];
149
+ if (!topLayer || bucket.nodes.length === 0) continue;
150
+ const group = bucketsByTopLayer.get(topLayer) ?? [];
151
+ group.push(bucket);
152
+ bucketsByTopLayer.set(topLayer, group);
153
+ }
154
+ for (const [segment, anchor] of insertionAnchors) insertLayeredNodes(root, anchor, (bucketsByTopLayer.get(segment) ?? []).sort(compareBuckets).flatMap((bucket) => bucket.nodes));
155
+ }
156
+ //#endregion
157
+ export { consumeCascadeLayers };
@@ -0,0 +1,35 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ Object.defineProperty(exports, "__commonJSMin", {
25
+ enumerable: true,
26
+ get: function() {
27
+ return __commonJSMin;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "__toESM", {
31
+ enumerable: true,
32
+ get: function() {
33
+ return __toESM;
34
+ }
35
+ });
package/package.json CHANGED
@@ -1,6 +1,99 @@
1
1
  {
2
2
  "name": "@weapp-tailwindcss/css-compat",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "type": "module",
4
+ "version": "0.1.0",
5
+ "description": "框架无关的 CSS layer 顺序编译、诊断与显式旧算法兼容。",
6
+ "author": "ice breaker <1324318532@qq.com>",
7
+ "license": "MIT",
8
+ "homepage": "https://tw.weapp.dev",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/weapp-tailwindcss/weapp-tailwindcss.git",
12
+ "directory": "packages/css-compat"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/weapp-tailwindcss/weapp-tailwindcss/issues"
16
+ },
17
+ "sideEffects": false,
18
+ "exports": {
19
+ ".": {
20
+ "import": {
21
+ "types": "./dist/index.d.mts",
22
+ "default": "./dist/index.mjs"
23
+ },
24
+ "require": {
25
+ "types": "./dist/index.d.cts",
26
+ "default": "./dist/index.cjs"
27
+ }
28
+ },
29
+ "./layers": {
30
+ "import": {
31
+ "types": "./dist/layers.d.mts",
32
+ "default": "./dist/layers.mjs"
33
+ },
34
+ "require": {
35
+ "types": "./dist/layers.d.cts",
36
+ "default": "./dist/layers.cjs"
37
+ }
38
+ },
39
+ "./diagnostics": {
40
+ "import": {
41
+ "types": "./dist/diagnostics.d.mts",
42
+ "default": "./dist/diagnostics.mjs"
43
+ },
44
+ "require": {
45
+ "types": "./dist/diagnostics.d.cts",
46
+ "default": "./dist/diagnostics.cjs"
47
+ }
48
+ },
49
+ "./legacy": {
50
+ "import": {
51
+ "types": "./dist/legacy.d.mts",
52
+ "default": "./dist/legacy.mjs"
53
+ },
54
+ "require": {
55
+ "types": "./dist/legacy.d.cts",
56
+ "default": "./dist/legacy.cjs"
57
+ }
58
+ }
59
+ },
60
+ "main": "./dist/index.cjs",
61
+ "module": "./dist/index.mjs",
62
+ "types": "./dist/index.d.mts",
63
+ "files": [
64
+ "README.md",
65
+ "README.zh-CN.md",
66
+ "THIRD_PARTY_LICENSES.txt",
67
+ "dist"
68
+ ],
69
+ "engines": {
70
+ "node": "^22.18.0 || >=24.11.0"
71
+ },
72
+ "peerDependencies": {
73
+ "postcss": "^8.5.29"
74
+ },
75
+ "dependencies": {
76
+ "@csstools/css-tokenizer": "^4.0.1",
77
+ "@csstools/selector-specificity": "6.0.1",
78
+ "postcss-selector-parser": "^7.1.6"
79
+ },
80
+ "devDependencies": {
81
+ "mdn-data": "2.37.2"
82
+ },
83
+ "publishConfig": {
84
+ "access": "public",
85
+ "registry": "https://registry.npmjs.org"
86
+ },
87
+ "scripts": {
88
+ "build": "tsdown",
89
+ "test": "vitest run --update=none",
90
+ "typecheck": "tsc -p tsconfig.json --noEmit --pretty false",
91
+ "test:package": "node scripts/verify-package.mjs",
92
+ "test:consumers": "node scripts/verify-consumers.mjs",
93
+ "test:browser": "node scripts/browser-parity.mjs",
94
+ "bench": "node --expose-gc scripts/benchmark.mjs",
95
+ "properties:generate": "node scripts/generate-properties.mjs",
96
+ "properties:check": "node scripts/generate-properties.mjs --check",
97
+ "lint": "eslint src scripts"
98
+ }
6
99
  }