@ismail-elkorchi/css-parser 0.1.0 → 0.2.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.
- package/README.md +67 -69
- package/dist/internal/cssom/declarations.d.ts +36 -0
- package/dist/internal/cssom/declarations.js +177 -0
- package/dist/internal/generated/css-data.d.ts +2 -0
- package/dist/internal/generated/css-data.js +16229 -0
- package/dist/internal/grammar/catalog-types.d.ts +26 -0
- package/dist/internal/grammar/value-definition.d.ts +63 -0
- package/dist/internal/grammar/value-definition.js +439 -0
- package/dist/internal/properties/matcher.d.ts +29 -0
- package/dist/internal/properties/matcher.js +791 -0
- package/dist/internal/properties/registry.d.ts +24 -0
- package/dist/internal/properties/registry.js +52 -0
- package/dist/internal/selectors/matcher.d.ts +96 -0
- package/dist/internal/selectors/matcher.js +616 -0
- package/dist/internal/selectors/parser.d.ts +2 -0
- package/dist/internal/selectors/parser.js +702 -0
- package/dist/internal/selectors/specificity.d.ts +3 -0
- package/dist/internal/selectors/specificity.js +77 -0
- package/dist/internal/selectors/types.d.ts +110 -0
- package/dist/internal/syntax/ast.d.ts +70 -0
- package/dist/internal/syntax/ast.js +1 -0
- package/dist/internal/syntax/characters.d.ts +8 -0
- package/dist/internal/syntax/characters.js +45 -0
- package/dist/internal/syntax/encoding.d.ts +15 -0
- package/dist/internal/syntax/encoding.js +161 -0
- package/dist/internal/syntax/input.d.ts +23 -0
- package/dist/internal/syntax/input.js +184 -0
- package/dist/internal/syntax/parser.d.ts +26 -0
- package/dist/internal/syntax/parser.js +581 -0
- package/dist/internal/syntax/resources.d.ts +28 -0
- package/dist/internal/syntax/resources.js +135 -0
- package/dist/internal/syntax/serialize.d.ts +10 -0
- package/dist/internal/syntax/serialize.js +630 -0
- package/dist/internal/syntax/token-stream.d.ts +16 -0
- package/dist/internal/syntax/token-stream.js +66 -0
- package/dist/internal/syntax/tokenizer.d.ts +21 -0
- package/dist/internal/syntax/tokenizer.js +571 -0
- package/dist/internal/syntax/tokens.d.ts +115 -0
- package/dist/internal/syntax/tokens.js +1 -0
- package/dist/internal/syntax/types.d.ts +46 -0
- package/dist/internal/syntax/types.js +1 -0
- package/dist/mod.d.ts +7 -1
- package/dist/mod.js +7 -1
- package/dist/public/edits.d.ts +12 -0
- package/dist/public/edits.js +195 -0
- package/dist/public/mod.d.ts +13 -35
- package/dist/public/mod.js +12 -1740
- package/dist/public/parse.d.ts +37 -0
- package/dist/public/parse.js +298 -0
- package/dist/public/traversal.d.ts +13 -0
- package/dist/public/traversal.js +96 -0
- package/dist/public/types.d.ts +78 -264
- package/package.json +32 -53
- package/THIRD_PARTY_NOTICES.md +0 -19
- package/dist/internal/csstree-runtime.d.ts +0 -20
- package/dist/internal/csstree-runtime.js +0 -21
- package/dist/internal/encoding/mod.d.ts +0 -1
- package/dist/internal/encoding/mod.js +0 -1
- package/dist/internal/encoding/sniff.d.ts +0 -14
- package/dist/internal/encoding/sniff.js +0 -95
- package/dist/internal/serializer/mod.d.ts +0 -1
- package/dist/internal/serializer/mod.js +0 -1
- package/dist/internal/serializer/serialize.d.ts +0 -3
- package/dist/internal/serializer/serialize.js +0 -89
- package/dist/internal/tokenizer/mod.d.ts +0 -2
- package/dist/internal/tokenizer/mod.js +0 -1
- package/dist/internal/tokenizer/tokenize.d.ts +0 -2
- package/dist/internal/tokenizer/tokenize.js +0 -39
- package/dist/internal/tokenizer/tokens.d.ts +0 -23
- package/dist/internal/tree/build.d.ts +0 -2
- package/dist/internal/tree/build.js +0 -85
- package/dist/internal/tree/mod.d.ts +0 -2
- package/dist/internal/tree/mod.js +0 -1
- package/dist/internal/tree/types.d.ts +0 -25
- package/dist/internal/vendor/csstree/LICENSE +0 -19
- package/dist/internal/vendor/csstree/csstree.esm.js +0 -12
- package/dist/internal/version.d.ts +0 -1
- package/dist/internal/version.js +0 -1
- package/dist/public/index.d.ts +0 -1
- package/dist/public/index.js +0 -1
- /package/dist/internal/{tokenizer/tokens.js → grammar/catalog-types.js} +0 -0
- /package/dist/internal/{tree → selectors}/types.js +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const LIMIT_NAMES = [
|
|
2
|
+
"maxInputBytes",
|
|
3
|
+
"maxBufferedBytes",
|
|
4
|
+
"maxTokens",
|
|
5
|
+
"maxNodes",
|
|
6
|
+
"maxDepth",
|
|
7
|
+
"maxSteps"
|
|
8
|
+
];
|
|
9
|
+
export class SyntaxResourceError extends Error {
|
|
10
|
+
limitName;
|
|
11
|
+
limit;
|
|
12
|
+
actual;
|
|
13
|
+
code = "CSS_RESOURCE_LIMIT_EXCEEDED";
|
|
14
|
+
constructor(limitName, limit, actual) {
|
|
15
|
+
super(`${limitName} exceeded: limit ${String(limit)}, observed ${String(actual)}`);
|
|
16
|
+
this.limitName = limitName;
|
|
17
|
+
this.limit = limit;
|
|
18
|
+
this.actual = actual;
|
|
19
|
+
this.name = "SyntaxResourceError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class SyntaxAbortError extends Error {
|
|
23
|
+
reason;
|
|
24
|
+
code = "CSS_OPERATION_ABORTED";
|
|
25
|
+
constructor(reason) {
|
|
26
|
+
super("CSS operation aborted", reason === undefined ? undefined : { cause: reason });
|
|
27
|
+
this.reason = reason;
|
|
28
|
+
this.name = "SyntaxAbortError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function validateLimit(name, value) {
|
|
32
|
+
if (value === undefined) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
36
|
+
throw new RangeError(`${name} must be a non-negative safe integer`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class ResourceGuard {
|
|
40
|
+
signal;
|
|
41
|
+
limits;
|
|
42
|
+
#inputBytes = 0;
|
|
43
|
+
#maxBufferedBytes = 0;
|
|
44
|
+
#tokens = 0;
|
|
45
|
+
#nodes = 0;
|
|
46
|
+
#maxDepth = 0;
|
|
47
|
+
#steps = 0;
|
|
48
|
+
constructor(limits = {}, signal, initialUsage) {
|
|
49
|
+
this.signal = signal;
|
|
50
|
+
for (const name of LIMIT_NAMES) {
|
|
51
|
+
validateLimit(name, limits[name]);
|
|
52
|
+
}
|
|
53
|
+
this.limits = Object.freeze({ ...limits });
|
|
54
|
+
if (initialUsage !== undefined) {
|
|
55
|
+
this.assertObservedValue(initialUsage.inputBytes, "inputBytes");
|
|
56
|
+
this.assertObservedValue(initialUsage.maxBufferedBytes, "maxBufferedBytes");
|
|
57
|
+
this.assertObservedValue(initialUsage.tokens, "tokens");
|
|
58
|
+
this.assertObservedValue(initialUsage.nodes, "nodes");
|
|
59
|
+
this.assertObservedValue(initialUsage.maxDepth, "maxDepth");
|
|
60
|
+
this.assertObservedValue(initialUsage.steps, "steps");
|
|
61
|
+
this.#inputBytes = initialUsage.inputBytes;
|
|
62
|
+
this.#maxBufferedBytes = initialUsage.maxBufferedBytes;
|
|
63
|
+
this.#tokens = initialUsage.tokens;
|
|
64
|
+
this.#nodes = initialUsage.nodes;
|
|
65
|
+
this.#maxDepth = initialUsage.maxDepth;
|
|
66
|
+
this.#steps = initialUsage.steps;
|
|
67
|
+
this.#enforce("maxInputBytes", this.#inputBytes);
|
|
68
|
+
this.#enforce("maxBufferedBytes", this.#maxBufferedBytes);
|
|
69
|
+
this.#enforce("maxTokens", this.#tokens);
|
|
70
|
+
this.#enforce("maxNodes", this.#nodes);
|
|
71
|
+
this.#enforce("maxDepth", this.#maxDepth);
|
|
72
|
+
this.#enforce("maxSteps", this.#steps);
|
|
73
|
+
}
|
|
74
|
+
this.assertActive();
|
|
75
|
+
}
|
|
76
|
+
assertActive() {
|
|
77
|
+
if (this.signal?.aborted === true) {
|
|
78
|
+
throw new SyntaxAbortError(this.signal.reason);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
setInputBytes(value) {
|
|
82
|
+
this.assertObservedValue(value, "inputBytes");
|
|
83
|
+
this.#inputBytes = Math.max(this.#inputBytes, value);
|
|
84
|
+
this.#enforce("maxInputBytes", value);
|
|
85
|
+
}
|
|
86
|
+
observeBufferedBytes(value) {
|
|
87
|
+
this.assertObservedValue(value, "bufferedBytes");
|
|
88
|
+
this.#maxBufferedBytes = Math.max(this.#maxBufferedBytes, value);
|
|
89
|
+
this.#enforce("maxBufferedBytes", value);
|
|
90
|
+
}
|
|
91
|
+
emitToken(count = 1) {
|
|
92
|
+
this.assertIncrement(count);
|
|
93
|
+
this.#tokens += count;
|
|
94
|
+
this.#enforce("maxTokens", this.#tokens);
|
|
95
|
+
}
|
|
96
|
+
createNode(depth) {
|
|
97
|
+
this.assertObservedValue(depth, "depth");
|
|
98
|
+
this.#nodes += 1;
|
|
99
|
+
this.#maxDepth = Math.max(this.#maxDepth, depth);
|
|
100
|
+
this.#enforce("maxNodes", this.#nodes);
|
|
101
|
+
this.#enforce("maxDepth", depth);
|
|
102
|
+
}
|
|
103
|
+
step(count = 1) {
|
|
104
|
+
this.assertIncrement(count);
|
|
105
|
+
this.#steps += count;
|
|
106
|
+
this.#enforce("maxSteps", this.#steps);
|
|
107
|
+
this.assertActive();
|
|
108
|
+
}
|
|
109
|
+
snapshot() {
|
|
110
|
+
return Object.freeze({
|
|
111
|
+
inputBytes: this.#inputBytes,
|
|
112
|
+
maxBufferedBytes: this.#maxBufferedBytes,
|
|
113
|
+
tokens: this.#tokens,
|
|
114
|
+
nodes: this.#nodes,
|
|
115
|
+
maxDepth: this.#maxDepth,
|
|
116
|
+
steps: this.#steps
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
#enforce(name, actual) {
|
|
120
|
+
const limit = this.limits[name];
|
|
121
|
+
if (limit !== undefined && actual > limit) {
|
|
122
|
+
throw new SyntaxResourceError(name, limit, actual);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
assertIncrement(value) {
|
|
126
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
127
|
+
throw new RangeError("resource increments must be positive safe integers");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
assertObservedValue(value, name) {
|
|
131
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
132
|
+
throw new RangeError(`${name} must be a non-negative safe integer`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentValue, CssBlock, CssDeclaration, CssRule, CssStylesheet } from "./ast.js";
|
|
2
|
+
export type CssSyntaxSerializable = CssStylesheet | CssRule | CssBlock | CssDeclaration | ComponentValue;
|
|
3
|
+
export type CssSerializationErrorCode = "invalid-structure" | "cyclic-structure" | "shared-structure" | "duplicate-node-id" | "unserializable-token";
|
|
4
|
+
export declare class CssSerializationError extends TypeError {
|
|
5
|
+
readonly code: CssSerializationErrorCode;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
constructor(code: CssSerializationErrorCode, path: string, message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare function serializeCssSyntax(value: CssSyntaxSerializable): string;
|
|
10
|
+
export declare function serializeCssComponentValues(values: readonly ComponentValue[]): string;
|