@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.
Files changed (122) hide show
  1. package/README.md +58 -0
  2. package/dist/browser.d.ts +2 -0
  3. package/dist/browser.js +1 -0
  4. package/dist/css-tree-version.d.ts +2 -0
  5. package/dist/css-tree-version.js +4 -0
  6. package/dist/css.d.ts +32 -0
  7. package/dist/css.js +120 -0
  8. package/dist/immutable.d.ts +2 -0
  9. package/dist/immutable.js +7 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.js +1 -0
  12. package/dist/language/binding-session.d.ts +6 -0
  13. package/dist/language/binding-session.js +8 -0
  14. package/dist/language/browser.d.ts +10 -0
  15. package/dist/language/browser.js +12 -0
  16. package/dist/language/common.d.ts +12 -0
  17. package/dist/language/common.js +55 -0
  18. package/dist/language/contracts.d.ts +197 -0
  19. package/dist/language/contracts.js +1 -0
  20. package/dist/language/index.d.ts +29 -0
  21. package/dist/language/index.js +39 -0
  22. package/dist/language/master-css.d.ts +13 -0
  23. package/dist/language/master-css.js +35 -0
  24. package/dist/language/node.d.ts +21 -0
  25. package/dist/language/node.js +36 -0
  26. package/dist/language/semantic/scopes.d.ts +55 -0
  27. package/dist/language/semantic/scopes.js +73 -0
  28. package/dist/language/semantic/types.d.ts +11 -0
  29. package/dist/language/semantic/types.js +1 -0
  30. package/dist/language/session.d.ts +37 -0
  31. package/dist/language/session.js +87 -0
  32. package/dist/language/settings.d.ts +13 -0
  33. package/dist/language/settings.js +19 -0
  34. package/dist/language/utils/mdn-css-data.d.ts +5 -0
  35. package/dist/language/utils/mdn-css-data.js +63 -0
  36. package/dist/lexer/browser.d.ts +6 -0
  37. package/dist/lexer/browser.js +11 -0
  38. package/dist/lexer/contracts.d.ts +41 -0
  39. package/dist/lexer/contracts.js +1 -0
  40. package/dist/lexer/index.d.ts +8 -0
  41. package/dist/lexer/index.js +11 -0
  42. package/dist/lexer/node.d.ts +7 -0
  43. package/dist/lexer/node.js +11 -0
  44. package/dist/lexer/session.d.ts +17 -0
  45. package/dist/lexer/session.js +25 -0
  46. package/dist/lint/analysis.d.ts +90 -0
  47. package/dist/lint/analysis.js +1 -0
  48. package/dist/lint/binding-session.d.ts +21 -0
  49. package/dist/lint/binding-session.js +97 -0
  50. package/dist/lint/constants.d.ts +7 -0
  51. package/dist/lint/constants.js +18 -0
  52. package/dist/lint/contracts.d.ts +17 -0
  53. package/dist/lint/contracts.js +6 -0
  54. package/dist/lint/diagnostic-format.d.ts +5 -0
  55. package/dist/lint/diagnostic-format.js +15 -0
  56. package/dist/lint/diagnostics.d.ts +42 -0
  57. package/dist/lint/diagnostics.js +1 -0
  58. package/dist/lint/index.d.ts +21 -0
  59. package/dist/lint/index.js +30 -0
  60. package/dist/lint/node.d.ts +6 -0
  61. package/dist/lint/node.js +11 -0
  62. package/dist/lint/rule-signatures.d.ts +23 -0
  63. package/dist/lint/rule-signatures.js +27 -0
  64. package/dist/lint/source.d.ts +70 -0
  65. package/dist/lint/source.js +261 -0
  66. package/dist/math-types.d.ts +11 -0
  67. package/dist/math-types.js +236 -0
  68. package/dist/math-validation.d.ts +7 -0
  69. package/dist/math-validation.js +74 -0
  70. package/dist/node.d.ts +12 -0
  71. package/dist/node.js +32 -0
  72. package/dist/scanner/binding-session.d.ts +29 -0
  73. package/dist/scanner/binding-session.js +37 -0
  74. package/dist/scanner/core.d.ts +130 -0
  75. package/dist/scanner/core.js +480 -0
  76. package/dist/scanner/index.d.ts +3 -0
  77. package/dist/scanner/index.js +3 -0
  78. package/dist/scanner/node.d.ts +5 -0
  79. package/dist/scanner/node.js +4 -0
  80. package/dist/scanner/options/index.d.ts +16 -0
  81. package/dist/scanner/options/index.js +57 -0
  82. package/dist/scanner/source-policy.d.ts +15 -0
  83. package/dist/scanner/source-policy.js +131 -0
  84. package/dist/source/adapters/optional-peer.d.ts +5 -0
  85. package/dist/source/adapters/optional-peer.js +29 -0
  86. package/dist/source/adapters/oxc.d.ts +2 -0
  87. package/dist/source/adapters/oxc.js +6 -0
  88. package/dist/source/adapters/svelte.d.ts +5 -0
  89. package/dist/source/adapters/svelte.js +82 -0
  90. package/dist/source/adapters/types.d.ts +11 -0
  91. package/dist/source/adapters/types.js +9 -0
  92. package/dist/source/adapters/vue.d.ts +5 -0
  93. package/dist/source/adapters/vue.js +50 -0
  94. package/dist/source/browser.d.ts +7 -0
  95. package/dist/source/browser.js +11 -0
  96. package/dist/source/contracts.d.ts +35 -0
  97. package/dist/source/contracts.js +1 -0
  98. package/dist/source/index.d.ts +8 -0
  99. package/dist/source/index.js +11 -0
  100. package/dist/source/native.d.ts +5 -0
  101. package/dist/source/native.js +53 -0
  102. package/dist/source/node.d.ts +7 -0
  103. package/dist/source/node.js +11 -0
  104. package/dist/source/session.d.ts +25 -0
  105. package/dist/source/session.js +37 -0
  106. package/dist/syntax-validation.d.ts +10 -0
  107. package/dist/syntax-validation.js +54 -0
  108. package/dist/tooling-session.d.ts +66 -0
  109. package/dist/tooling-session.js +188 -0
  110. package/dist/validator/binding-session.d.ts +17 -0
  111. package/dist/validator/binding-session.js +29 -0
  112. package/dist/validator/contracts.d.ts +24 -0
  113. package/dist/validator/contracts.js +1 -0
  114. package/dist/validator/index.d.ts +10 -0
  115. package/dist/validator/index.js +13 -0
  116. package/dist/validator/node.d.ts +6 -0
  117. package/dist/validator/node.js +11 -0
  118. package/dist/validator/types/syntax-error.d.ts +22 -0
  119. package/dist/validator/types/syntax-error.js +1 -0
  120. package/dist/value-validation.d.ts +46 -0
  121. package/dist/value-validation.js +162 -0
  122. package/package.json +127 -0
