@master/css-tooling 0.0.0-site.1793659883.g69c9aebcf628
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 +58 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +1 -0
- package/dist/css-tree-version.d.ts +2 -0
- package/dist/css-tree-version.js +4 -0
- package/dist/css.d.ts +32 -0
- package/dist/css.js +120 -0
- package/dist/immutable.d.ts +2 -0
- package/dist/immutable.js +7 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/language/binding-session.d.ts +6 -0
- package/dist/language/binding-session.js +8 -0
- package/dist/language/browser.d.ts +10 -0
- package/dist/language/browser.js +12 -0
- package/dist/language/common.d.ts +12 -0
- package/dist/language/common.js +55 -0
- package/dist/language/contracts.d.ts +197 -0
- package/dist/language/contracts.js +1 -0
- package/dist/language/index.d.ts +29 -0
- package/dist/language/index.js +39 -0
- package/dist/language/master-css.d.ts +13 -0
- package/dist/language/master-css.js +35 -0
- package/dist/language/node.d.ts +21 -0
- package/dist/language/node.js +36 -0
- package/dist/language/semantic/scopes.d.ts +55 -0
- package/dist/language/semantic/scopes.js +73 -0
- package/dist/language/semantic/types.d.ts +11 -0
- package/dist/language/semantic/types.js +1 -0
- package/dist/language/session.d.ts +37 -0
- package/dist/language/session.js +87 -0
- package/dist/language/settings.d.ts +13 -0
- package/dist/language/settings.js +19 -0
- package/dist/language/utils/mdn-css-data.d.ts +5 -0
- package/dist/language/utils/mdn-css-data.js +63 -0
- package/dist/lexer/browser.d.ts +6 -0
- package/dist/lexer/browser.js +11 -0
- package/dist/lexer/contracts.d.ts +41 -0
- package/dist/lexer/contracts.js +1 -0
- package/dist/lexer/index.d.ts +8 -0
- package/dist/lexer/index.js +11 -0
- package/dist/lexer/node.d.ts +7 -0
- package/dist/lexer/node.js +11 -0
- package/dist/lexer/session.d.ts +17 -0
- package/dist/lexer/session.js +25 -0
- package/dist/lint/analysis.d.ts +90 -0
- package/dist/lint/analysis.js +1 -0
- package/dist/lint/binding-session.d.ts +21 -0
- package/dist/lint/binding-session.js +97 -0
- package/dist/lint/constants.d.ts +7 -0
- package/dist/lint/constants.js +18 -0
- package/dist/lint/contracts.d.ts +17 -0
- package/dist/lint/contracts.js +6 -0
- package/dist/lint/diagnostic-format.d.ts +5 -0
- package/dist/lint/diagnostic-format.js +15 -0
- package/dist/lint/diagnostics.d.ts +42 -0
- package/dist/lint/diagnostics.js +1 -0
- package/dist/lint/index.d.ts +21 -0
- package/dist/lint/index.js +30 -0
- package/dist/lint/node.d.ts +6 -0
- package/dist/lint/node.js +11 -0
- package/dist/lint/rule-signatures.d.ts +23 -0
- package/dist/lint/rule-signatures.js +27 -0
- package/dist/lint/source.d.ts +70 -0
- package/dist/lint/source.js +261 -0
- package/dist/math-types.d.ts +11 -0
- package/dist/math-types.js +236 -0
- package/dist/math-validation.d.ts +7 -0
- package/dist/math-validation.js +74 -0
- package/dist/node.d.ts +12 -0
- package/dist/node.js +32 -0
- package/dist/scanner/binding-session.d.ts +29 -0
- package/dist/scanner/binding-session.js +37 -0
- package/dist/scanner/core.d.ts +130 -0
- package/dist/scanner/core.js +480 -0
- package/dist/scanner/index.d.ts +3 -0
- package/dist/scanner/index.js +3 -0
- package/dist/scanner/node.d.ts +5 -0
- package/dist/scanner/node.js +4 -0
- package/dist/scanner/options/index.d.ts +16 -0
- package/dist/scanner/options/index.js +57 -0
- package/dist/scanner/source-policy.d.ts +15 -0
- package/dist/scanner/source-policy.js +131 -0
- package/dist/source/adapters/optional-peer.d.ts +5 -0
- package/dist/source/adapters/optional-peer.js +29 -0
- package/dist/source/adapters/oxc.d.ts +2 -0
- package/dist/source/adapters/oxc.js +6 -0
- package/dist/source/adapters/svelte.d.ts +5 -0
- package/dist/source/adapters/svelte.js +82 -0
- package/dist/source/adapters/types.d.ts +11 -0
- package/dist/source/adapters/types.js +9 -0
- package/dist/source/adapters/vue.d.ts +5 -0
- package/dist/source/adapters/vue.js +50 -0
- package/dist/source/browser.d.ts +7 -0
- package/dist/source/browser.js +11 -0
- package/dist/source/contracts.d.ts +35 -0
- package/dist/source/contracts.js +1 -0
- package/dist/source/index.d.ts +8 -0
- package/dist/source/index.js +11 -0
- package/dist/source/native.d.ts +5 -0
- package/dist/source/native.js +53 -0
- package/dist/source/node.d.ts +7 -0
- package/dist/source/node.js +11 -0
- package/dist/source/session.d.ts +25 -0
- package/dist/source/session.js +37 -0
- package/dist/syntax-validation.d.ts +10 -0
- package/dist/syntax-validation.js +54 -0
- package/dist/tooling-session.d.ts +66 -0
- package/dist/tooling-session.js +188 -0
- package/dist/validator/binding-session.d.ts +17 -0
- package/dist/validator/binding-session.js +29 -0
- package/dist/validator/contracts.d.ts +24 -0
- package/dist/validator/contracts.js +1 -0
- package/dist/validator/index.d.ts +10 -0
- package/dist/validator/index.js +13 -0
- package/dist/validator/node.d.ts +6 -0
- package/dist/validator/node.js +11 -0
- package/dist/validator/types/syntax-error.d.ts +22 -0
- package/dist/validator/types/syntax-error.js +1 -0
- package/dist/value-validation.d.ts +46 -0
- package/dist/value-validation.js +162 -0
- package/package.json +127 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MasterCSSSyntaxStatus } from "@master/css-binding/tooling";
|
|
2
|
+
declare const CSS_SYNTAX_CHECK: Readonly<{
|
|
3
|
+
name: "@eslint/css-tree";
|
|
4
|
+
version: string;
|
|
5
|
+
phase: 'css-syntax';
|
|
6
|
+
scope: 'selectors-queries-declarations';
|
|
7
|
+
}>;
|
|
8
|
+
/** Token structure is independent of property grammars and browser support. */
|
|
9
|
+
declare function cssSyntaxStatus(text: string): MasterCSSSyntaxStatus;
|
|
10
|
+
export { CSS_SYNTAX_CHECK, cssSyntaxStatus };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { cssTreeVersion } from "./css-tree-version.js";
|
|
2
|
+
import { parse, tokenTypes, tokenize } from "@eslint/css-tree";
|
|
3
|
+
// src/syntax-validation.ts
|
|
4
|
+
const CSS_SYNTAX_CHECK = Object.freeze({
|
|
5
|
+
name: "@eslint/css-tree",
|
|
6
|
+
version: cssTreeVersion,
|
|
7
|
+
phase: "css-syntax",
|
|
8
|
+
scope: "selectors-queries-declarations"
|
|
9
|
+
});
|
|
10
|
+
/** Token structure is independent of property grammars and browser support. */
|
|
11
|
+
function cssSyntaxStatus(text) {
|
|
12
|
+
const stack = [];
|
|
13
|
+
let invalid = false;
|
|
14
|
+
tokenize(text, (type, start, end) => {
|
|
15
|
+
switch (type) {
|
|
16
|
+
case tokenTypes.Function:
|
|
17
|
+
case tokenTypes.LeftParenthesis:
|
|
18
|
+
stack.push(tokenTypes.RightParenthesis);
|
|
19
|
+
break;
|
|
20
|
+
case tokenTypes.LeftSquareBracket:
|
|
21
|
+
stack.push(tokenTypes.RightSquareBracket);
|
|
22
|
+
break;
|
|
23
|
+
case tokenTypes.LeftCurlyBracket:
|
|
24
|
+
stack.push(tokenTypes.RightCurlyBracket);
|
|
25
|
+
break;
|
|
26
|
+
case tokenTypes.RightParenthesis:
|
|
27
|
+
case tokenTypes.RightSquareBracket:
|
|
28
|
+
case tokenTypes.RightCurlyBracket:
|
|
29
|
+
invalid ||= stack.pop() !== type;
|
|
30
|
+
break;
|
|
31
|
+
case tokenTypes.BadString:
|
|
32
|
+
case tokenTypes.BadUrl:
|
|
33
|
+
invalid = true;
|
|
34
|
+
break;
|
|
35
|
+
case tokenTypes.Comment:
|
|
36
|
+
invalid ||= text.slice(end - 2, end) !== "*/";
|
|
37
|
+
break;
|
|
38
|
+
case tokenTypes.String: invalid ||= text[end - 1] !== text[start] || end - start < 2;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (invalid || stack.length) return "invalid";
|
|
42
|
+
try {
|
|
43
|
+
let unknown = false;
|
|
44
|
+
return parse(text, {
|
|
45
|
+
parseCustomProperty: false,
|
|
46
|
+
onParseError: () => {
|
|
47
|
+
unknown = true;
|
|
48
|
+
}
|
|
49
|
+
}) && !unknown ? "valid" : "unknown";
|
|
50
|
+
} catch {
|
|
51
|
+
return "unknown";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export { CSS_SYNTAX_CHECK, cssSyntaxStatus };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { LexerSession } from "./lexer/session.js";
|
|
2
|
+
import { MasterCSSClassListAnalysis, MasterCSSClassListAnalysisRequest } from "./lexer/contracts.js";
|
|
3
|
+
import { MasterCSSDocumentAnalysis, MasterCSSDocumentAnalysisRequest, MasterCSSFormatDirectivesRequest, MasterCSSFormatDirectivesResult, MasterCSSLanguageClassifications, MasterCSSLanguageColorCandidate, MasterCSSLanguageColorPresentation, MasterCSSLanguageColorTokens, MasterCSSLanguageCompletionIndex, MasterCSSLanguageInspection as MasterCSSLanguageInspection$1, MasterCSSLanguageTokenFamilies, MasterCSSNativeDeclarationCompletion, MasterCSSNativeDeclarationCompletionRequest } from "./language/contracts.js";
|
|
4
|
+
import { LanguageSession } from "./language/session.js";
|
|
5
|
+
import { CanonicalClassNameOptions } from "./lint/contracts.js";
|
|
6
|
+
import { MasterCSSLintAnalysis, MasterCSSLintCanonicalClassGroupSuggestion, MasterCSSLintCanonicalClassSuggestion, MasterCSSLintClassListAnalysis, MasterCSSLintClassListOptions, MasterCSSLintDocumentAnalysis, MasterCSSLintRawValueCandidate, MasterCSSLintToken } from "./lint/analysis.js";
|
|
7
|
+
import { LintSession } from "./lint/binding-session.js";
|
|
8
|
+
import { SourceExtractor } from "./source/session.js";
|
|
9
|
+
import { MasterCSSDecodedHTMLAttribute, MasterCSSSourceExtraction, MasterCSSSourceExtractionRequest } from "./source/contracts.js";
|
|
10
|
+
import { MasterCSSClassValidationResult } from "./validator/contracts.js";
|
|
11
|
+
import { ValidatorSession } from "./validator/binding-session.js";
|
|
12
|
+
import { MasterCSSClassSuggestions, MasterCSSDesignSystemReport, MasterCSSDesignSystemRequest } from "@master/css-binding/tooling";
|
|
13
|
+
import { MasterCSSBinding } from "@master/css-binding";
|
|
14
|
+
import { MasterCSSManifest } from "@master/css-schema/manifest";
|
|
15
|
+
interface ToolingSessionParts {
|
|
16
|
+
readonly lexer: LexerSession;
|
|
17
|
+
readonly source: SourceExtractor;
|
|
18
|
+
readonly validator: ValidatorSession;
|
|
19
|
+
readonly lint: LintSession;
|
|
20
|
+
readonly language: LanguageSession;
|
|
21
|
+
}
|
|
22
|
+
interface MasterCSSToolingSessionOptions {
|
|
23
|
+
readonly manifest: MasterCSSManifest;
|
|
24
|
+
/** Classes the project defines in native CSS; they report no diagnostics while they generate no rules. */
|
|
25
|
+
readonly nativeClassNames?: readonly string[];
|
|
26
|
+
readonly binding?: MasterCSSBinding;
|
|
27
|
+
}
|
|
28
|
+
declare class MasterCSSToolingSession implements Disposable {
|
|
29
|
+
private readonly parts;
|
|
30
|
+
private disposed;
|
|
31
|
+
private constructor();
|
|
32
|
+
get binding(): 'native' | 'wasm';
|
|
33
|
+
/** Advisory declaration conversion; does not prove surrounding cascade or browser behavior. */
|
|
34
|
+
suggestClasses(declarations: string): MasterCSSClassSuggestions;
|
|
35
|
+
analyzeClassList(request: MasterCSSClassListAnalysisRequest): MasterCSSClassListAnalysis;
|
|
36
|
+
extractSource(request: MasterCSSSourceExtractionRequest): MasterCSSSourceExtraction;
|
|
37
|
+
/** Decode HTML attribute contents without delimiters, preserving UTF-16 spans. */
|
|
38
|
+
decodeHTMLAttribute(source: string): MasterCSSDecodedHTMLAttribute;
|
|
39
|
+
extractClassCandidates(content: string): readonly string[];
|
|
40
|
+
validateClassNames(classNames: readonly string[]): MasterCSSClassValidationResult;
|
|
41
|
+
lintClassNames(classNames: readonly string[]): MasterCSSLintAnalysis;
|
|
42
|
+
/** Inspect authored CSS and tool-only definition information without generating CSS. */
|
|
43
|
+
inspectDesignSystem(request: MasterCSSDesignSystemRequest): MasterCSSDesignSystemReport;
|
|
44
|
+
tokenizeClassList(classList: string, unescape?: string | false): readonly MasterCSSLintToken[];
|
|
45
|
+
analyzeLintDocument(source: string, languageId: string): MasterCSSLintDocumentAnalysis;
|
|
46
|
+
analyzeLintClassList(classList: string, classNames: readonly string[], options?: MasterCSSLintClassListOptions): MasterCSSLintClassListAnalysis;
|
|
47
|
+
canonicalClassNames(classNames: readonly string[], options?: CanonicalClassNameOptions): readonly MasterCSSLintCanonicalClassSuggestion[];
|
|
48
|
+
canonicalClassGroups(classNames: readonly string[], options?: CanonicalClassNameOptions): readonly MasterCSSLintCanonicalClassGroupSuggestion[];
|
|
49
|
+
rawValueCandidates(classNames: readonly string[]): readonly MasterCSSLintRawValueCandidate[];
|
|
50
|
+
analyzeDocument(request: MasterCSSDocumentAnalysisRequest): MasterCSSDocumentAnalysis;
|
|
51
|
+
formatDirectives(request: MasterCSSFormatDirectivesRequest): MasterCSSFormatDirectivesResult;
|
|
52
|
+
nativeDeclarationCompletion(request: MasterCSSNativeDeclarationCompletionRequest): MasterCSSNativeDeclarationCompletion | undefined;
|
|
53
|
+
classifyClassNames(classNames: readonly string[]): MasterCSSLanguageClassifications;
|
|
54
|
+
inspectClassName(className: string): MasterCSSLanguageInspection$1;
|
|
55
|
+
tokenFamilies(): MasterCSSLanguageTokenFamilies;
|
|
56
|
+
completionIndex(): MasterCSSLanguageCompletionIndex;
|
|
57
|
+
colorPresentation(colorToken: string): MasterCSSLanguageColorPresentation;
|
|
58
|
+
colorTokens(candidates: readonly MasterCSSLanguageColorCandidate[]): MasterCSSLanguageColorTokens;
|
|
59
|
+
dispose(): void;
|
|
60
|
+
[Symbol.dispose](): void;
|
|
61
|
+
private assertActive;
|
|
62
|
+
}
|
|
63
|
+
declare function createToolingSession(options: MasterCSSToolingSessionOptions): Promise<MasterCSSToolingSession>;
|
|
64
|
+
/** @internal */
|
|
65
|
+
declare function bindToolingSessionInternal(parts: ToolingSessionParts): MasterCSSToolingSession;
|
|
66
|
+
export { MasterCSSToolingSession, MasterCSSToolingSessionOptions, ToolingSessionParts, bindToolingSessionInternal, createToolingSession };
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { bindLexerSession } from "./lexer/session.js";
|
|
2
|
+
import { freezeToolingResult } from "./immutable.js";
|
|
3
|
+
import { bindLanguageSession } from "./language/session.js";
|
|
4
|
+
import { bindLintSession } from "./lint/binding-session.js";
|
|
5
|
+
import { bindSourceExtractor } from "./source/session.js";
|
|
6
|
+
import { bindValidatorSession } from "./validator/binding-session.js";
|
|
7
|
+
import { createToolingBinding } from "@master/css-binding/tooling";
|
|
8
|
+
// src/tooling-session.ts
|
|
9
|
+
let bindToolingSession;
|
|
10
|
+
var MasterCSSToolingSession = class MasterCSSToolingSession {
|
|
11
|
+
parts;
|
|
12
|
+
disposed = false;
|
|
13
|
+
constructor(parts) {
|
|
14
|
+
this.parts = parts;
|
|
15
|
+
}
|
|
16
|
+
get binding() {
|
|
17
|
+
this.assertActive();
|
|
18
|
+
return this.parts.language.binding;
|
|
19
|
+
}
|
|
20
|
+
/** Advisory declaration conversion; does not prove surrounding cascade or browser behavior. */
|
|
21
|
+
suggestClasses(declarations) {
|
|
22
|
+
this.assertActive();
|
|
23
|
+
const result = this.parts.lint.suggestClasses(declarations);
|
|
24
|
+
if (result.version !== 1) throw new Error(`Unsupported class suggestions version: ${String(result.version)}`);
|
|
25
|
+
return freezeToolingResult(result);
|
|
26
|
+
}
|
|
27
|
+
analyzeClassList(request) {
|
|
28
|
+
this.assertActive();
|
|
29
|
+
return freezeToolingResult(this.parts.lexer.analyze({
|
|
30
|
+
classLists: request.classLists?.map((input) => ({
|
|
31
|
+
source: input.source,
|
|
32
|
+
...input.unescape ? { unescape: [...input.unescape] } : {}
|
|
33
|
+
})),
|
|
34
|
+
cssSources: request.cssSources ? [...request.cssSources] : void 0,
|
|
35
|
+
escapeIdentifiers: request.escapeIdentifiers ? [...request.escapeIdentifiers] : void 0
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
extractSource(request) {
|
|
39
|
+
this.assertActive();
|
|
40
|
+
return freezeToolingResult(this.parts.source.extract({ files: request.files.map((file) => ({ ...file })) }));
|
|
41
|
+
}
|
|
42
|
+
/** Decode HTML attribute contents without delimiters, preserving UTF-16 spans. */
|
|
43
|
+
decodeHTMLAttribute(source) {
|
|
44
|
+
this.assertActive();
|
|
45
|
+
const result = this.parts.source.extract({
|
|
46
|
+
files: [],
|
|
47
|
+
htmlAttributes: [source]
|
|
48
|
+
}).htmlAttributes?.[0];
|
|
49
|
+
if (!result) throw new Error("The loaded Master CSS source binding does not support HTML attribute mapping. Rebuild or update the binding.");
|
|
50
|
+
return freezeToolingResult(result);
|
|
51
|
+
}
|
|
52
|
+
extractClassCandidates(content) {
|
|
53
|
+
this.assertActive();
|
|
54
|
+
return Object.freeze([...this.parts.source.extractClassCandidates(content)]);
|
|
55
|
+
}
|
|
56
|
+
validateClassNames(classNames) {
|
|
57
|
+
this.assertActive();
|
|
58
|
+
return freezeToolingResult(this.parts.validator.generate(classNames));
|
|
59
|
+
}
|
|
60
|
+
lintClassNames(classNames) {
|
|
61
|
+
this.assertActive();
|
|
62
|
+
return freezeToolingResult(this.parts.lint.analyze([...classNames]));
|
|
63
|
+
}
|
|
64
|
+
/** Inspect authored CSS and tool-only definition information without generating CSS. */
|
|
65
|
+
inspectDesignSystem(request) {
|
|
66
|
+
this.assertActive();
|
|
67
|
+
return freezeToolingResult(this.parts.lint.inspectDesignSystem(request));
|
|
68
|
+
}
|
|
69
|
+
tokenizeClassList(classList, unescape) {
|
|
70
|
+
this.assertActive();
|
|
71
|
+
return freezeToolingResult(this.parts.lint.tokenizeClassList(classList, unescape));
|
|
72
|
+
}
|
|
73
|
+
analyzeLintDocument(source, languageId) {
|
|
74
|
+
this.assertActive();
|
|
75
|
+
return freezeToolingResult(this.parts.lint.analyzeDocument(source, languageId));
|
|
76
|
+
}
|
|
77
|
+
analyzeLintClassList(classList, classNames, options) {
|
|
78
|
+
this.assertActive();
|
|
79
|
+
return freezeToolingResult(this.parts.lint.analyzeClassList(classList, [...classNames], options));
|
|
80
|
+
}
|
|
81
|
+
canonicalClassNames(classNames, options) {
|
|
82
|
+
this.assertActive();
|
|
83
|
+
return freezeToolingResult(this.parts.lint.canonicalClassNames([...classNames], options));
|
|
84
|
+
}
|
|
85
|
+
canonicalClassGroups(classNames, options) {
|
|
86
|
+
this.assertActive();
|
|
87
|
+
return freezeToolingResult(this.parts.lint.canonicalClassGroups([...classNames], options));
|
|
88
|
+
}
|
|
89
|
+
rawValueCandidates(classNames) {
|
|
90
|
+
this.assertActive();
|
|
91
|
+
return freezeToolingResult(this.parts.lint.rawValueCandidates([...classNames]));
|
|
92
|
+
}
|
|
93
|
+
analyzeDocument(request) {
|
|
94
|
+
this.assertActive();
|
|
95
|
+
return freezeToolingResult(this.parts.language.analyzeDocument(request));
|
|
96
|
+
}
|
|
97
|
+
formatDirectives(request) {
|
|
98
|
+
this.assertActive();
|
|
99
|
+
return freezeToolingResult(this.parts.language.formatDirectives(request));
|
|
100
|
+
}
|
|
101
|
+
nativeDeclarationCompletion(request) {
|
|
102
|
+
this.assertActive();
|
|
103
|
+
const completion = this.parts.language.nativeDeclarationCompletion(request);
|
|
104
|
+
return completion && freezeToolingResult(completion);
|
|
105
|
+
}
|
|
106
|
+
classifyClassNames(classNames) {
|
|
107
|
+
this.assertActive();
|
|
108
|
+
return freezeToolingResult(this.parts.language.classifyClassNames(classNames));
|
|
109
|
+
}
|
|
110
|
+
inspectClassName(className) {
|
|
111
|
+
this.assertActive();
|
|
112
|
+
return freezeToolingResult(this.parts.language.inspectClassName(className));
|
|
113
|
+
}
|
|
114
|
+
tokenFamilies() {
|
|
115
|
+
this.assertActive();
|
|
116
|
+
return freezeToolingResult(this.parts.language.tokenFamilies());
|
|
117
|
+
}
|
|
118
|
+
completionIndex() {
|
|
119
|
+
this.assertActive();
|
|
120
|
+
return freezeToolingResult(this.parts.language.completionIndex());
|
|
121
|
+
}
|
|
122
|
+
colorPresentation(colorToken) {
|
|
123
|
+
this.assertActive();
|
|
124
|
+
return freezeToolingResult(this.parts.language.colorPresentation(colorToken));
|
|
125
|
+
}
|
|
126
|
+
colorTokens(candidates) {
|
|
127
|
+
this.assertActive();
|
|
128
|
+
return freezeToolingResult(this.parts.language.colorTokens(candidates));
|
|
129
|
+
}
|
|
130
|
+
dispose() {
|
|
131
|
+
if (this.disposed) return;
|
|
132
|
+
this.disposed = true;
|
|
133
|
+
const sessions = /* @__PURE__ */ new Set([
|
|
134
|
+
this.parts.lexer,
|
|
135
|
+
this.parts.source,
|
|
136
|
+
this.parts.validator,
|
|
137
|
+
this.parts.lint,
|
|
138
|
+
this.parts.language
|
|
139
|
+
]);
|
|
140
|
+
for (const session of sessions) session.dispose();
|
|
141
|
+
}
|
|
142
|
+
[Symbol.dispose]() {
|
|
143
|
+
this.dispose();
|
|
144
|
+
}
|
|
145
|
+
assertActive() {
|
|
146
|
+
if (this.disposed) throw new TypeError("The Master CSS tooling session has been disposed.");
|
|
147
|
+
}
|
|
148
|
+
static {
|
|
149
|
+
bindToolingSession = (parts) => new MasterCSSToolingSession(parts);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
async function createToolingSession(options) {
|
|
153
|
+
const binding = await createToolingBinding({ binding: options.binding });
|
|
154
|
+
const created = [];
|
|
155
|
+
try {
|
|
156
|
+
const lexerBinding = await binding.createLexerSession();
|
|
157
|
+
created.push(lexerBinding);
|
|
158
|
+
const sourceBinding = await binding.createSourceSession();
|
|
159
|
+
created.push(sourceBinding);
|
|
160
|
+
const validatorBinding = await binding.createValidatorSession(options.manifest);
|
|
161
|
+
created.push(validatorBinding);
|
|
162
|
+
const languageBinding = await binding.createLanguageSession(options.manifest);
|
|
163
|
+
created.push(languageBinding);
|
|
164
|
+
const lintBinding = await binding.createLintSession(options.manifest);
|
|
165
|
+
created.push(lintBinding);
|
|
166
|
+
const lintValidatorBinding = await binding.createValidatorSession(options.manifest);
|
|
167
|
+
created.push(lintValidatorBinding);
|
|
168
|
+
const lintLanguageBinding = await binding.createLanguageSession(options.manifest);
|
|
169
|
+
created.push(lintLanguageBinding);
|
|
170
|
+
const session = bindToolingSession({
|
|
171
|
+
lexer: bindLexerSession(binding.binding, lexerBinding),
|
|
172
|
+
source: bindSourceExtractor(binding.binding, sourceBinding),
|
|
173
|
+
validator: bindValidatorSession(binding.binding, validatorBinding, options.nativeClassNames),
|
|
174
|
+
lint: bindLintSession(lintBinding, lintValidatorBinding, lintLanguageBinding),
|
|
175
|
+
language: bindLanguageSession(binding.binding, languageBinding, options.nativeClassNames)
|
|
176
|
+
});
|
|
177
|
+
created.length = 0;
|
|
178
|
+
return session;
|
|
179
|
+
} catch (cause) {
|
|
180
|
+
for (const session of new Set(created)) session.dispose();
|
|
181
|
+
throw cause;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** @internal */
|
|
185
|
+
function bindToolingSessionInternal(parts) {
|
|
186
|
+
return bindToolingSession(parts);
|
|
187
|
+
}
|
|
188
|
+
export { MasterCSSToolingSession, bindToolingSessionInternal, createToolingSession };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MasterCSSClassValidationResult } from "./contracts.js";
|
|
2
|
+
import { MasterCSSManifest } from "@master/css-schema/manifest";
|
|
3
|
+
interface BindingValidatorSession {
|
|
4
|
+
nativeDeclarationCandidates(classNames: string[]): unknown;
|
|
5
|
+
generateClassRules(classNames: string[], nativeSupport?: boolean[]): unknown;
|
|
6
|
+
dispose(): void;
|
|
7
|
+
}
|
|
8
|
+
interface ValidatorSession {
|
|
9
|
+
readonly binding: 'native' | 'wasm';
|
|
10
|
+
generate(classNames: readonly string[]): MasterCSSClassValidationResult;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
}
|
|
13
|
+
declare function bindValidatorSession(binding: ValidatorSession['binding'], session: BindingValidatorSession, nativeClassNames?: readonly string[]): ValidatorSession;
|
|
14
|
+
declare function createValidator(manifest: MasterCSSManifest, options?: {
|
|
15
|
+
readonly binding?: 'auto' | 'native' | 'wasm';
|
|
16
|
+
}): Promise<ValidatorSession>;
|
|
17
|
+
export { ValidatorSession, bindValidatorSession, createValidator };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { withCSSValueValidation } from "../value-validation.js";
|
|
2
|
+
import { createToolingBinding } from "@master/css-binding/tooling";
|
|
3
|
+
// src/validator/binding-session.ts
|
|
4
|
+
function parse(value) {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
function bindValidatorSession(binding, session, nativeClassNames = []) {
|
|
8
|
+
const nativeClasses = new Set(nativeClassNames);
|
|
9
|
+
return {
|
|
10
|
+
binding,
|
|
11
|
+
generate(classNames) {
|
|
12
|
+
const values = [...classNames];
|
|
13
|
+
const result = parse(session.generateClassRules(values));
|
|
14
|
+
return {
|
|
15
|
+
...result,
|
|
16
|
+
classes: result.classes.map((result) => withCSSValueValidation({
|
|
17
|
+
...result,
|
|
18
|
+
diagnostics: nativeClasses.has(result.className) && !result.rules.length ? [] : result.diagnostics ?? []
|
|
19
|
+
}))
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
dispose: () => session.dispose()
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async function createValidator(manifest, options = {}) {
|
|
26
|
+
const tooling = await createToolingBinding({ binding: options.binding });
|
|
27
|
+
return bindValidatorSession(tooling.binding, await tooling.createValidatorSession(manifest));
|
|
28
|
+
}
|
|
29
|
+
export { bindValidatorSession, createValidator };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DeclarationValidation } from "../value-validation.js";
|
|
2
|
+
import { MasterCSSValidatorBatch } from "@master/css-binding/tooling";
|
|
3
|
+
import { MasterCSSHydrationRule } from "@master/css-schema/hydration-manifest";
|
|
4
|
+
interface MasterCSSClassValidation {
|
|
5
|
+
readonly className: string;
|
|
6
|
+
readonly matchStatus: MasterCSSValidatorBatch['classes'][number]['matchStatus'];
|
|
7
|
+
readonly declarations: readonly DeclarationValidation[];
|
|
8
|
+
readonly checks: readonly {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
readonly scope: string;
|
|
12
|
+
readonly phase: import('@master/css-binding/tooling').MasterCSSDiagnostic['phase'];
|
|
13
|
+
}[];
|
|
14
|
+
readonly cssSyntaxStatus: MasterCSSValidatorBatch['classes'][number]['cssSyntaxStatus'];
|
|
15
|
+
readonly cssValueStatus: MasterCSSValidatorBatch['classes'][number]['cssValueStatus'];
|
|
16
|
+
readonly browserSupport: MasterCSSValidatorBatch['classes'][number]['browserSupport'];
|
|
17
|
+
readonly rules: readonly MasterCSSHydrationRule[];
|
|
18
|
+
readonly diagnostics?: readonly import('@master/css-binding/tooling').MasterCSSDiagnostic[];
|
|
19
|
+
}
|
|
20
|
+
interface MasterCSSClassValidationResult {
|
|
21
|
+
readonly version: 4;
|
|
22
|
+
readonly classes: readonly MasterCSSClassValidation[];
|
|
23
|
+
}
|
|
24
|
+
export { MasterCSSClassValidation, MasterCSSClassValidationResult };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CSS_VALUE_CHECK, DeclarationValidation, cssValueStatus, validateRuleDeclarations } from "../value-validation.js";
|
|
2
|
+
import { CSS_SYNTAX_CHECK, cssSyntaxStatus } from "../syntax-validation.js";
|
|
3
|
+
import { MasterCSSClassValidation, MasterCSSClassValidationResult } from "./contracts.js";
|
|
4
|
+
import { MasterCSSBinding } from "@master/css-binding";
|
|
5
|
+
import { MasterCSSManifest } from "@master/css-schema/manifest";
|
|
6
|
+
declare function validateClassNames(classNames: readonly string[], options: {
|
|
7
|
+
readonly manifest: MasterCSSManifest;
|
|
8
|
+
readonly binding?: MasterCSSBinding;
|
|
9
|
+
}): Promise<MasterCSSClassValidationResult>;
|
|
10
|
+
export { CSS_SYNTAX_CHECK, CSS_VALUE_CHECK, type DeclarationValidation, type MasterCSSClassValidation, type MasterCSSClassValidationResult, cssSyntaxStatus, cssValueStatus, validateClassNames, validateRuleDeclarations };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CSS_SYNTAX_CHECK, cssSyntaxStatus } from "../syntax-validation.js";
|
|
2
|
+
import { CSS_VALUE_CHECK, cssValueStatus, validateRuleDeclarations } from "../value-validation.js";
|
|
3
|
+
import { createToolingSession } from "../tooling-session.js";
|
|
4
|
+
// src/validator/index.ts
|
|
5
|
+
async function validateClassNames(classNames, options) {
|
|
6
|
+
const session = await createToolingSession(options);
|
|
7
|
+
try {
|
|
8
|
+
return session.validateClassNames(classNames);
|
|
9
|
+
} finally {
|
|
10
|
+
session.dispose();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export { CSS_SYNTAX_CHECK, CSS_VALUE_CHECK, cssSyntaxStatus, cssValueStatus, validateClassNames, validateRuleDeclarations };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MasterCSSClassValidationResult } from "./contracts.js";
|
|
2
|
+
import { MasterCSSManifest } from "@master/css-schema/manifest";
|
|
3
|
+
declare function validateClassNamesSync(classNames: readonly string[], options: {
|
|
4
|
+
readonly manifest: MasterCSSManifest;
|
|
5
|
+
}): MasterCSSClassValidationResult;
|
|
6
|
+
export { validateClassNamesSync };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createToolingSessionSync } from "../node.js";
|
|
2
|
+
// src/validator/node.ts
|
|
3
|
+
function validateClassNamesSync(classNames, options) {
|
|
4
|
+
const session = createToolingSessionSync(options);
|
|
5
|
+
try {
|
|
6
|
+
return session.validateClassNames(classNames);
|
|
7
|
+
} finally {
|
|
8
|
+
session.dispose();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export { validateClassNamesSync };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface SyntaxError {
|
|
2
|
+
class?: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
message?: string;
|
|
5
|
+
stack?: string;
|
|
6
|
+
rawMessage?: string;
|
|
7
|
+
syntax?: string;
|
|
8
|
+
css?: string;
|
|
9
|
+
mismatchOffset?: number;
|
|
10
|
+
mismatchLength?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
line?: number;
|
|
13
|
+
column?: number;
|
|
14
|
+
loc?: {
|
|
15
|
+
source?: string;
|
|
16
|
+
start: any;
|
|
17
|
+
end: any;
|
|
18
|
+
};
|
|
19
|
+
property?: string;
|
|
20
|
+
details?: string;
|
|
21
|
+
}
|
|
22
|
+
export { SyntaxError };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MasterCSSDiagnostic, MasterCSSValueStatus } from "@master/css-binding/tooling";
|
|
2
|
+
interface DeclarationValidation {
|
|
3
|
+
readonly property: string;
|
|
4
|
+
readonly value: string;
|
|
5
|
+
readonly atRule?: string;
|
|
6
|
+
readonly status: MasterCSSValueStatus;
|
|
7
|
+
readonly range?: {
|
|
8
|
+
readonly start: number;
|
|
9
|
+
readonly end: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
declare const CSS_VALUE_CHECK: Readonly<{
|
|
13
|
+
name: "@eslint/css-tree";
|
|
14
|
+
version: string;
|
|
15
|
+
phase: 'css-value';
|
|
16
|
+
scope: 'expanded-declarations-and-known-math-grammar-and-static-types-v1';
|
|
17
|
+
}>;
|
|
18
|
+
/** Grammar knowledge is a report, never permission to generate a declaration. */
|
|
19
|
+
declare function cssValueStatus(property: string, value: string): MasterCSSValueStatus;
|
|
20
|
+
declare function validateRuleDeclarations(text: string): DeclarationValidation[];
|
|
21
|
+
declare function withCSSValueValidation<T extends {
|
|
22
|
+
readonly cssSyntaxStatus?: import('@master/css-binding/tooling').MasterCSSSyntaxStatus;
|
|
23
|
+
readonly className: string;
|
|
24
|
+
readonly rules: readonly {
|
|
25
|
+
readonly text: string;
|
|
26
|
+
}[];
|
|
27
|
+
readonly diagnostics?: readonly MasterCSSDiagnostic[];
|
|
28
|
+
}>(result: T): T & {
|
|
29
|
+
cssSyntaxStatus: import("@master/css-binding/protocol").MasterCSSSyntaxStatus;
|
|
30
|
+
cssValueStatus: MasterCSSValueStatus;
|
|
31
|
+
browserSupport: 'not-checked';
|
|
32
|
+
checks: (Readonly<{
|
|
33
|
+
name: "@eslint/css-tree";
|
|
34
|
+
version: string;
|
|
35
|
+
phase: 'css-syntax';
|
|
36
|
+
scope: 'selectors-queries-declarations';
|
|
37
|
+
}> | Readonly<{
|
|
38
|
+
name: "@eslint/css-tree";
|
|
39
|
+
version: string;
|
|
40
|
+
phase: 'css-value';
|
|
41
|
+
scope: 'expanded-declarations-and-known-math-grammar-and-static-types-v1';
|
|
42
|
+
}>)[];
|
|
43
|
+
declarations: DeclarationValidation[];
|
|
44
|
+
diagnostics: MasterCSSDiagnostic[];
|
|
45
|
+
};
|
|
46
|
+
export { CSS_VALUE_CHECK, DeclarationValidation, cssValueStatus, validateRuleDeclarations, withCSSValueValidation };
|