@cssints/css-grammar 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.
package/dist/css.d.mts ADDED
@@ -0,0 +1,298 @@
1
+ import { Keywords } from "./keywords.mjs";
2
+ import { properties, syntaxes } from "./mdn.mjs";
3
+ //#region src/css.d.ts
4
+ type Props = typeof properties;
5
+ type Syns = typeof syntaxes;
6
+ type Ws = " " | "\n" | "\t";
7
+ type Trim<S extends string> = S extends `${Ws}${infer R}` ? Trim<R> : S;
8
+ type Special = "(" | ")" | "[" | "]" | "|" | "&" | "?" | "*" | "+" | "#" | "!" | "," | "/" | "{" | "}" | "<" | ">" | "'" | Ws;
9
+ type WordChar = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "-" | "_";
10
+ type TypeTok<T extends string> = T extends `${infer N} [${infer Lo},${infer Hi}]` ? ([Lo, Hi] extends [`${bigint}` | "-∞", `${bigint}` | "∞"] ? (`${Lo}${Hi}` extends `${string}-${Digit}${string}` ? {
11
+ t: "type";
12
+ v: N;
13
+ } : {
14
+ t: "type";
15
+ v: N;
16
+ lo: Lo;
17
+ hi: Hi;
18
+ }) : {
19
+ t: "type";
20
+ v: N;
21
+ }) : {
22
+ t: "type";
23
+ v: T;
24
+ };
25
+ type IsWord<W extends string> = W extends "" ? false : W extends `${string}${Special}${string}` ? false : true;
26
+ type Word<S extends string, Acc extends string = ""> = S extends `${infer C}${infer R}` ? (C extends WordChar ? Word<R, `${Acc}${C}`> : [Acc, S]) : [Acc, ""];
27
+ type Tok = {
28
+ t: "type";
29
+ v: string;
30
+ } | {
31
+ t: "prop";
32
+ v: string;
33
+ } | {
34
+ t: "kw";
35
+ v: string;
36
+ } | {
37
+ t: "fn";
38
+ v: string;
39
+ } | {
40
+ t: "type";
41
+ v: string;
42
+ lo: string;
43
+ hi: string;
44
+ } | {
45
+ t: "range";
46
+ lo: string;
47
+ hi: string;
48
+ } | {
49
+ t: "p";
50
+ v: string;
51
+ } | {
52
+ t: "lit";
53
+ v: string;
54
+ } | {
55
+ t: "eof";
56
+ };
57
+ type Next<S extends string> = S extends "" ? [{
58
+ t: "eof";
59
+ }, ""] : S extends `${Ws}${infer R}` ? Next<R> : S extends `<'${infer P}'>${infer R}` ? [{
60
+ t: "prop";
61
+ v: P;
62
+ }, R] : S extends `<${infer T}>${infer R}` ? [TypeTok<T>, R] : S extends `||${infer R}` ? [{
63
+ t: "p";
64
+ v: "||";
65
+ }, R] : S extends `&&${infer R}` ? [{
66
+ t: "p";
67
+ v: "&&";
68
+ }, R] : S extends `{${infer B}}${infer R}` ? (B extends `${infer Lo},${infer Hi}` ? [{
69
+ t: "range";
70
+ lo: Lo;
71
+ hi: Hi extends "" ? "∞" : Hi;
72
+ }, R] : [{
73
+ t: "range";
74
+ lo: B;
75
+ hi: B;
76
+ }, R]) : S extends `${infer C extends "[" | "]" | ")" | "|" | "?" | "*" | "+" | "#" | "!" | "," | "/"}${infer R}` ? [{
77
+ t: "p";
78
+ v: C;
79
+ }, R] : S extends `${infer W} ${infer R}` ? (IsWord<W> extends true ? [{
80
+ t: "kw";
81
+ v: W;
82
+ }, R] : NextWord<S>) : IsWord<S> extends true ? [{
83
+ t: "kw";
84
+ v: S;
85
+ }, ""] : NextWord<S>;
86
+ type NextWord<S extends string> = Word<S> extends [infer W extends string, infer R extends string] ? W extends "" ? (S extends `(${infer R2}` ? [{
87
+ t: "p";
88
+ v: "(";
89
+ }, R2] : S extends `'${infer Q}'${infer R2}` ? [{
90
+ t: "lit";
91
+ v: Q;
92
+ }, R2] : [{
93
+ t: "eof";
94
+ }, ""]) : R extends `(${infer R2}` ? [{
95
+ t: "fn";
96
+ v: W;
97
+ }, R2] : [{
98
+ t: "kw";
99
+ v: W;
100
+ }, R] : never;
101
+ type Node = ["kw", string] | ["type", string] | ["type", string, string, string] | ["prop", string] | ["fn", string, Node] | ["lit", string] | ["alt", Node, Node | null] | ["or", Node[]] | ["and", Node[]] | ["seq", Node[]] | ["opt", Node] | ["star", Node] | ["plus", Node] | ["list", Node] | ["rep", Node, string, string] | ["bang", Node];
102
+ export type Parse<S extends string> = ParseAlt<S> extends [infer N, any] ? N : never;
103
+ type ParseAlt<S extends string> = ParseOr<S> extends [infer N extends Node, infer R extends string] ? AltRest<R, ["alt", N, null]> : never;
104
+ type AltRest<S extends string, Acc extends Node> = Next<S> extends [{
105
+ t: "p";
106
+ v: "|";
107
+ }, infer R extends string] ? (ParseOr<R> extends [infer N extends Node, infer R2 extends string] ? AltRest<R2, ["alt", N, Acc]> : never) : [Acc extends ["alt", infer Only, null] ? Only : Acc, S];
108
+ type ParseOr<S extends string> = ParseAnd<S> extends [infer N extends Node, infer R extends string] ? OrRest<R, [N]> : never;
109
+ type OrRest<S extends string, Acc extends Node[]> = Next<S> extends [{
110
+ t: "p";
111
+ v: "||";
112
+ }, infer R extends string] ? (ParseAnd<R> extends [infer N extends Node, infer R2 extends string] ? OrRest<R2, [...Acc, N]> : never) : [Acc extends [infer Only] ? Only : ["or", Acc], S];
113
+ type ParseAnd<S extends string> = ParseSeq<S> extends [infer N extends Node, infer R extends string] ? AndRest<R, [N]> : never;
114
+ type AndRest<S extends string, Acc extends Node[]> = Next<S> extends [{
115
+ t: "p";
116
+ v: "&&";
117
+ }, infer R extends string] ? (ParseSeq<R> extends [infer N extends Node, infer R2 extends string] ? AndRest<R2, [...Acc, N]> : never) : [Acc extends [infer Only] ? Only : ["and", Acc], S];
118
+ type ParseSeq<S extends string, Acc extends Node[] = []> = Next<S> extends [{
119
+ t: "eof";
120
+ } | {
121
+ t: "p";
122
+ v: "|" | "||" | "&&" | "]" | ")";
123
+ }, any] ? [Acc extends [infer Only] ? Only : ["seq", Acc], S] : ParseTerm<S> extends [infer N extends Node, infer R extends string] ? ParseSeq<R, [...Acc, N]> : never;
124
+ type ParseTerm<S extends string> = Next<S> extends [infer T extends Tok, infer R extends string] ? T extends {
125
+ t: "p";
126
+ v: "[";
127
+ } ? (ParseAlt<R> extends [infer N extends Node, infer R2 extends string] ? (Next<R2> extends [{
128
+ t: "p";
129
+ v: "]";
130
+ }, infer R3 extends string] ? Mult<N, R3> : never) : never) : T extends {
131
+ t: "fn";
132
+ v: infer V extends string;
133
+ } ? FnArgs<V, R> : T extends {
134
+ t: "p";
135
+ v: "(";
136
+ } ? FnArgs<"", R> : T extends {
137
+ t: "type";
138
+ v: infer V extends string;
139
+ lo: infer Lo extends string;
140
+ hi: infer Hi extends string;
141
+ } ? Mult<["type", V, Lo, Hi], R> : T extends {
142
+ t: "type";
143
+ v: infer V extends string;
144
+ } ? Mult<["type", V], R> : T extends {
145
+ t: "prop";
146
+ v: infer V extends string;
147
+ } ? Mult<["prop", V], R> : T extends {
148
+ t: "kw";
149
+ v: infer V extends string;
150
+ } ? Mult<["kw", V], R> : T extends {
151
+ t: "p";
152
+ v: infer V extends "," | "/";
153
+ } ? Mult<["lit", V], R> : T extends {
154
+ t: "lit";
155
+ v: infer V extends string;
156
+ } ? Mult<["lit", V], R> : never : never;
157
+ type FnArgs<V extends string, S extends string> = ParseAlt<S> extends [infer N extends Node, infer R extends string] ? (Next<R> extends [{
158
+ t: "p";
159
+ v: ")";
160
+ }, infer R2 extends string] ? Mult<["fn", V, N], R2> : never) : never;
161
+ type Dec = {
162
+ "1": "0";
163
+ "2": "1";
164
+ "3": "2";
165
+ "4": "3";
166
+ "6": "5";
167
+ "16": "15";
168
+ "∞": "∞";
169
+ };
170
+ type Mult<N, S extends string> = Next<S> extends [infer T extends Tok, infer R extends string] ? T extends {
171
+ t: "p";
172
+ v: "?";
173
+ } ? Mult<["opt", N], R> : T extends {
174
+ t: "p";
175
+ v: "*";
176
+ } ? Mult<["star", N], R> : T extends {
177
+ t: "p";
178
+ v: "+";
179
+ } ? Mult<["plus", N], R> : T extends {
180
+ t: "p";
181
+ v: "#";
182
+ } ? Mult<["list", N], R> : T extends {
183
+ t: "p";
184
+ v: "!";
185
+ } ? Mult<["bang", N], R> : T extends {
186
+ t: "range";
187
+ lo: infer Lo extends string;
188
+ hi: infer Hi extends string;
189
+ } ? Mult<N extends ["list", infer X extends Node] ? ["seq", [X, ["rep", ["seq", [["lit", ","], X]], Dec[Lo & keyof Dec], Dec[Hi & keyof Dec]]]] : ["rep", N, Lo, Hi], R> : [N, S] : never;
190
+ type Tok1<S extends string> = S extends `${infer T} ${infer R}` ? Split<T, ` ${R}`> : Split<S, "">;
191
+ type Split<T extends string, R extends string> = T extends `${string}${"," | ")"}${string}` ? SplitComma<T, R> : [T, R];
192
+ type SplitComma<T extends string, R extends string> = T extends `${infer A},${infer B}` ? SplitParen<A, `,${B}${R}`> : SplitParen<T, R>;
193
+ type SplitParen<T extends string, R extends string> = T extends `${infer A})${infer B}` ? [A, `)${B}${R}`] : [T, R];
194
+ export type LengthUnit = "px" | "em" | "rem" | "vw" | "vh" | "vmin" | "vmax" | "ch" | "ex" | "lh" | "rlh" | "cm" | "mm" | "in" | "pt" | "pc" | "q" | "svw" | "svh" | "lvw" | "lvh" | "dvw" | "dvh" | "cqw" | "cqh" | "cqi" | "cqb" | "cqmin" | "cqmax" | "ic" | "cap" | "rex" | "rch" | "ric" | "rcap";
195
+ export type Wild = "⟨*⟩";
196
+ export type Sentinels = "color" | "length" | "percentage" | "number" | "integer" | "angle" | "time" | "custom-ident" | "resolution" | "url" | "image" | "transform-list" | "easing-function" | "shadow";
197
+ /** What the recognizer sees of a typed value of type `T`: `⟨T⟩`, or `⟨*⟩` for one of every type (a token of a JSON import). */
198
+ export type Sentinel<T extends string> = [Sentinels] extends [T] ? Wild : `⟨${T}⟩`;
199
+ type WildNamed = "color" | "image" | "transform-list" | "easing-function" | "shadow";
200
+ type PrimitiveMap = {
201
+ length: `${number}${LengthUnit}` | "0" | "⟨length⟩" | Wild;
202
+ percentage: `${number}%` | "⟨percentage⟩" | Wild;
203
+ "length-percentage": `${number}${LengthUnit}` | "0" | `${number}%` | "⟨length⟩" | "⟨percentage⟩" | Wild;
204
+ number: `${number}` | "⟨number⟩" | "⟨integer⟩" | Wild;
205
+ integer: `${bigint}` | "⟨integer⟩" | Wild;
206
+ "hex-color": `#${string}`;
207
+ "custom-ident": string;
208
+ ident: string;
209
+ "ident-token": string;
210
+ "dashed-ident": `--${string}` | "⟨dashed-ident⟩";
211
+ angle: `${number}${"deg" | "rad" | "grad" | "turn"}` | "⟨angle⟩" | Wild;
212
+ time: `${number}${"s" | "ms"}` | "⟨time⟩" | Wild;
213
+ resolution: `${number}${"dpi" | "dpcm" | "dppx" | "x"}` | "⟨resolution⟩" | Wild;
214
+ flex: `${number}fr`;
215
+ zero: "0" | "+0" | "-0";
216
+ "hash-token": `#${string}`;
217
+ "intrinsic-size-keyword": "min-content" | "max-content" | "fit-content" | "stretch";
218
+ x: `${number}`;
219
+ y: `${number}`;
220
+ dimension: `${number}${LengthUnit | "deg" | "rad" | "grad" | "turn" | "s" | "ms" | "hz" | "khz" | "dpi" | "dpcm" | "dppx" | "x" | "fr"}`;
221
+ };
222
+ type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
223
+ type NotIdentChar = "'" | '"' | "#" | "." | "+" | "(" | "!" | "$" | "%" | "&" | "*" | "/" | ":" | ";" | "<" | "=" | ">" | "?" | "@" | "[" | "\\" | "]" | "^" | "`" | "{" | "|" | "}" | "~";
224
+ type NotIdentStart = `${string}${NotIdentChar}${string}` | `${Digit | `-${Digit}`}${string}` | "-" | `⟨${string}`;
225
+ type NotIdent = NotIdentStart | "initial" | "inherit" | "unset" | "revert" | "revert-layer" | "default";
226
+ export type Consume<N, S extends string, P extends boolean = false> = S extends string ? N extends ["kw", infer V extends string] ? (Tok1<S> extends [V, infer R extends string] ? Trim<R> : P extends true ? Pend<N, S> : never) : N extends ["lit", infer V extends string] ? (S extends `${V}${infer R}` ? Trim<R> : P extends true ? Pend<N, S> : never) : N extends ["type", infer V extends string, ...infer G] ? V extends keyof PrimitiveMap ? (Tok1<S> extends [infer T extends string, infer R extends string] ? (T extends "" ? never : T extends PrimitiveMap[V] ? (V extends "custom-ident" ? (T extends "⟨custom-ident⟩" | Wild ? Trim<R> : Lowercase<T> extends NotIdent ? P extends true ? Pend<N, S> : never : Trim<R>) : V extends "ident" | "ident-token" ? (T extends NotIdentStart ? P extends true ? Pend<N, S> : never : Trim<R>) : G extends [infer Lo extends string, infer Hi extends string] ? (true extends Out<T, Lo, Hi> ? never : Trim<R>) : Trim<R>) : V extends Numeric ? (T extends `${string}(${string}` ? MathCall<S> | (P extends true ? Pend<N, S> : never) : P extends true ? Pend<N, S> : never) : P extends true ? Pend<N, S> : never) : never) : V extends "string" | "url" ? Scanned<V, S> | (P extends true ? Pend<N, S> : never) : V extends "declaration-value" ? Scanned<V, S> : V extends "math-function" ? MathCall<S> : V extends "declaration" ? Scanned<"declaration-value", S> : V extends "if()" ? (S extends `if(${infer R}` ? Close<Declaration<Trim<R>, Trim<R>, [], true>> : never) : V extends keyof Syns ? (V extends `${infer F}()` ? (S extends `${F}(${string}` ? Consume<Parse<Syns[V]>, S, P> : S extends `⟨${V}⟩${infer R}` ? Trim<R> : P extends true ? Pend<N, S> : never) : S extends `⟨${V | (V extends WildNamed ? "*" : never)}⟩${infer R}` ? Trim<R> : Consume<Parse<Syns[V]>, S, P>) : never : N extends ["prop", infer V extends string] ? (V extends keyof Props ? Consume<Parse<Props[V]>, S, P> : never) : N extends ["fn", infer F extends string, infer A] ? (S extends `${F}(${infer R}` ? (F extends RelativeFn ? (Trim<R> extends `from ${string}` ? Close<Declaration<Trim<R>, Trim<R>, []>> : Close<Consume<A, Trim<R>, P>>) : Close<Consume<A, Trim<R>, P>>) : P extends true ? Pend<N, S> : never) : N extends ["alt", any, any] ? ConsumeAlt<N, S, P> : N extends ["seq", infer Xs extends Node[]] ? SeqRest<Xs, S, never, never, never, P> : N extends ["opt", infer X] ? S | Consume<X, S, P> : N extends ["star", infer X] ? Star<X, S, P> : N extends ["plus", infer X] ? Star<X, Consume<X, S, P>, P> : N extends ["list", infer X] ? ListRest<X, Consume<X, S, P>, P> : N extends ["rep", infer X, infer Lo extends string, infer Hi extends string] ? Rep<X, S, Lo, Hi, P> : N extends ["or", infer Xs extends Node[]] ? AnyOrder<Xs, S, false, P> : N extends ["and", infer Xs extends Node[]] ? AnyOrder<Xs, S, true, P> : N extends ["bang", infer X] ? Exclude<Consume<X, S, P>, S> : never : never;
227
+ type Numeric = "length" | "percentage" | "length-percentage" | "number" | "integer" | "angle" | "time" | "resolution" | "x" | "y";
228
+ type MathFn = "calc" | "min" | "max" | "clamp" | "round" | "mod" | "rem" | "sin" | "cos" | "tan" | "asin" | "acos" | "atan" | "atan2" | "pow" | "sqrt" | "hypot" | "log" | "exp" | "abs" | "sign";
229
+ type MathCall<S extends string> = S extends `${MathFn}(${infer R}` ? Close<Declaration<Trim<R>, Trim<R>, []>> : never;
230
+ type RelativeFn = "rgb" | "rgba" | "hsl" | "hsla" | "hwb" | "lab" | "lch" | "oklab" | "oklch" | "color";
231
+ type HasPending<S extends string> = S extends `${string}${"var(--" | "env(" | "if("}${string}` ? true : false;
232
+ type Pend<N, S extends string> = S extends `var(--${string}` | `env(${string}` | `if(${string}` ? (S extends `${string}(${infer X}` ? (Close<Declaration<Trim<X>, Trim<X>, [], true>> extends (infer Q extends string) ? S | Q | Consume<N, Q, true> : never) : never) : never;
233
+ type PendDone<R extends string> = R extends `var(--${string}` | `env(${string}` | `if(${string}` ? (R extends `${string}(${infer X}` ? (Close<Declaration<Trim<X>, Trim<X>, [], true>> extends (infer Q extends string) ? (Q extends "" ? true : PendDone<Q>) : never) : never) : never;
234
+ type Close<R> = R extends `)${infer Q}` ? Trim<Q> : R extends `var(--${string}` | `env(${string}` | `if(${string}` ? (R extends `${string}(${infer X}` ? (Close<Declaration<Trim<X>, Trim<X>, [], true>> extends (infer Q) ? Close<Q> : never) : never) : never;
235
+ type Scanned<V extends string, S extends string> = V extends "string" ? Quoted<S> : V extends "url" ? UrlRest<S> : Declaration<S, S, []>;
236
+ type Quoted<S extends string> = S extends `"${string}"${infer R}` ? Trim<R> : S extends `'${string}'${infer R}` ? Trim<R> : never;
237
+ type UrlRest<S extends string> = S extends `⟨${"url" | "*"}⟩${infer R}` ? Trim<R> : S extends `url(${infer B})${infer R}` ? (UrlBody<TrimEnd<Trim<B>>> extends true ? Trim<R> : never) : never;
238
+ type UrlBody<B extends string> = B extends `"${infer Q}"` ? (Q extends `${string}"${string}` ? false : true) : B extends `'${infer Q}'` ? (Q extends `${string}'${string}` ? false : true) : B extends `${string}${Ws | '"' | "'" | "(" | "\\"}${string}` ? false : true;
239
+ type TrimEnd<S extends string> = S extends `${infer R}${Ws}` ? TrimEnd<R> : S;
240
+ type Declaration<S extends string, Rest extends string, D extends 0[], Semi extends boolean = false> = Rest extends `${infer C}${infer R}` ? C extends '"' | "'" ? (R extends `${string}${C}${infer R2}` ? Declaration<S, R2, D, Semi> : never) : C extends "(" | "[" | "{" ? Declaration<S, R, [...D, 0], Semi> : C extends ")" | "]" | "}" ? (D extends [0, ...infer D2 extends 0[]] ? Declaration<S, R, D2, Semi> : C extends ")" ? (Rest extends S ? never : Rest) : never) : C extends ";" | "!" ? (D extends [] ? ([C, Semi] extends [";", true] ? Declaration<S, R, D, Semi> : never) : Declaration<S, R, D, Semi>) : Declaration<S, R, D, Semi> : D extends [] ? (Rest extends S ? never : "") : never;
241
+ type ConsumeAlt<N, S extends string, P extends boolean, Acc = never> = N extends ["alt", infer H, infer T] ? ConsumeAlt<T, S, P, Acc | Consume<H, S, P>> : Acc;
242
+ type Nullable = ["opt", any] | ["star", any] | ["rep", any, "0", string];
243
+ type SeqRest<Xs extends Node[], S extends string, Start extends string, Moved extends string, Done extends string, P extends boolean> = Xs extends [infer H, ...infer R extends Node[]] ? H extends ["lit", ","] ? (AfterComma<Exclude<S, Start>, P> extends (infer After extends string) ? R extends [Nullable, ...Nullable[]] ? SeqRest<R, Extract<S, Start> | After, Extract<S, Start> | After, After, Done | Exclude<S, Start>, P> : SeqRest<R, Extract<S, Start> | After, Extract<S, Start> | After, Moved, Done, P> : never) : SeqRest<R, Consume<H, S, P>, [Start] extends [never] ? S : Start, Moved, Done, P> : Exclude<S, Moved> | Done;
244
+ type AfterComma<S extends string, P extends boolean> = S extends `,${infer Q}` ? Trim<Q> : P extends true ? Pend<["lit", ","], S> : never;
245
+ type Full = [0, 0, 0, 0, 0, 0, 0, 0, ...0[]];
246
+ type Star<X, S extends string, P extends boolean, D extends any[] = []> = {
247
+ done: S;
248
+ next: S | Star<X, Consume<X, S, P>, P, [...D, 0]>;
249
+ }[D extends Full ? "done" : "next"];
250
+ type ListRest<X, R, P extends boolean, Acc = never> = (R extends string ? AfterComma<R, P> : never) extends (infer Q extends string) ? ([Q] extends [never] ? Acc | R : ListRest<X, Exclude<Consume<X, Q, P>, Acc | R>, P, Acc | R>) : never;
251
+ type Digits = {
252
+ "0": [];
253
+ "1": [0];
254
+ "2": [0, 0];
255
+ "3": [0, 0, 0];
256
+ "4": [0, 0, 0, 0];
257
+ "5": [0, 0, 0, 0, 0];
258
+ "6": [0, 0, 0, 0, 0, 0];
259
+ "15": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
260
+ "∞": [0, 0, 0, 0, 0, 0, 0, 0];
261
+ };
262
+ type Rep<X, S extends string, Lo extends string, Hi extends string, P extends boolean> = RepN<X, S, Digits[Lo & keyof Digits], Digits[Hi & keyof Digits], [], P>;
263
+ type RepN<X, S extends string, Lo extends any[], Hi extends any[], I extends any[], P extends boolean> = {
264
+ done: S;
265
+ next: (I extends [...Lo, ...any] ? S : never) | RepN<X, Consume<X, S, P>, Lo, Hi, [...I, 0], P>;
266
+ }[I["length"] extends Hi["length"] ? "done" : "next"];
267
+ type AnyOrder<Xs extends Node[], S extends string, All extends boolean, P extends boolean> = [S] extends [never] ? never : Xs extends [] ? S : [P] extends [true] ? AnyOrderPend<Xs, S, All> : TryEach<Xs, Xs, S, All, [], P>;
268
+ type AnyOrderPend<Xs extends Node[], S extends string, All extends boolean> = PendHead<S> extends (infer Q extends string) ? ([Q] extends [never] ? TryEach<Xs, Xs, S, All, [], true> : S | Q | AnyOrder<Xs, Q, false, true> | TryHead<Xs, Xs, [], S | Q, S>) : never;
269
+ type PendHead<S extends string> = S extends `var(--${string}` | `env(${string}` | `if(${string}` ? (S extends `${string}(${infer X}` ? Close<Declaration<Trim<X>, Trim<X>, [], true>> : never) : never;
270
+ type TryHead<Parts extends Node[], Todo extends Node[], I extends any[], Skip extends string, S extends string> = Todo extends [infer H, ...infer R extends Node[]] ? (Exclude<Consume<H, S, true>, Skip> extends (infer R1 extends string) ? R1 | AnyOrder<RemoveAt<Parts, `${I["length"]}`>, R1, false, true> : never) | TryHead<Parts, R, [...I, 0], Skip, S> : never;
271
+ type TryEach<Parts extends Node[], Todo extends Node[], S extends string, All extends boolean, I extends any[], P extends boolean> = Todo extends [infer H, ...infer R extends Node[]] ? (Consume<H, S, P> extends (infer R1 extends string) ? (All extends true ? never : R1) | AnyOrder<RemoveAt<Parts, `${I["length"]}`>, R1, All, P> : never) | TryEach<Parts, R, S, All, [...I, 0], P> : never;
272
+ type RemoveAt<T extends any[], K extends string, I extends any[] = [], Acc extends any[] = []> = T extends [infer H, ...infer R] ? (`${I["length"]}` extends K ? [...Acc, ...R] : RemoveAt<R, K, [...I, 0], [...Acc, H]>) : Acc;
273
+ type Out<T extends string, Lo extends string, Hi extends string> = T extends `-${infer M}` ? (Lo extends "-∞" ? false : M extends `${string}${"e" | "E"}-${string}` ? false : Lo extends "0" ? NonZero<M> : true) : [Lo, Hi] extends ["0" | "-∞", "∞"] ? false : Decimal<T extends `+${infer M}` ? M : T> extends [infer I extends string, infer F extends boolean] ? (Lo extends "-∞" | "0" ? false : Cmp<I, Lo> extends "lt" ? true : false) | (Hi extends "∞" ? false : Cmp<I, Hi> extends "gt" ? true : Cmp<I, Hi> extends "eq" ? F : false) : false;
274
+ type NonZero<M extends string> = M extends `${"0" | "."}${infer R}` ? NonZero<R> : M extends `${Exclude<Digit, "0">}${string}` ? true : false;
275
+ type Decimal<M extends string> = M extends `${Digit | "."}${string}` ? DecInt<M, ""> : false;
276
+ type DecInt<M extends string, I extends string> = M extends `${infer C extends Digit}${infer R}` ? DecInt<R, I extends "" ? (C extends "0" ? "" : C) : `${I}${C}`> : M extends `.${infer R}` ? DecFrac<R, I extends "" ? "0" : I, false> : DecEnd<M, I extends "" ? "0" : I, false>;
277
+ type DecFrac<M extends string, I extends string, F extends boolean> = M extends `${infer C extends Digit}${infer R}` ? DecFrac<R, I, C extends "0" ? F : true> : DecEnd<M, I, F>;
278
+ type DecEnd<M extends string, I extends string, F extends boolean> = M extends `${"e" | "E"}${"+" | "-" | ""}${Digit}${string}` ? false : [I, F];
279
+ type Cmp<A extends string, B extends string, V extends string = "eq"> = A extends `${infer X}${infer RA}` ? (B extends `${infer Y}${infer RB}` ? Cmp<RA, RB, V extends "eq" ? (X extends Y ? "eq" : "0123456789" extends `${string}${X}${string}${Y}${string}` ? "lt" : "gt") : V> : "gt") : B extends "" ? V : "lt";
280
+ export type Matches<Syntax extends string, S extends string> = "" extends Consume<Parse<Syntax>, Trim<S>> ? true : false;
281
+ export type MatchesValue<Syntax extends string, S extends string> = Consume<Parse<Syntax>, Trim<S>, HasPending<S>> extends (infer R extends string) ? ("" extends R ? true : true extends PendDone<R> ? true : false) : never;
282
+ export type Stuck<U extends string, All extends string = U> = U extends string ? ([All] extends [`${string}${U}`] ? U : never) : never;
283
+ export type Unexpected<S extends string> = S extends "" ? "unexpected end" : `unexpected "${Tok1<S>[0]}"`;
284
+ export type Valid<P extends keyof Props, S extends string> = ValidIn<P, Props[P], S>;
285
+ export type ValidIn<Label extends string, G extends string, S extends string> = MatchesValue<G, S> extends true ? S : S extends CssWide ? S : S extends string ? Message<Label, G, S> : never;
286
+ type CssWide = "inherit" | "initial" | "unset" | "revert" | "revert-layer";
287
+ export type Hint<P extends string, T extends string> = Offer<P, LastWord<T>>;
288
+ type LastWord<T extends string, Head extends string = ""> = T extends `${infer W} ${infer R}` ? LastWord<R, `${Head}${W} `> : [Head, T];
289
+ type Offer<P extends string, L> = L extends [infer H extends string, infer W extends string] ? (Keywords extends { [K in P]: infer O; } ? OfferWord<Bucket<O, Lowercase<W>>, H, W> : never) : never;
290
+ type Bucket<O, W extends string> = O extends unknown ? (W extends `${infer C}${string}` ? (C extends keyof O ? O[C] : never) : O[keyof O]) : never;
291
+ type OfferWord<K, H extends string, W extends string> = K extends string ? (Lowercase<K> extends `${Lowercase<W>}${string}` ? (K extends W ? never : `${H}${K}`) : never) : never;
292
+ export type Furthest<P extends keyof Props, S extends string> = FurthestIn<Props[P], S>;
293
+ export type FurthestIn<G extends string, S extends string> = Stuck<Trim<S> | Consume<Parse<G>, Trim<S>, HasPending<S>>>;
294
+ type Message<Label extends string, G extends string, S extends string> = FurthestIn<G, S> extends (infer F extends string) ? `${Label}: ${Unexpected<F>} in "${S}"${CaseFix<Label, F>}, grammar ${G}` : never;
295
+ type CaseFix<Label extends string, F extends string> = Tok1<F>[0] extends (infer W extends string) ? ([W] extends [""] ? "" : Keywords extends { [K in Label]: infer O; } ? FixWord<Bucket<O, Lowercase<W>>, W> extends (infer K extends string) ? ([K] extends [never] ? "" : ` ("${W}" is ${K} in CSS; write "${K}")`) : "" : "") : "";
296
+ type FixWord<K, W extends string> = K extends string ? (Lowercase<K> extends Lowercase<W> ? (K extends W ? never : K) : never) : never;
297
+ export type PropertyFn<P extends keyof Props> = <const S extends string>(value: Valid<P, S>) => string;
298
+ //#endregion
package/dist/css.mjs ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ //#region src/errors.d.ts
2
+ declare const ParseError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
3
+ readonly _tag: "ParseError";
4
+ } & Readonly<A>;
5
+ /** A value grammar (mdn-data syntax) is malformed: `position` is the offset in `grammar`, `expected` what fits there. */
6
+ export declare class ParseError extends ParseError_base<{
7
+ readonly message: string;
8
+ readonly grammar: string;
9
+ readonly position: number;
10
+ readonly expected: readonly string[];
11
+ }> {}
12
+ declare const UnknownPropertyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
13
+ readonly _tag: "UnknownPropertyError";
14
+ } & Readonly<A>;
15
+ /** `property` has no grammar in mdn-data. */
16
+ export declare class UnknownPropertyError extends UnknownPropertyError_base<{
17
+ readonly message: string;
18
+ readonly property: string;
19
+ }> {}
20
+ declare const InvalidValueError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
21
+ readonly _tag: "InvalidValueError";
22
+ } & Readonly<A>;
23
+ /** The value does not match the property's grammar: `position` is the offset in `value` where it went wrong. */
24
+ export declare class InvalidValueError extends InvalidValueError_base<{
25
+ readonly message: string;
26
+ readonly property: string;
27
+ readonly value: string;
28
+ readonly position: number;
29
+ readonly expected: readonly string[];
30
+ }> {}
31
+ declare const RuleError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
32
+ readonly _tag: "RuleError";
33
+ } & Readonly<A>;
34
+ /** The value is valid by grammar but breaks a rule that the spec states in prose (rules.ts). */
35
+ export declare class RuleError extends RuleError_base<{
36
+ readonly message: string;
37
+ readonly property: string;
38
+ readonly value: string;
39
+ readonly reason: string;
40
+ }> {}
41
+ declare const BrowsersError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
42
+ readonly _tag: "BrowsersError";
43
+ } & Readonly<A>;
44
+ /** browserslist rejected the query. */
45
+ export declare class BrowsersError extends BrowsersError_base<{
46
+ readonly message: string;
47
+ /** undefined: the config found from the working directory */
48
+ readonly query: string | undefined;
49
+ }> {}
50
+ export type TwinError = ParseError | UnknownPropertyError | InvalidValueError;
51
+ export declare const isTwinError: (e: unknown) => e is TwinError;
52
+ //#endregion
@@ -0,0 +1,15 @@
1
+ import { Data } from "effect";
2
+ //#region src/errors.ts
3
+ /** A value grammar (mdn-data syntax) is malformed: `position` is the offset in `grammar`, `expected` what fits there. */
4
+ var ParseError = class extends Data.TaggedError("ParseError") {};
5
+ /** `property` has no grammar in mdn-data. */
6
+ var UnknownPropertyError = class extends Data.TaggedError("UnknownPropertyError") {};
7
+ /** The value does not match the property's grammar: `position` is the offset in `value` where it went wrong. */
8
+ var InvalidValueError = class extends Data.TaggedError("InvalidValueError") {};
9
+ /** The value is valid by grammar but breaks a rule that the spec states in prose (rules.ts). */
10
+ var RuleError = class extends Data.TaggedError("RuleError") {};
11
+ /** browserslist rejected the query. */
12
+ var BrowsersError = class extends Data.TaggedError("BrowsersError") {};
13
+ const isTwinError = (e) => e instanceof ParseError || e instanceof UnknownPropertyError || e instanceof InvalidValueError;
14
+ //#endregion
15
+ export { BrowsersError, InvalidValueError, ParseError, RuleError, UnknownPropertyError, isTwinError };