@@ -0,0 +1,35 @@
1
+ import { getMdnPropertySyntax } from "./utils/mdn-css-data.js";
2
+ // src/language/master-css.ts
3
+ function matchesLanguageServiceNativeDeclaration({ property }) {
4
+ return property.startsWith("--") || Boolean(getMdnPropertySyntax(property));
5
+ }
6
+ const SELECTOR_SIGNS = [
7
+ ":",
8
+ "_",
9
+ ">",
10
+ "+",
11
+ "~"
12
+ ];
13
+ const QUERY_COMPARISON_OPERATORS = [
14
+ ">",
15
+ "<",
16
+ "="
17
+ ];
18
+ const QUERY_LOGICAL_OPERATORS = ["&"];
19
+ const DELIMITER_SIGN = "|";
20
+ const SEPARATOR_SIGN = ",";
21
+ const AT_SIGN = "@";
22
+ const CLASS_ATTRIBUTES = ["class", "className"];
23
+ const CLASS_DECLARATIONS = [];
24
+ const CLASS_FUNCTIONS = [
25
+ "clsx",
26
+ "cva",
27
+ "ctl",
28
+ "cv",
29
+ "class",
30
+ "classnames",
31
+ "classVariant",
32
+ "styled(?:\\s+)?(?:\\.\\w+)?",
33
+ "classList(?:\\s+)?\\.(?:add|remove|toggle|replace)"
34
+ ];
35
+ export { AT_SIGN, CLASS_ATTRIBUTES, CLASS_DECLARATIONS, CLASS_FUNCTIONS, DELIMITER_SIGN, QUERY_COMPARISON_OPERATORS, QUERY_LOGICAL_OPERATORS, SELECTOR_SIGNS, SEPARATOR_SIGN, matchesLanguageServiceNativeDeclaration };
@@ -0,0 +1,21 @@
1
+ import { MasterCSSDocumentAnalysis, MasterCSSDocumentAnalysisRequest, MasterCSSFormatDirectivesRequest, MasterCSSFormatDirectivesResult, MasterCSSLanguageInspection } from "./contracts.js";
2
+ import { LanguageSession } from "./session.js";
3
+ import "./index.js";
4
+ import { MasterCSSManifest } from "@master/css-schema/manifest";
5
+ /**
6
+ * Create a reusable native language-only session synchronously.
7
+ * Results are immutable snapshots. Dispose the session when its owner is finished.
8
+ */
9
+ declare function createLanguageSessionSync(options: {
10
+ readonly manifest: MasterCSSManifest;
11
+ }): LanguageSession;
12
+ declare function analyzeDocumentSync(request: MasterCSSDocumentAnalysisRequest, options: {
13
+ readonly manifest: MasterCSSManifest;
14
+ }): MasterCSSDocumentAnalysis;
15
+ declare function inspectClassNameSync(className: string, options: {
16
+ readonly manifest: MasterCSSManifest;
17
+ }): MasterCSSLanguageInspection;
18
+ declare function formatDirectivesSync(request: MasterCSSFormatDirectivesRequest, options: {
19
+ readonly manifest: MasterCSSManifest;
20
+ }): MasterCSSFormatDirectivesResult;
21
+ export { type LanguageSession as MasterCSSLanguageSession, analyzeDocumentSync, createLanguageSessionSync, formatDirectivesSync, inspectClassNameSync };
@@ -0,0 +1,36 @@
1
+ import { bindLanguageSession } from "./session.js";
2
+ import { createToolingBindingSync } from "@master/css-binding/tooling/node";
3
+ // src/language/node.ts
4
+ /**
5
+ * Create a reusable native language-only session synchronously.
6
+ * Results are immutable snapshots. Dispose the session when its owner is finished.
7
+ */
8
+ function createLanguageSessionSync(options) {
9
+ const binding = createToolingBindingSync();
10
+ return bindLanguageSession(binding.binding, binding.createLanguageSession(options.manifest));
11
+ }
12
+ function analyzeDocumentSync(request, options) {
13
+ const session = createLanguageSessionSync(options);
14
+ try {
15
+ return session.analyzeDocument(request);
16
+ } finally {
17
+ session.dispose();
18
+ }
19
+ }
20
+ function inspectClassNameSync(className, options) {
21
+ const session = createLanguageSessionSync(options);
22
+ try {
23
+ return session.inspectClassName(className);
24
+ } finally {
25
+ session.dispose();
26
+ }
27
+ }
28
+ function formatDirectivesSync(request, options) {
29
+ const session = createLanguageSessionSync(options);
30
+ try {
31
+ return session.formatDirectives(request);
32
+ } finally {
33
+ session.dispose();
34
+ }
35
+ }
36
+ export { analyzeDocumentSync, createLanguageSessionSync, formatDirectivesSync, inspectClassNameSync };
@@ -0,0 +1,55 @@
1
+ import { SemanticTokenModifier, SemanticTokenType } from "./types.js";
2
+ declare const MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP: {
3
+ readonly class: ["entity.other.attribute-name.class.css"];
4
+ readonly 'class.component': ["entity.other.attribute-name.class.css"];
5
+ readonly 'class.declaration': ["entity.other.attribute-name.class.css"];
6
+ readonly 'class.selector': ["entity.other.attribute-name.class.css"];
7
+ readonly enumMember: ["support.constant.property-value.css"];
8
+ readonly 'enumMember.directive': ["support.constant.property-value.css"];
9
+ readonly 'enumMember.query': ["support.constant.property-value.css"];
10
+ readonly 'enumMember.unit': ["keyword.other.unit"];
11
+ readonly property: ["support.type.property-name.css"];
12
+ readonly 'property.directive': ["support.type.property-name.css"];
13
+ readonly 'property.query': ["support.type.property-name.css"];
14
+ readonly variable: ["variable.other.master-css.css", "variable.css"];
15
+ readonly 'variable.directive': ["variable.parameter.master-css.css"];
16
+ readonly 'variable.selector': ["entity.other.attribute-name.id.css"];
17
+ readonly function: ["support.function.misc.css"];
18
+ readonly number: ["constant.numeric.css"];
19
+ readonly 'number.query': ["constant.numeric.css"];
20
+ readonly string: ["string.quoted.css", "string.quoted.html"];
21
+ readonly 'string.quoted': ["string.quoted.css", "string.quoted.html"];
22
+ readonly keyword: ["keyword.control.at-rule"];
23
+ readonly 'keyword.directive': ["keyword.control.at-rule.master-css.css"];
24
+ readonly 'keyword.query': ["keyword.control.at-rule"];
25
+ readonly modifier: ["entity.other.attribute-name.pseudo-class.css"];
26
+ readonly 'modifier.directive': ["storage.modifier.master-css.css"];
27
+ readonly 'modifier.pseudoClass': ["entity.other.attribute-name.pseudo-class.css"];
28
+ readonly 'modifier.pseudoElement': ["entity.other.attribute-name.pseudo-element.css"];
29
+ readonly operator: ["keyword.operator.css"];
30
+ readonly 'operator.directive': ["punctuation.section.property-list.begin.bracket.curly.css"];
31
+ readonly 'operator.blockBrace': ["punctuation.section.property-list.begin.bracket.curly.css", "punctuation.section.property-list.end.bracket.curly.css"];
32
+ readonly 'operator.declarationSeparator': ["punctuation.separator.key-value.css"];
33
+ readonly 'operator.declarationTerminator': ["punctuation.terminator.rule.css"];
34
+ readonly 'operator.directiveTerminator': ["punctuation.terminator.rule.css"];
35
+ readonly 'operator.functionPunctuation': ["punctuation.section.function.begin.bracket.round.css", "punctuation.section.function.end.bracket.round.css"];
36
+ readonly 'operator.important': ["keyword.other.important.css", "keyword.operator.important.css"];
37
+ readonly 'operator.pseudoClass': ["entity.other.attribute-name.pseudo-class.css"];
38
+ readonly 'operator.pseudoClassDelimiter': ["punctuation.definition.entity.css"];
39
+ readonly 'operator.pseudoElement': ["entity.other.attribute-name.pseudo-element.css"];
40
+ readonly 'operator.pseudoElementDelimiter': ["punctuation.definition.entity.css"];
41
+ readonly 'operator.query': ["keyword.operator.css"];
42
+ readonly 'operator.queryOperator': ["keyword.operator.comparison.css", "keyword.operator.css"];
43
+ readonly 'operator.queryPunctuation': ["punctuation.separator.list.comma.css", "punctuation.separator.key-value.css", "punctuation.definition.parameters.begin.bracket.round.css", "punctuation.definition.parameters.end.bracket.round.css", "punctuation.section.function.begin.bracket.round.css", "punctuation.section.function.end.bracket.round.css"];
44
+ readonly 'operator.selector': ["keyword.operator.combinator.css"];
45
+ readonly 'operator.selectorCombinator': ["keyword.operator.combinator.css"];
46
+ readonly 'operator.selectorPunctuation': ["punctuation.separator.list.comma.css", "punctuation.definition.entity.css", "punctuation.section.function.begin.bracket.round.css", "punctuation.section.function.end.bracket.round.css", "punctuation.definition.entity.begin.bracket.square.css", "punctuation.definition.entity.end.bracket.square.css"];
47
+ readonly 'operator.unit': ["keyword.operator.css"];
48
+ readonly 'operator.valueOperator': ["keyword.operator.css"];
49
+ readonly 'operator.valueSeparator': ["punctuation.separator.list.comma.css"];
50
+ readonly type: ["entity.name.tag.css"];
51
+ readonly 'type.selector': ["entity.name.tag.css"];
52
+ };
53
+ type MasterCSSSemanticTokenScopeKey = keyof typeof MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP;
54
+ declare function getMasterCSSSemanticTokenScopeKeys(type: SemanticTokenType, modifiers?: SemanticTokenModifier[]): ("class" | "class.component" | "class.declaration" | "class.selector" | "enumMember" | "enumMember.directive" | "enumMember.query" | "enumMember.unit" | "function" | "keyword" | "keyword.directive" | "keyword.query" | "modifier" | "modifier.directive" | "modifier.pseudoClass" | "modifier.pseudoElement" | "number" | "number.query" | "operator" | "operator.blockBrace" | "operator.declarationSeparator" | "operator.declarationTerminator" | "operator.directive" | "operator.directiveTerminator" | "operator.functionPunctuation" | "operator.important" | "operator.pseudoClass" | "operator.pseudoClassDelimiter" | "operator.pseudoElement" | "operator.pseudoElementDelimiter" | "operator.query" | "operator.queryOperator" | "operator.queryPunctuation" | "operator.selector" | "operator.selectorCombinator" | "operator.selectorPunctuation" | "operator.unit" | "operator.valueOperator" | "operator.valueSeparator" | "property" | "property.directive" | "property.query" | "string" | "string.quoted" | "type" | "type.selector" | "variable" | "variable.directive" | "variable.selector")[];
55
+ export { MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP, MasterCSSSemanticTokenScopeKey, getMasterCSSSemanticTokenScopeKeys };
@@ -0,0 +1,73 @@
1
+ // src/language/semantic/scopes.ts
2
+ const MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP = {
3
+ class: ["entity.other.attribute-name.class.css"],
4
+ "class.component": ["entity.other.attribute-name.class.css"],
5
+ "class.declaration": ["entity.other.attribute-name.class.css"],
6
+ "class.selector": ["entity.other.attribute-name.class.css"],
7
+ enumMember: ["support.constant.property-value.css"],
8
+ "enumMember.directive": ["support.constant.property-value.css"],
9
+ "enumMember.query": ["support.constant.property-value.css"],
10
+ "enumMember.unit": ["keyword.other.unit"],
11
+ property: ["support.type.property-name.css"],
12
+ "property.directive": ["support.type.property-name.css"],
13
+ "property.query": ["support.type.property-name.css"],
14
+ variable: ["variable.other.master-css.css", "variable.css"],
15
+ "variable.directive": ["variable.parameter.master-css.css"],
16
+ "variable.selector": ["entity.other.attribute-name.id.css"],
17
+ function: ["support.function.misc.css"],
18
+ number: ["constant.numeric.css"],
19
+ "number.query": ["constant.numeric.css"],
20
+ string: ["string.quoted.css", "string.quoted.html"],
21
+ "string.quoted": ["string.quoted.css", "string.quoted.html"],
22
+ keyword: ["keyword.control.at-rule"],
23
+ "keyword.directive": ["keyword.control.at-rule.master-css.css"],
24
+ "keyword.query": ["keyword.control.at-rule"],
25
+ modifier: ["entity.other.attribute-name.pseudo-class.css"],
26
+ "modifier.directive": ["storage.modifier.master-css.css"],
27
+ "modifier.pseudoClass": ["entity.other.attribute-name.pseudo-class.css"],
28
+ "modifier.pseudoElement": ["entity.other.attribute-name.pseudo-element.css"],
29
+ operator: ["keyword.operator.css"],
30
+ "operator.directive": ["punctuation.section.property-list.begin.bracket.curly.css"],
31
+ "operator.blockBrace": ["punctuation.section.property-list.begin.bracket.curly.css", "punctuation.section.property-list.end.bracket.curly.css"],
32
+ "operator.declarationSeparator": ["punctuation.separator.key-value.css"],
33
+ "operator.declarationTerminator": ["punctuation.terminator.rule.css"],
34
+ "operator.directiveTerminator": ["punctuation.terminator.rule.css"],
35
+ "operator.functionPunctuation": ["punctuation.section.function.begin.bracket.round.css", "punctuation.section.function.end.bracket.round.css"],
36
+ "operator.important": ["keyword.other.important.css", "keyword.operator.important.css"],
37
+ "operator.pseudoClass": ["entity.other.attribute-name.pseudo-class.css"],
38
+ "operator.pseudoClassDelimiter": ["punctuation.definition.entity.css"],
39
+ "operator.pseudoElement": ["entity.other.attribute-name.pseudo-element.css"],
40
+ "operator.pseudoElementDelimiter": ["punctuation.definition.entity.css"],
41
+ "operator.query": ["keyword.operator.css"],
42
+ "operator.queryOperator": ["keyword.operator.comparison.css", "keyword.operator.css"],
43
+ "operator.queryPunctuation": [
44
+ "punctuation.separator.list.comma.css",
45
+ "punctuation.separator.key-value.css",
46
+ "punctuation.definition.parameters.begin.bracket.round.css",
47
+ "punctuation.definition.parameters.end.bracket.round.css",
48
+ "punctuation.section.function.begin.bracket.round.css",
49
+ "punctuation.section.function.end.bracket.round.css"
50
+ ],
51
+ "operator.selector": ["keyword.operator.combinator.css"],
52
+ "operator.selectorCombinator": ["keyword.operator.combinator.css"],
53
+ "operator.selectorPunctuation": [
54
+ "punctuation.separator.list.comma.css",
55
+ "punctuation.definition.entity.css",
56
+ "punctuation.section.function.begin.bracket.round.css",
57
+ "punctuation.section.function.end.bracket.round.css",
58
+ "punctuation.definition.entity.begin.bracket.square.css",
59
+ "punctuation.definition.entity.end.bracket.square.css"
60
+ ],
61
+ "operator.unit": ["keyword.operator.css"],
62
+ "operator.valueOperator": ["keyword.operator.css"],
63
+ "operator.valueSeparator": ["punctuation.separator.list.comma.css"],
64
+ type: ["entity.name.tag.css"],
65
+ "type.selector": ["entity.name.tag.css"]
66
+ };
67
+ function getMasterCSSSemanticTokenScopeKeys(type, modifiers = []) {
68
+ const keys = [];
69
+ for (const modifier of [...modifiers].reverse()) keys.push(`${type}.${modifier}`);
70
+ keys.push(type);
71
+ return keys.filter((key) => key in MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP);
72
+ }
73
+ export { MASTER_CSS_SEMANTIC_TOKEN_SCOPE_MAP, getMasterCSSSemanticTokenScopeKeys };
@@ -0,0 +1,11 @@
1
+ import { SEMANTIC_TOKEN_MODIFIERS, SEMANTIC_TOKEN_TYPES } from "../common.js";
2
+ type SemanticTokenType = typeof SEMANTIC_TOKEN_TYPES[number];
3
+ type SemanticTokenModifier = typeof SEMANTIC_TOKEN_MODIFIERS[number];
4
+ type HighlightTokenRole = 'block.brace' | 'declaration.property' | 'declaration.separator' | 'declaration.terminator' | 'query.keyword' | 'selector.combinator' | 'selector.pseudoClass.delimiter' | 'selector.pseudoClass.name' | 'selector.pseudoElement.delimiter' | 'selector.pseudoElement.name' | 'selector.punctuation' | 'selector.type' | 'utility.component' | 'utility.semantic' | 'value.important' | 'value.function' | 'value.function.punctuation' | 'value.keyword' | 'value.number' | 'value.operator' | 'value.separator' | 'value.string' | 'value.unit' | 'value.variable';
5
+ interface SemanticTokenItem {
6
+ start: number;
7
+ end: number;
8
+ type: SemanticTokenType;
9
+ modifiers?: SemanticTokenModifier[];
10
+ }
11
+ export { HighlightTokenRole, SemanticTokenItem, SemanticTokenModifier, SemanticTokenType };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import { MasterCSSDocumentAnalysis, MasterCSSDocumentAnalysisRequest, MasterCSSFormatDirectivesRequest, MasterCSSFormatDirectivesResult, MasterCSSLanguageClassifications, MasterCSSLanguageColorCandidate, MasterCSSLanguageColorPresentation, MasterCSSLanguageColorTokens, MasterCSSLanguageCompletionIndex, MasterCSSLanguageInspection as MasterCSSLanguageInspection$1, MasterCSSLanguageTokenFamilies, MasterCSSNativeDeclarationCompletion, MasterCSSNativeDeclarationCompletionRequest } from "./contracts.js";
2
+ import { MasterCSSNativeDeclarationCandidate } from "@master/css-binding/tooling";
3
+ interface BindingLanguageSession {
4
+ prepareDocument(request: unknown): {
5
+ readonly id: number;
6
+ readonly nativeCandidates: readonly MasterCSSNativeDeclarationCandidate[];
7
+ };
8
+ finishDocument(id: number, nativeSupport: boolean[]): unknown;
9
+ cancelDocument(id: number): void;
10
+ analyzeDocument(request: unknown): unknown;
11
+ formatDirectives(request: unknown): unknown;
12
+ nativeDeclarationCompletion(request: unknown): unknown;
13
+ nativeDeclarationCandidates(classNames: string[]): unknown;
14
+ classifyClassNames(classNames: string[], nativeSupport?: boolean[]): unknown;
15
+ inspectClassName(className: string, nativeSupport?: boolean[]): unknown;
16
+ tokenFamilies(): unknown;
17
+ completionIndex(): unknown;
18
+ colorPresentation(colorToken: string): unknown;
19
+ colorTokens(candidates: unknown): unknown;
20
+ dispose(): void;
21
+ }
22
+ interface LanguageSession extends Disposable {
23
+ readonly binding: 'native' | 'wasm';
24
+ analyzeDocument(request: MasterCSSDocumentAnalysisRequest): MasterCSSDocumentAnalysis;
25
+ formatDirectives(request: MasterCSSFormatDirectivesRequest): MasterCSSFormatDirectivesResult;
26
+ /** The completion context at a cursor inside a `(property:value)` head; undefined elsewhere. */
27
+ nativeDeclarationCompletion(request: MasterCSSNativeDeclarationCompletionRequest): MasterCSSNativeDeclarationCompletion | undefined;
28
+ classifyClassNames(classNames: readonly string[]): MasterCSSLanguageClassifications;
29
+ inspectClassName(className: string): MasterCSSLanguageInspection$1;
30
+ tokenFamilies(): MasterCSSLanguageTokenFamilies;
31
+ completionIndex(): MasterCSSLanguageCompletionIndex;
32
+ colorPresentation(colorToken: string): MasterCSSLanguageColorPresentation;
33
+ colorTokens(candidates: readonly MasterCSSLanguageColorCandidate[]): MasterCSSLanguageColorTokens;
34
+ dispose(): void;
35
+ }
36
+ declare function bindLanguageSession(binding: LanguageSession['binding'], session: BindingLanguageSession, nativeClassNames?: readonly string[]): LanguageSession;
37
+ export { LanguageSession, bindLanguageSession };
@@ -0,0 +1,87 @@
1
+ import { freezeToolingResult } from "../immutable.js";
2
+ import { withCSSValueValidation } from "../value-validation.js";
3
+ import { MASTER_CSS_LANGUAGE_BATCH_VERSION } from "@master/css-binding/tooling";
4
+ import { MasterCSSError } from "@master/css-schema";
5
+ // src/language/session.ts
6
+ function parse(value) {
7
+ return value;
8
+ }
9
+ function validate(value) {
10
+ if (value.version !== MASTER_CSS_LANGUAGE_BATCH_VERSION) throw new MasterCSSError({
11
+ code: "LANGUAGE_BATCH_VERSION_MISMATCH",
12
+ domain: "tooling",
13
+ message: `Expected Master CSS language batch version ${MASTER_CSS_LANGUAGE_BATCH_VERSION}, received ${String(value.version)}.`
14
+ });
15
+ return freezeToolingResult(value);
16
+ }
17
+ function bindLanguageSession(binding, session, nativeClassNames = []) {
18
+ const nativeClasses = new Set(nativeClassNames);
19
+ let disposed = false;
20
+ const assertActive = () => {
21
+ if (disposed) throw new MasterCSSError({
22
+ code: "SESSION_DISPOSED",
23
+ domain: "tooling",
24
+ message: "The Master CSS language session has been disposed."
25
+ });
26
+ };
27
+ const dispose = () => {
28
+ if (disposed) return;
29
+ disposed = true;
30
+ completionIndexCache = void 0;
31
+ session.dispose();
32
+ };
33
+ let completionIndexCache;
34
+ return {
35
+ binding,
36
+ analyzeDocument(request) {
37
+ assertActive();
38
+ const prepared = session.prepareDocument(request);
39
+ try {
40
+ return validate(parse(session.finishDocument(prepared.id, [])));
41
+ } finally {
42
+ session.cancelDocument(prepared.id);
43
+ }
44
+ },
45
+ formatDirectives(request) {
46
+ assertActive();
47
+ return validate(parse(session.formatDirectives(request)));
48
+ },
49
+ nativeDeclarationCompletion(request) {
50
+ assertActive();
51
+ const completion = parse(session.nativeDeclarationCompletion(request));
52
+ return completion ? validate(completion) : void 0;
53
+ },
54
+ classifyClassNames(classNames) {
55
+ assertActive();
56
+ const values = [...classNames];
57
+ return validate(parse(session.classifyClassNames(values)));
58
+ },
59
+ inspectClassName(className) {
60
+ assertActive();
61
+ const result = parse(session.inspectClassName(className));
62
+ return validate(withCSSValueValidation({
63
+ ...result,
64
+ diagnostics: nativeClasses.has(className) && !result.rules.length ? [] : result.diagnostics ?? []
65
+ }));
66
+ },
67
+ tokenFamilies() {
68
+ assertActive();
69
+ return validate(parse(session.tokenFamilies()));
70
+ },
71
+ completionIndex() {
72
+ assertActive();
73
+ return completionIndexCache ||= validate(parse(session.completionIndex()));
74
+ },
75
+ colorPresentation(token) {
76
+ assertActive();
77
+ return validate(parse(session.colorPresentation(token)));
78
+ },
79
+ colorTokens(candidates) {
80
+ assertActive();
81
+ return validate(parse(session.colorTokens(candidates)));
82
+ },
83
+ dispose,
84
+ [Symbol.dispose]: dispose
85
+ };
86
+ }
87
+ export { bindLanguageSession };
@@ -0,0 +1,13 @@
1
+ import { MasterCSSManifest } from "@master/css-schema/manifest";
2
+ interface ClassPositionSettings {
3
+ classAttributes?: string[];
4
+ classFunctions?: string[];
5
+ classDeclarations?: string[];
6
+ classAttributeBindings?: Record<string, [string, string] | false>;
7
+ }
8
+ declare const languageSettings: LanguageSettings;
9
+ interface LanguageSettings extends ClassPositionSettings {
10
+ manifest?: MasterCSSManifest;
11
+ embeddedSyntaxHighlighting?: 'active' | 'always' | 'off';
12
+ }
13
+ export { ClassPositionSettings, LanguageSettings, languageSettings as default };
@@ -0,0 +1,19 @@
1
+ import { CLASS_ATTRIBUTES, CLASS_DECLARATIONS, CLASS_FUNCTIONS } from "./master-css.js";
2
+ // src/language/settings.ts
3
+ const languageSettings = {
4
+ classAttributes: CLASS_ATTRIBUTES,
5
+ classAttributeBindings: {
6
+ "className": ["{", "}"],
7
+ "class": ["{", "}"],
8
+ "class:list": ["{", "}"],
9
+ ":class": ["\"", "\""],
10
+ "v-bind:class": ["\"", "\""],
11
+ "[class]": ["\"", "\""],
12
+ "[className]": ["\"", "\""],
13
+ "[ngClass]": ["\"", "\""]
14
+ },
15
+ classDeclarations: CLASS_DECLARATIONS,
16
+ classFunctions: CLASS_FUNCTIONS,
17
+ embeddedSyntaxHighlighting: "active"
18
+ };
19
+ export { languageSettings as default };
@@ -0,0 +1,5 @@
1
+ declare function getMdnPropertySyntax(name: string | undefined): string | undefined;
2
+ declare function getMdnPropertyValueNames(name: string | undefined): string[];
3
+ declare function getMdnPseudoClassNames(): string[];
4
+ declare function getMdnPseudoElementNames(): string[];
5
+ export { getMdnPropertySyntax, getMdnPropertyValueNames, getMdnPseudoClassNames, getMdnPseudoElementNames };
@@ -0,0 +1,63 @@
1
+ import propertiesJSON from "mdn-data/css/properties.json" with { type: "json" };
2
+ import selectorsJSON from "mdn-data/css/selectors.json" with { type: "json" };
3
+ import syntaxesJSON from "mdn-data/css/syntaxes.json" with { type: "json" };
4
+ // src/language/utils/mdn-css-data.ts
5
+ const mdnCSSData = {
6
+ properties: propertiesJSON,
7
+ selectors: selectorsJSON,
8
+ syntaxes: syntaxesJSON
9
+ };
10
+ const PAGE_PSEUDO_CLASS_NAMES = /* @__PURE__ */ new Set([
11
+ ":first",
12
+ ":left",
13
+ ":right",
14
+ ":blank"
15
+ ]);
16
+ const REFERENCE_RE = /<('([^']+)'|([a-zA-Z][\w-]*)(?:\s+[^>]*)?)>/g;
17
+ const TOKEN_RE = /-?[a-zA-Z_][\w-]*/g;
18
+ const VENDOR_PREFIX_RE = /^-(?:webkit|moz|ms)-/;
19
+ const NON_KEYWORD_TOKENS = /* @__PURE__ */ new Set([
20
+ "∞",
21
+ "n",
22
+ "of"
23
+ ]);
24
+ function unique(values) {
25
+ return [...new Set(values)];
26
+ }
27
+ function getMdnPropertySyntax(name) {
28
+ if (!name) return;
29
+ const exactSyntax = mdnCSSData.properties[name]?.syntax;
30
+ if (exactSyntax) return exactSyntax;
31
+ if (VENDOR_PREFIX_RE.test(name)) return mdnCSSData.properties[name.replace(VENDOR_PREFIX_RE, "")]?.syntax;
32
+ }
33
+ function getSyntaxByReference(name) {
34
+ return mdnCSSData.properties[name]?.syntax || mdnCSSData.syntaxes[name]?.syntax;
35
+ }
36
+ function collectSyntaxKeywordValues(syntax, seen = /* @__PURE__ */ new Set()) {
37
+ if (!syntax) return [];
38
+ const values = [];
39
+ let syntaxWithoutReferences = syntax;
40
+ for (const match of syntax.matchAll(REFERENCE_RE)) {
41
+ const referenceName = match[2] || match[3];
42
+ if (!referenceName || seen.has(referenceName)) continue;
43
+ seen.add(referenceName);
44
+ values.push(...collectSyntaxKeywordValues(getSyntaxByReference(referenceName), seen));
45
+ syntaxWithoutReferences = syntaxWithoutReferences.replace(match[0], " ");
46
+ }
47
+ for (const match of syntaxWithoutReferences.matchAll(TOKEN_RE)) {
48
+ const value = match[0];
49
+ if (NON_KEYWORD_TOKENS.has(value) || /^-?\d/.test(value)) continue;
50
+ values.push(value);
51
+ }
52
+ return unique(values);
53
+ }
54
+ function getMdnPropertyValueNames(name) {
55
+ return unique(collectSyntaxKeywordValues(getMdnPropertySyntax(name)));
56
+ }
57
+ function getMdnPseudoClassNames() {
58
+ return Object.keys(mdnCSSData.selectors).filter((name) => name.startsWith(":") && !name.startsWith("::") && !PAGE_PSEUDO_CLASS_NAMES.has(name));
59
+ }
60
+ function getMdnPseudoElementNames() {
61
+ return Object.keys(mdnCSSData.selectors).filter((name) => name.startsWith("::"));
62
+ }
63
+ export { getMdnPropertySyntax, getMdnPropertyValueNames, getMdnPseudoClassNames, getMdnPseudoElementNames };
@@ -0,0 +1,6 @@
1
+ import { LexerSession, LexerSessionError } from "./session.js";
2
+ import { MasterCSSWasmBindingLoadOptions } from "@master/css-binding/tooling";
3
+ declare function createLexerSession(options?: {
4
+ wasm?: MasterCSSWasmBindingLoadOptions;
5
+ }): Promise<LexerSession>;
6
+ export { type LexerSession, LexerSessionError, createLexerSession };
@@ -0,0 +1,11 @@
1
+ import { LexerSessionError, bindLexerSession } from "./session.js";
2
+ import { createToolingBinding } from "@master/css-binding/tooling";
3
+ // src/lexer/browser.ts
4
+ async function createLexerSession(options = {}) {
5
+ const tooling = await createToolingBinding({
6
+ binding: "wasm",
7
+ wasm: options.wasm
8
+ });
9
+ return bindLexerSession(tooling.binding, await tooling.createLexerSession());
10
+ }
11
+ export { LexerSessionError, createLexerSession };
@@ -0,0 +1,41 @@
1
+ interface MasterCSSSourceRange {
2
+ readonly start: number;
3
+ readonly end: number;
4
+ }
5
+ interface MasterCSSClassListInput {
6
+ readonly source: string;
7
+ readonly unescape?: readonly string[];
8
+ }
9
+ interface MasterCSSClassListAnalysisRequest {
10
+ readonly classLists?: readonly MasterCSSClassListInput[];
11
+ readonly cssSources?: readonly string[];
12
+ readonly escapeIdentifiers?: readonly string[];
13
+ }
14
+ interface MasterCSSClassListItem {
15
+ readonly range: MasterCSSSourceRange;
16
+ readonly raw: string;
17
+ readonly token: string;
18
+ }
19
+ interface MasterCSSCSSDirectiveAnalysis {
20
+ readonly name: string;
21
+ readonly range: MasterCSSSourceRange;
22
+ readonly preludeRange: MasterCSSSourceRange;
23
+ readonly hasBlock: boolean;
24
+ readonly quotedStrings: number;
25
+ }
26
+ interface MasterCSSCSSImportAnalysis {
27
+ readonly range: MasterCSSSourceRange;
28
+ readonly statement: string;
29
+ readonly source?: string;
30
+ }
31
+ interface MasterCSSCSSAnalysis {
32
+ readonly directives: readonly MasterCSSCSSDirectiveAnalysis[];
33
+ readonly imports: readonly MasterCSSCSSImportAnalysis[];
34
+ }
35
+ interface MasterCSSClassListAnalysis {
36
+ readonly version: 1;
37
+ readonly classLists: readonly (readonly MasterCSSClassListItem[])[];
38
+ readonly cssSources: readonly MasterCSSCSSAnalysis[];
39
+ readonly escapedIdentifiers: readonly string[];
40
+ }
41
+ export { MasterCSSCSSAnalysis, MasterCSSCSSDirectiveAnalysis, MasterCSSCSSImportAnalysis, MasterCSSClassListAnalysis, MasterCSSClassListAnalysisRequest, MasterCSSClassListInput, MasterCSSClassListItem, MasterCSSSourceRange };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { MasterCSSCSSAnalysis, MasterCSSCSSDirectiveAnalysis, MasterCSSCSSImportAnalysis, MasterCSSClassListAnalysis, MasterCSSClassListAnalysisRequest, MasterCSSClassListInput, MasterCSSClassListItem, MasterCSSSourceRange } from "./contracts.js";
2
+ import { MasterCSSBinding } from "@master/css-binding";
3
+ import { MasterCSSManifest } from "@master/css-schema/manifest";
4
+ declare function analyzeClassList(request: MasterCSSClassListAnalysisRequest, options: {
5
+ readonly manifest: MasterCSSManifest;
6
+ readonly binding?: MasterCSSBinding;
7
+ }): Promise<MasterCSSClassListAnalysis>;
8
+ export { type MasterCSSCSSAnalysis, type MasterCSSCSSDirectiveAnalysis, type MasterCSSCSSImportAnalysis, type MasterCSSClassListAnalysis, type MasterCSSClassListAnalysisRequest, type MasterCSSClassListInput, type MasterCSSClassListItem, type MasterCSSSourceRange, analyzeClassList };
@@ -0,0 +1,11 @@
1
+ import { createToolingSession } from "../tooling-session.js";
2
+ // src/lexer/index.ts
3
+ async function analyzeClassList(request, options) {
4
+ const session = await createToolingSession(options);
5
+ try {
6
+ return session.analyzeClassList(request);
7
+ } finally {
8
+ session.dispose();
9
+ }
10
+ }
11
+ export { analyzeClassList };
@@ -0,0 +1,7 @@
1
+ import { MasterCSSClassListAnalysis, MasterCSSClassListAnalysisRequest } from "./contracts.js";
2
+ import "./index.js";
3
+ import { MasterCSSManifest } from "@master/css-schema/manifest";
4
+ declare function analyzeClassListSync(request: MasterCSSClassListAnalysisRequest, options: {
5
+ readonly manifest: MasterCSSManifest;
6
+ }): MasterCSSClassListAnalysis;
7
+ export { analyzeClassListSync };
@@ -0,0 +1,11 @@
1
+ import { createToolingSessionSync } from "../node.js";
2
+ // src/lexer/node.ts
3
+ function analyzeClassListSync(request, options) {
4
+ const session = createToolingSessionSync(options);
5
+ try {
6
+ return session.analyzeClassList(request);
7
+ } finally {
8
+ session.dispose();
9
+ }
10
+ }
11
+ export { analyzeClassListSync };
@@ -0,0 +1,17 @@
1
+ import { MasterCSSLexerBatch, MasterCSSLexerBatchRequest } from "@master/css-binding/tooling";
2
+ type LexerBatchRequest = MasterCSSLexerBatchRequest;
3
+ interface BindingLexerSession {
4
+ analyze(request: unknown): unknown;
5
+ dispose(): void;
6
+ }
7
+ interface LexerSession {
8
+ readonly binding: 'native' | 'wasm';
9
+ analyze(request: LexerBatchRequest): MasterCSSLexerBatch;
10
+ dispose(): void;
11
+ }
12
+ declare class LexerSessionError extends Error {
13
+ readonly code: 'NATIVE_UNAVAILABLE' | 'LEXER_BATCH_VERSION_MISMATCH';
14
+ constructor(code: 'NATIVE_UNAVAILABLE' | 'LEXER_BATCH_VERSION_MISMATCH', message: string);
15
+ }
16
+ declare function bindLexerSession(binding: LexerSession['binding'], session: BindingLexerSession): LexerSession;
17
+ export { LexerBatchRequest, LexerSession, LexerSessionError, bindLexerSession };
@@ -0,0 +1,25 @@
1
+ import { MASTER_CSS_LEXER_BATCH_VERSION } from "@master/css-binding/tooling";
2
+ // src/lexer/session.ts
3
+ var LexerSessionError = class extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = "LexerSessionError";
9
+ }
10
+ };
11
+ function parse(value) {
12
+ const result = value;
13
+ if (result.version !== MASTER_CSS_LEXER_BATCH_VERSION) throw new LexerSessionError("LEXER_BATCH_VERSION_MISMATCH", `Expected Master CSS lexer batch version ${MASTER_CSS_LEXER_BATCH_VERSION}, received ${String(result.version)}.`);
14
+ return result;
15
+ }
16
+ function bindLexerSession(binding, session) {
17
+ return {
18
+ binding,
19
+ analyze(request) {
20
+ return parse(session.analyze(request));
21
+ },
22
+ dispose: () => session.dispose()
23
+ };
24
+ }
25
+ export { LexerSessionError, bindLexerSession };