@canonical/terrazzo-lsp 0.0.1
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 +68 -0
- package/dist/esm/cli.js +340 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/css/buildSelectorContext.js +9 -0
- package/dist/esm/css/buildSelectorContext.js.map +1 -0
- package/dist/esm/css/classifySelectorScope.js +32 -0
- package/dist/esm/css/classifySelectorScope.js.map +1 -0
- package/dist/esm/css/compareFallbackStaleness.js +61 -0
- package/dist/esm/css/compareFallbackStaleness.js.map +1 -0
- package/dist/esm/css/constants.js +35 -0
- package/dist/esm/css/constants.js.map +1 -0
- package/dist/esm/css/expectedTypeForProperty.js +124 -0
- package/dist/esm/css/expectedTypeForProperty.js.map +1 -0
- package/dist/esm/css/extractCssImports.js +20 -0
- package/dist/esm/css/extractCssImports.js.map +1 -0
- package/dist/esm/css/extractJsImports.js +17 -0
- package/dist/esm/css/extractJsImports.js.map +1 -0
- package/dist/esm/css/extractPackageName.js +20 -0
- package/dist/esm/css/extractPackageName.js.map +1 -0
- package/dist/esm/css/extractPropertyAtPosition.js +30 -0
- package/dist/esm/css/extractPropertyAtPosition.js.map +1 -0
- package/dist/esm/css/extractUnit.js +9 -0
- package/dist/esm/css/extractUnit.js.map +1 -0
- package/dist/esm/css/formatFileUri.js +5 -0
- package/dist/esm/css/formatFileUri.js.map +1 -0
- package/dist/esm/css/index.js +25 -0
- package/dist/esm/css/index.js.map +1 -0
- package/dist/esm/css/isAssignable.js +14 -0
- package/dist/esm/css/isAssignable.js.map +1 -0
- package/dist/esm/css/isBareSpecifier.js +13 -0
- package/dist/esm/css/isBareSpecifier.js.map +1 -0
- package/dist/esm/css/isExternalPath.js +5 -0
- package/dist/esm/css/isExternalPath.js.map +1 -0
- package/dist/esm/css/isSuppressed.js +49 -0
- package/dist/esm/css/isSuppressed.js.map +1 -0
- package/dist/esm/css/mapDtcgType.js +21 -0
- package/dist/esm/css/mapDtcgType.js.map +1 -0
- package/dist/esm/css/parseFileUri.js +5 -0
- package/dist/esm/css/parseFileUri.js.map +1 -0
- package/dist/esm/css/parseSuppressionDirectives.js +57 -0
- package/dist/esm/css/parseSuppressionDirectives.js.map +1 -0
- package/dist/esm/css/parseSyntaxType.js +27 -0
- package/dist/esm/css/parseSyntaxType.js.map +1 -0
- package/dist/esm/css/resolveDimensionValue.js +63 -0
- package/dist/esm/css/resolveDimensionValue.js.map +1 -0
- package/dist/esm/css/resolveImportSpecifier.js +30 -0
- package/dist/esm/css/resolveImportSpecifier.js.map +1 -0
- package/dist/esm/css/scanDeclarations.js +107 -0
- package/dist/esm/css/scanDeclarations.js.map +1 -0
- package/dist/esm/css/scanProperties.js +40 -0
- package/dist/esm/css/scanProperties.js.map +1 -0
- package/dist/esm/css/scanUsages.js +81 -0
- package/dist/esm/css/scanUsages.js.map +1 -0
- package/dist/esm/graph/ReachabilityCache.js +75 -0
- package/dist/esm/graph/ReachabilityCache.js.map +1 -0
- package/dist/esm/graph/TokenGraph.js +120 -0
- package/dist/esm/graph/TokenGraph.js.map +1 -0
- package/dist/esm/graph/index.js +5 -0
- package/dist/esm/graph/index.js.map +1 -0
- package/dist/esm/graph/loadArtifact.js +159 -0
- package/dist/esm/graph/loadArtifact.js.map +1 -0
- package/dist/esm/graph/parseArtifactToken.js +112 -0
- package/dist/esm/graph/parseArtifactToken.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/protocol/createRequest.js +7 -0
- package/dist/esm/protocol/createRequest.js.map +1 -0
- package/dist/esm/protocol/index.js +9 -0
- package/dist/esm/protocol/index.js.map +1 -0
- package/dist/esm/protocol/isCompletionRequest.js +4 -0
- package/dist/esm/protocol/isCompletionRequest.js.map +1 -0
- package/dist/esm/protocol/isDefinitionRequest.js +4 -0
- package/dist/esm/protocol/isDefinitionRequest.js.map +1 -0
- package/dist/esm/protocol/isDiagnosticsRequest.js +4 -0
- package/dist/esm/protocol/isDiagnosticsRequest.js.map +1 -0
- package/dist/esm/protocol/isHoverRequest.js +4 -0
- package/dist/esm/protocol/isHoverRequest.js.map +1 -0
- package/dist/esm/protocol/isReferencesRequest.js +4 -0
- package/dist/esm/protocol/isReferencesRequest.js.map +1 -0
- package/dist/esm/protocol/matchResponse.js +5 -0
- package/dist/esm/protocol/matchResponse.js.map +1 -0
- package/dist/esm/protocol/resolveConfig.js +206 -0
- package/dist/esm/protocol/resolveConfig.js.map +1 -0
- package/dist/esm/providers/buildTokenTooltip.js +448 -0
- package/dist/esm/providers/buildTokenTooltip.js.map +1 -0
- package/dist/esm/providers/classifyProvenance.js +19 -0
- package/dist/esm/providers/classifyProvenance.js.map +1 -0
- package/dist/esm/providers/formatCheckReport.js +90 -0
- package/dist/esm/providers/formatCheckReport.js.map +1 -0
- package/dist/esm/providers/index.js +12 -0
- package/dist/esm/providers/index.js.map +1 -0
- package/dist/esm/providers/produceArtifactDiagnostics.js +101 -0
- package/dist/esm/providers/produceArtifactDiagnostics.js.map +1 -0
- package/dist/esm/providers/produceDiagnostics.js +245 -0
- package/dist/esm/providers/produceDiagnostics.js.map +1 -0
- package/dist/esm/providers/provideCompletions.js +286 -0
- package/dist/esm/providers/provideCompletions.js.map +1 -0
- package/dist/esm/providers/provideDocumentColors.js +90 -0
- package/dist/esm/providers/provideDocumentColors.js.map +1 -0
- package/dist/esm/providers/provideHover.js +23 -0
- package/dist/esm/providers/provideHover.js.map +1 -0
- package/dist/esm/providers/provideRename.js +63 -0
- package/dist/esm/providers/provideRename.js.map +1 -0
- package/dist/esm/providers/provideSemanticTokens.js +81 -0
- package/dist/esm/providers/provideSemanticTokens.js.map +1 -0
- package/dist/esm/providers/provideWorkspaceSymbols.js +149 -0
- package/dist/esm/providers/provideWorkspaceSymbols.js.map +1 -0
- package/dist/esm/providers/resolveDefinition.js +42 -0
- package/dist/esm/providers/resolveDefinition.js.map +1 -0
- package/dist/esm/providers/tooltipOptions.js +15 -0
- package/dist/esm/providers/tooltipOptions.js.map +1 -0
- package/dist/esm/runtime/buildImportGraph.js +91 -0
- package/dist/esm/runtime/buildImportGraph.js.map +1 -0
- package/dist/esm/runtime/createGraphWorker.js +329 -0
- package/dist/esm/runtime/createGraphWorker.js.map +1 -0
- package/dist/esm/runtime/index.js +5 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/scheduleBufferUpdate.js +57 -0
- package/dist/esm/runtime/scheduleBufferUpdate.js.map +1 -0
- package/dist/esm/runtime/startLspServer.js +365 -0
- package/dist/esm/runtime/startLspServer.js.map +1 -0
- package/dist/esm/runtime/types.js +8 -0
- package/dist/esm/runtime/types.js.map +1 -0
- package/dist/esm/types.js +74 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/css/buildSelectorContext.d.ts +4 -0
- package/dist/types/css/buildSelectorContext.d.ts.map +1 -0
- package/dist/types/css/classifySelectorScope.d.ts +7 -0
- package/dist/types/css/classifySelectorScope.d.ts.map +1 -0
- package/dist/types/css/compareFallbackStaleness.d.ts +8 -0
- package/dist/types/css/compareFallbackStaleness.d.ts.map +1 -0
- package/dist/types/css/constants.d.ts +11 -0
- package/dist/types/css/constants.d.ts.map +1 -0
- package/dist/types/css/expectedTypeForProperty.d.ts +22 -0
- package/dist/types/css/expectedTypeForProperty.d.ts.map +1 -0
- package/dist/types/css/extractCssImports.d.ts +6 -0
- package/dist/types/css/extractCssImports.d.ts.map +1 -0
- package/dist/types/css/extractJsImports.d.ts +6 -0
- package/dist/types/css/extractJsImports.d.ts.map +1 -0
- package/dist/types/css/extractPackageName.d.ts +6 -0
- package/dist/types/css/extractPackageName.d.ts.map +1 -0
- package/dist/types/css/extractPropertyAtPosition.d.ts +22 -0
- package/dist/types/css/extractPropertyAtPosition.d.ts.map +1 -0
- package/dist/types/css/extractUnit.d.ts +6 -0
- package/dist/types/css/extractUnit.d.ts.map +1 -0
- package/dist/types/css/formatFileUri.d.ts +3 -0
- package/dist/types/css/formatFileUri.d.ts.map +1 -0
- package/dist/types/css/index.d.ts +25 -0
- package/dist/types/css/index.d.ts.map +1 -0
- package/dist/types/css/isAssignable.d.ts +7 -0
- package/dist/types/css/isAssignable.d.ts.map +1 -0
- package/dist/types/css/isBareSpecifier.d.ts +3 -0
- package/dist/types/css/isBareSpecifier.d.ts.map +1 -0
- package/dist/types/css/isExternalPath.d.ts +3 -0
- package/dist/types/css/isExternalPath.d.ts.map +1 -0
- package/dist/types/css/isSuppressed.d.ts +7 -0
- package/dist/types/css/isSuppressed.d.ts.map +1 -0
- package/dist/types/css/mapDtcgType.d.ts +7 -0
- package/dist/types/css/mapDtcgType.d.ts.map +1 -0
- package/dist/types/css/parseFileUri.d.ts +3 -0
- package/dist/types/css/parseFileUri.d.ts.map +1 -0
- package/dist/types/css/parseSuppressionDirectives.d.ts +13 -0
- package/dist/types/css/parseSuppressionDirectives.d.ts.map +1 -0
- package/dist/types/css/parseSyntaxType.d.ts +4 -0
- package/dist/types/css/parseSyntaxType.d.ts.map +1 -0
- package/dist/types/css/resolveDimensionValue.d.ts +7 -0
- package/dist/types/css/resolveDimensionValue.d.ts.map +1 -0
- package/dist/types/css/resolveImportSpecifier.d.ts +3 -0
- package/dist/types/css/resolveImportSpecifier.d.ts.map +1 -0
- package/dist/types/css/scanDeclarations.d.ts +8 -0
- package/dist/types/css/scanDeclarations.d.ts.map +1 -0
- package/dist/types/css/scanProperties.d.ts +7 -0
- package/dist/types/css/scanProperties.d.ts.map +1 -0
- package/dist/types/css/scanUsages.d.ts +7 -0
- package/dist/types/css/scanUsages.d.ts.map +1 -0
- package/dist/types/graph/ReachabilityCache.d.ts +13 -0
- package/dist/types/graph/ReachabilityCache.d.ts.map +1 -0
- package/dist/types/graph/TokenGraph.d.ts +19 -0
- package/dist/types/graph/TokenGraph.d.ts.map +1 -0
- package/dist/types/graph/index.d.ts +5 -0
- package/dist/types/graph/index.d.ts.map +1 -0
- package/dist/types/graph/loadArtifact.d.ts +13 -0
- package/dist/types/graph/loadArtifact.d.ts.map +1 -0
- package/dist/types/graph/parseArtifactToken.d.ts +13 -0
- package/dist/types/graph/parseArtifactToken.d.ts.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/protocol/createRequest.d.ts +51 -0
- package/dist/types/protocol/createRequest.d.ts.map +1 -0
- package/dist/types/protocol/index.d.ts +9 -0
- package/dist/types/protocol/index.d.ts.map +1 -0
- package/dist/types/protocol/isCompletionRequest.d.ts +5 -0
- package/dist/types/protocol/isCompletionRequest.d.ts.map +1 -0
- package/dist/types/protocol/isDefinitionRequest.d.ts +5 -0
- package/dist/types/protocol/isDefinitionRequest.d.ts.map +1 -0
- package/dist/types/protocol/isDiagnosticsRequest.d.ts +5 -0
- package/dist/types/protocol/isDiagnosticsRequest.d.ts.map +1 -0
- package/dist/types/protocol/isHoverRequest.d.ts +5 -0
- package/dist/types/protocol/isHoverRequest.d.ts.map +1 -0
- package/dist/types/protocol/isReferencesRequest.d.ts +5 -0
- package/dist/types/protocol/isReferencesRequest.d.ts.map +1 -0
- package/dist/types/protocol/matchResponse.d.ts +4 -0
- package/dist/types/protocol/matchResponse.d.ts.map +1 -0
- package/dist/types/protocol/resolveConfig.d.ts +16 -0
- package/dist/types/protocol/resolveConfig.d.ts.map +1 -0
- package/dist/types/providers/buildTokenTooltip.d.ts +33 -0
- package/dist/types/providers/buildTokenTooltip.d.ts.map +1 -0
- package/dist/types/providers/classifyProvenance.d.ts +8 -0
- package/dist/types/providers/classifyProvenance.d.ts.map +1 -0
- package/dist/types/providers/formatCheckReport.d.ts +14 -0
- package/dist/types/providers/formatCheckReport.d.ts.map +1 -0
- package/dist/types/providers/index.d.ts +12 -0
- package/dist/types/providers/index.d.ts.map +1 -0
- package/dist/types/providers/produceArtifactDiagnostics.d.ts +14 -0
- package/dist/types/providers/produceArtifactDiagnostics.d.ts.map +1 -0
- package/dist/types/providers/produceDiagnostics.d.ts +5 -0
- package/dist/types/providers/produceDiagnostics.d.ts.map +1 -0
- package/dist/types/providers/provideCompletions.d.ts +18 -0
- package/dist/types/providers/provideCompletions.d.ts.map +1 -0
- package/dist/types/providers/provideDocumentColors.d.ts +35 -0
- package/dist/types/providers/provideDocumentColors.d.ts.map +1 -0
- package/dist/types/providers/provideHover.d.ts +13 -0
- package/dist/types/providers/provideHover.d.ts.map +1 -0
- package/dist/types/providers/provideRename.d.ts +18 -0
- package/dist/types/providers/provideRename.d.ts.map +1 -0
- package/dist/types/providers/provideSemanticTokens.d.ts +12 -0
- package/dist/types/providers/provideSemanticTokens.d.ts.map +1 -0
- package/dist/types/providers/provideWorkspaceSymbols.d.ts +17 -0
- package/dist/types/providers/provideWorkspaceSymbols.d.ts.map +1 -0
- package/dist/types/providers/resolveDefinition.d.ts +8 -0
- package/dist/types/providers/resolveDefinition.d.ts.map +1 -0
- package/dist/types/providers/tooltipOptions.d.ts +12 -0
- package/dist/types/providers/tooltipOptions.d.ts.map +1 -0
- package/dist/types/runtime/buildImportGraph.d.ts +10 -0
- package/dist/types/runtime/buildImportGraph.d.ts.map +1 -0
- package/dist/types/runtime/createGraphWorker.d.ts +30 -0
- package/dist/types/runtime/createGraphWorker.d.ts.map +1 -0
- package/dist/types/runtime/index.d.ts +7 -0
- package/dist/types/runtime/index.d.ts.map +1 -0
- package/dist/types/runtime/scheduleBufferUpdate.d.ts +17 -0
- package/dist/types/runtime/scheduleBufferUpdate.d.ts.map +1 -0
- package/dist/types/runtime/startLspServer.d.ts +26 -0
- package/dist/types/runtime/startLspServer.d.ts.map +1 -0
- package/dist/types/runtime/types.d.ts +21 -0
- package/dist/types/runtime/types.d.ts.map +1 -0
- package/dist/types/types.d.ts +920 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see session/G.TOKEN_LSP.md §7.3 — DeclarationNode
|
|
3
|
+
* @see session/G.TOKEN_LSP.md §10.4 — Selector scope classification
|
|
4
|
+
*/
|
|
5
|
+
import { buildSelectorContext } from "./buildSelectorContext.js";
|
|
6
|
+
const DECL_REGEX = /(--[\w-]+)\s*:\s*([^;{}]+)/g;
|
|
7
|
+
/** Scan CSS source for custom property declarations. */
|
|
8
|
+
export function scanDeclarations(source, fileUri) {
|
|
9
|
+
const results = [];
|
|
10
|
+
const lines = source.split("\n");
|
|
11
|
+
const selectorStack = [];
|
|
12
|
+
const atRuleStack = [];
|
|
13
|
+
let braceDepth = 0;
|
|
14
|
+
const depthContexts = [];
|
|
15
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
16
|
+
const line = lines[lineIndex];
|
|
17
|
+
for (let i = 0; i < line.length; i++) {
|
|
18
|
+
const ch = line[i];
|
|
19
|
+
if (ch === "{") {
|
|
20
|
+
const preceding = line.substring(0, i).trim();
|
|
21
|
+
const atRuleMatch = preceding.match(/@(\w+)\s*(.*)/);
|
|
22
|
+
if (atRuleMatch && atRuleMatch[1] !== "property") {
|
|
23
|
+
const atRule = {
|
|
24
|
+
name: atRuleMatch[1],
|
|
25
|
+
prelude: atRuleMatch[2]?.trim() ?? "",
|
|
26
|
+
};
|
|
27
|
+
atRuleStack.push(atRule);
|
|
28
|
+
depthContexts[braceDepth] = { selector: null, atRule };
|
|
29
|
+
}
|
|
30
|
+
else if (atRuleMatch && atRuleMatch[1] === "property") {
|
|
31
|
+
depthContexts[braceDepth] = { selector: null, atRule: null };
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const selector = preceding || ":root";
|
|
35
|
+
selectorStack.push(selector);
|
|
36
|
+
depthContexts[braceDepth] = { selector, atRule: null };
|
|
37
|
+
}
|
|
38
|
+
braceDepth++;
|
|
39
|
+
}
|
|
40
|
+
else if (ch === "}") {
|
|
41
|
+
braceDepth--;
|
|
42
|
+
if (braceDepth >= 0) {
|
|
43
|
+
const ctx = depthContexts[braceDepth];
|
|
44
|
+
if (ctx?.selector)
|
|
45
|
+
selectorStack.pop();
|
|
46
|
+
if (ctx?.atRule)
|
|
47
|
+
atRuleStack.pop();
|
|
48
|
+
depthContexts[braceDepth] = { selector: null, atRule: null };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
DECL_REGEX.lastIndex = 0;
|
|
53
|
+
let match = DECL_REGEX.exec(line);
|
|
54
|
+
while (match !== null) {
|
|
55
|
+
const cssVar = match[1];
|
|
56
|
+
const rawValue = match[2].trim();
|
|
57
|
+
const currentSelector = selectorStack.length > 0
|
|
58
|
+
? selectorStack[selectorStack.length - 1]
|
|
59
|
+
: ":root";
|
|
60
|
+
const selectorCtx = buildSelectorContext(currentSelector, [
|
|
61
|
+
...atRuleStack,
|
|
62
|
+
]);
|
|
63
|
+
results.push({
|
|
64
|
+
cssVar,
|
|
65
|
+
fileUri,
|
|
66
|
+
line: lineIndex,
|
|
67
|
+
column: match.index,
|
|
68
|
+
rawValue,
|
|
69
|
+
cssType: inferCssType(rawValue),
|
|
70
|
+
selector: selectorCtx,
|
|
71
|
+
});
|
|
72
|
+
match = DECL_REGEX.exec(line);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
function inferCssType(rawValue) {
|
|
78
|
+
const trimmed = rawValue.trim();
|
|
79
|
+
if (/^(oklch|rgb|rgba|hsl|hsla|hwb|lab|lch|color|light-dark)\s*\(/i.test(trimmed))
|
|
80
|
+
return "<color>";
|
|
81
|
+
if (/^#[0-9a-f]{3,8}$/i.test(trimmed))
|
|
82
|
+
return "<color>";
|
|
83
|
+
if (/^(transparent|currentcolor|inherit|initial|unset)$/i.test(trimmed))
|
|
84
|
+
return "<color>";
|
|
85
|
+
const unitMatch = trimmed.match(/^-?[\d.]+([a-zA-Z%]+)$/);
|
|
86
|
+
if (unitMatch) {
|
|
87
|
+
const unit = unitMatch[1];
|
|
88
|
+
if (unit === "%")
|
|
89
|
+
return "<percentage>";
|
|
90
|
+
if (/^(px|rem|em|vw|vh|ch|ex|cm|mm|in|pt|pc|lh|rlh|cap)$/i.test(unit))
|
|
91
|
+
return "<length>";
|
|
92
|
+
if (/^(deg|rad|grad|turn)$/i.test(unit))
|
|
93
|
+
return "<angle>";
|
|
94
|
+
if (/^(s|ms)$/i.test(unit))
|
|
95
|
+
return "<time>";
|
|
96
|
+
if (/^(Hz|kHz)$/.test(unit))
|
|
97
|
+
return "<frequency>";
|
|
98
|
+
if (/^(dpi|dpcm|dppx|x)$/.test(unit))
|
|
99
|
+
return "<resolution>";
|
|
100
|
+
if (unit === "fr")
|
|
101
|
+
return "<flex>";
|
|
102
|
+
}
|
|
103
|
+
if (/^-?[\d.]+$/.test(trimmed))
|
|
104
|
+
return "<number>";
|
|
105
|
+
return "<unknown>";
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=scanDeclarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanDeclarations.js","sourceRoot":"","sources":["../../../src/css/scanDeclarations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see session/G.TOKEN_LSP.md §7.3 — PropertyNode
|
|
3
|
+
*/
|
|
4
|
+
import { parseSyntaxType } from "./parseSyntaxType.js";
|
|
5
|
+
const PROPERTY_REGEX = /@property\s+(--[\w-]+)\s*\{([^}]*)\}/g;
|
|
6
|
+
/** Scan CSS source for @property registration blocks. */
|
|
7
|
+
export function scanProperties(source, fileUri) {
|
|
8
|
+
const results = [];
|
|
9
|
+
PROPERTY_REGEX.lastIndex = 0;
|
|
10
|
+
let match = PROPERTY_REGEX.exec(source);
|
|
11
|
+
while (match !== null) {
|
|
12
|
+
const cssVar = match[1];
|
|
13
|
+
const body = match[2];
|
|
14
|
+
const upToMatch = source.substring(0, match.index);
|
|
15
|
+
const line = upToMatch.split("\n").length - 1;
|
|
16
|
+
const syntax = extractDescriptor(body, "syntax");
|
|
17
|
+
const inheritsRaw = extractDescriptor(body, "inherits");
|
|
18
|
+
const initialValue = extractDescriptor(body, "initial-value");
|
|
19
|
+
const inherits = inheritsRaw === "true";
|
|
20
|
+
const syntaxValue = syntax ? syntax.replace(/^['"]|['"]$/g, "") : "*";
|
|
21
|
+
const cssType = parseSyntaxType(syntaxValue);
|
|
22
|
+
results.push({
|
|
23
|
+
cssVar,
|
|
24
|
+
fileUri,
|
|
25
|
+
line,
|
|
26
|
+
syntax: syntaxValue,
|
|
27
|
+
inherits,
|
|
28
|
+
initialValue,
|
|
29
|
+
cssType,
|
|
30
|
+
});
|
|
31
|
+
match = PROPERTY_REGEX.exec(source);
|
|
32
|
+
}
|
|
33
|
+
return results;
|
|
34
|
+
}
|
|
35
|
+
function extractDescriptor(body, name) {
|
|
36
|
+
const regex = new RegExp(`${name}\\s*:\\s*([^;]+)`, "i");
|
|
37
|
+
const match = body.match(regex);
|
|
38
|
+
return match ? match[1].trim() : null;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=scanProperties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanProperties.js","sourceRoot":"","sources":["../../../src/css/scanProperties.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,cAAc,GAAG,uCAAuC,CAAC;AAE/D,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,OAAe;IAEf,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,WAAW,KAAK,MAAM,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtE,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC;YACX,MAAM;YACN,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,WAAW;YACnB,QAAQ;YACR,YAAY;YACZ,OAAO;SACR,CAAC,CAAC;QACH,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const CSS_PROPERTY_REGEX = /([\w-]+)\s*:/;
|
|
2
|
+
/** Scan CSS source for var() usage sites (supports multi-line var() calls). */
|
|
3
|
+
export function scanUsages(source, fileUri) {
|
|
4
|
+
const results = [];
|
|
5
|
+
const lines = source.split("\n");
|
|
6
|
+
// Build line offset table: lineOffsets[i] = character offset of line i
|
|
7
|
+
const lineOffsets = [0];
|
|
8
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
9
|
+
lineOffsets.push(lineOffsets[i] + lines[i].length + 1); // +1 for \n
|
|
10
|
+
}
|
|
11
|
+
// Binary search: character offset → line number
|
|
12
|
+
function offsetToLine(offset) {
|
|
13
|
+
let lo = 0;
|
|
14
|
+
let hi = lineOffsets.length - 1;
|
|
15
|
+
while (lo < hi) {
|
|
16
|
+
const mid = (lo + hi + 1) >> 1;
|
|
17
|
+
if (lineOffsets[mid] <= offset)
|
|
18
|
+
lo = mid;
|
|
19
|
+
else
|
|
20
|
+
hi = mid - 1;
|
|
21
|
+
}
|
|
22
|
+
return lo;
|
|
23
|
+
}
|
|
24
|
+
// Walk backwards from offset to the previous `;` or `{` to find the
|
|
25
|
+
// enclosing CSS property name. Handles multi-line declarations.
|
|
26
|
+
function findPropertyAtOffset(offset) {
|
|
27
|
+
let i = offset - 1;
|
|
28
|
+
while (i >= 0 && source[i] !== ";" && source[i] !== "{")
|
|
29
|
+
i--;
|
|
30
|
+
const segment = source.substring(i + 1, offset);
|
|
31
|
+
const match = segment.match(CSS_PROPERTY_REGEX);
|
|
32
|
+
return match ? match[1] : "unknown";
|
|
33
|
+
}
|
|
34
|
+
// Scan full source for `var( --name` patterns (handles multi-line)
|
|
35
|
+
const VAR_OPEN = /var\(\s*(--[\w-]+)/g;
|
|
36
|
+
let m = VAR_OPEN.exec(source);
|
|
37
|
+
while (m !== null) {
|
|
38
|
+
const varStart = m.index;
|
|
39
|
+
const cssVar = m[1];
|
|
40
|
+
const afterName = varStart + m[0].length;
|
|
41
|
+
// Determine fallback: look for comma after the variable name
|
|
42
|
+
let fallback = null;
|
|
43
|
+
const rest = source.substring(afterName);
|
|
44
|
+
const commaMatch = rest.match(/^\s*,\s*/);
|
|
45
|
+
if (commaMatch) {
|
|
46
|
+
const fbStart = afterName + commaMatch[0].length;
|
|
47
|
+
// Track parens to find the matching close paren for this var()
|
|
48
|
+
let depth = 1;
|
|
49
|
+
let i = fbStart;
|
|
50
|
+
while (i < source.length && depth > 0) {
|
|
51
|
+
if (source[i] === "(")
|
|
52
|
+
depth++;
|
|
53
|
+
else if (source[i] === ")")
|
|
54
|
+
depth--;
|
|
55
|
+
i++;
|
|
56
|
+
}
|
|
57
|
+
if (depth === 0) {
|
|
58
|
+
fallback = source.substring(fbStart, i - 1).trim() || null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Map character offset to line/column
|
|
62
|
+
const line = offsetToLine(varStart);
|
|
63
|
+
const column = varStart - lineOffsets[line];
|
|
64
|
+
// --name starts after "var(" and optional whitespace
|
|
65
|
+
const varNameStart = varStart + m[0].length - cssVar.length;
|
|
66
|
+
const varNameColumn = varNameStart - lineOffsets[line];
|
|
67
|
+
results.push({
|
|
68
|
+
cssVar,
|
|
69
|
+
fileUri,
|
|
70
|
+
line,
|
|
71
|
+
column,
|
|
72
|
+
varNameColumn,
|
|
73
|
+
varNameLength: cssVar.length,
|
|
74
|
+
property: findPropertyAtOffset(varStart),
|
|
75
|
+
fallback,
|
|
76
|
+
});
|
|
77
|
+
m = VAR_OPEN.exec(source);
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=scanUsages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanUsages.js","sourceRoot":"","sources":["../../../src/css/scanUsages.ts"],"names":[],"mappings":"AAKA,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,OAAe;IACxD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,uEAAuE;IACvE,MAAM,WAAW,GAAa,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY;IACtE,CAAC;IAED,gDAAgD;IAChD,SAAS,YAAY,CAAC,MAAc;QAClC,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,MAAM;gBAAE,EAAE,GAAG,GAAG,CAAC;;gBACpC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oEAAoE;IACpE,gEAAgE;IAChE,SAAS,oBAAoB,CAAC,MAAc;QAC1C,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,mEAAmE;IACnE,MAAM,QAAQ,GAAG,qBAAqB,CAAC;IACvC,IAAI,CAAC,GAA2B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAEzC,6DAA6D;QAC7D,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACjD,+DAA+D;YAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,GAAG,OAAO,CAAC;YAChB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACtC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;qBAC1B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;gBACpC,CAAC,EAAE,CAAC;YACN,CAAC;YACD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,qDAAqD;QACrD,MAAM,YAAY,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5D,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAEvD,OAAO,CAAC,IAAI,CAAC;YACX,MAAM;YACN,OAAO;YACP,IAAI;YACJ,MAAM;YACN,aAAa;YACb,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC;YACxC,QAAQ;SACT,CAAC,CAAC;QACH,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export class ReachabilityCache {
|
|
2
|
+
cache = new Map();
|
|
3
|
+
dependents = new Map();
|
|
4
|
+
reachableFiles(fileUri, graph) {
|
|
5
|
+
const cached = this.cache.get(fileUri);
|
|
6
|
+
if (cached)
|
|
7
|
+
return cached;
|
|
8
|
+
const visited = new Set();
|
|
9
|
+
const queue = [fileUri];
|
|
10
|
+
while (queue.length > 0) {
|
|
11
|
+
const current = queue.pop();
|
|
12
|
+
if (visited.has(current))
|
|
13
|
+
continue;
|
|
14
|
+
visited.add(current);
|
|
15
|
+
const imports = graph.data.imports.get(current);
|
|
16
|
+
if (imports)
|
|
17
|
+
for (const imported of imports)
|
|
18
|
+
if (!visited.has(imported))
|
|
19
|
+
queue.push(imported);
|
|
20
|
+
}
|
|
21
|
+
this.cache.set(fileUri, visited);
|
|
22
|
+
for (const reachable of visited) {
|
|
23
|
+
let deps = this.dependents.get(reachable);
|
|
24
|
+
if (!deps) {
|
|
25
|
+
deps = new Set();
|
|
26
|
+
this.dependents.set(reachable, deps);
|
|
27
|
+
}
|
|
28
|
+
deps.add(fileUri);
|
|
29
|
+
}
|
|
30
|
+
return visited;
|
|
31
|
+
}
|
|
32
|
+
reachableVars(fileUri, graph, globalStylesheets) {
|
|
33
|
+
const reachable = this.reachableFiles(fileUri, graph);
|
|
34
|
+
const vars = new Set();
|
|
35
|
+
for (const uri of reachable) {
|
|
36
|
+
const decls = graph.data.declarationsByFile.get(uri);
|
|
37
|
+
if (decls)
|
|
38
|
+
for (const d of decls)
|
|
39
|
+
vars.add(d.cssVar);
|
|
40
|
+
}
|
|
41
|
+
if (globalStylesheets) {
|
|
42
|
+
for (const uri of globalStylesheets) {
|
|
43
|
+
const decls = graph.data.declarationsByFile.get(uri);
|
|
44
|
+
if (decls)
|
|
45
|
+
for (const d of decls)
|
|
46
|
+
vars.add(d.cssVar);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return vars;
|
|
50
|
+
}
|
|
51
|
+
invalidate(fileUri) {
|
|
52
|
+
const toInvalidate = new Set();
|
|
53
|
+
const queue = [fileUri];
|
|
54
|
+
while (queue.length > 0) {
|
|
55
|
+
const current = queue.pop();
|
|
56
|
+
if (toInvalidate.has(current))
|
|
57
|
+
continue;
|
|
58
|
+
toInvalidate.add(current);
|
|
59
|
+
const deps = this.dependents.get(current);
|
|
60
|
+
if (deps)
|
|
61
|
+
for (const dep of deps)
|
|
62
|
+
if (!toInvalidate.has(dep))
|
|
63
|
+
queue.push(dep);
|
|
64
|
+
}
|
|
65
|
+
for (const uri of toInvalidate) {
|
|
66
|
+
this.cache.delete(uri);
|
|
67
|
+
this.dependents.delete(uri);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
invalidateAll() {
|
|
71
|
+
this.cache.clear();
|
|
72
|
+
this.dependents.clear();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ReachabilityCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReachabilityCache.js","sourceRoot":"","sources":["../../../src/graph/ReachabilityCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export class TokenGraph {
|
|
2
|
+
data;
|
|
3
|
+
constructor() {
|
|
4
|
+
this.data = {
|
|
5
|
+
tokens: new Map(),
|
|
6
|
+
files: new Map(),
|
|
7
|
+
declarations: new Map(),
|
|
8
|
+
properties: new Map(),
|
|
9
|
+
usages: new Map(),
|
|
10
|
+
declarationsByFile: new Map(),
|
|
11
|
+
propertiesByFile: new Map(),
|
|
12
|
+
usagesByFile: new Map(),
|
|
13
|
+
imports: new Map(),
|
|
14
|
+
importedBy: new Map(),
|
|
15
|
+
allVars: new Set(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
addToken(node) {
|
|
19
|
+
this.data.tokens.set(node.cssVar, node);
|
|
20
|
+
this.data.allVars.add(node.cssVar);
|
|
21
|
+
}
|
|
22
|
+
addFile(node) {
|
|
23
|
+
this.data.files.set(node.uri, node);
|
|
24
|
+
}
|
|
25
|
+
addDeclaration(node) {
|
|
26
|
+
const byVar = this.data.declarations.get(node.cssVar);
|
|
27
|
+
if (byVar)
|
|
28
|
+
byVar.push(node);
|
|
29
|
+
else
|
|
30
|
+
this.data.declarations.set(node.cssVar, [node]);
|
|
31
|
+
const byFile = this.data.declarationsByFile.get(node.fileUri);
|
|
32
|
+
if (byFile)
|
|
33
|
+
byFile.push(node);
|
|
34
|
+
else
|
|
35
|
+
this.data.declarationsByFile.set(node.fileUri, [node]);
|
|
36
|
+
this.data.allVars.add(node.cssVar);
|
|
37
|
+
}
|
|
38
|
+
addProperty(node) {
|
|
39
|
+
this.data.properties.set(node.cssVar, node);
|
|
40
|
+
const byFile = this.data.propertiesByFile.get(node.fileUri);
|
|
41
|
+
if (byFile)
|
|
42
|
+
byFile.push(node);
|
|
43
|
+
else
|
|
44
|
+
this.data.propertiesByFile.set(node.fileUri, [node]);
|
|
45
|
+
this.data.allVars.add(node.cssVar);
|
|
46
|
+
}
|
|
47
|
+
addUsage(node) {
|
|
48
|
+
const byVar = this.data.usages.get(node.cssVar);
|
|
49
|
+
if (byVar)
|
|
50
|
+
byVar.push(node);
|
|
51
|
+
else
|
|
52
|
+
this.data.usages.set(node.cssVar, [node]);
|
|
53
|
+
const byFile = this.data.usagesByFile.get(node.fileUri);
|
|
54
|
+
if (byFile)
|
|
55
|
+
byFile.push(node);
|
|
56
|
+
else
|
|
57
|
+
this.data.usagesByFile.set(node.fileUri, [node]);
|
|
58
|
+
}
|
|
59
|
+
addImport(importerUri, importedUri) {
|
|
60
|
+
const forward = this.data.imports.get(importerUri);
|
|
61
|
+
if (forward)
|
|
62
|
+
forward.add(importedUri);
|
|
63
|
+
else
|
|
64
|
+
this.data.imports.set(importerUri, new Set([importedUri]));
|
|
65
|
+
const reverse = this.data.importedBy.get(importedUri);
|
|
66
|
+
if (reverse)
|
|
67
|
+
reverse.add(importerUri);
|
|
68
|
+
else
|
|
69
|
+
this.data.importedBy.set(importedUri, new Set([importerUri]));
|
|
70
|
+
}
|
|
71
|
+
resolveToken(cssVar) {
|
|
72
|
+
return this.data.tokens.get(cssVar) ?? null;
|
|
73
|
+
}
|
|
74
|
+
getDeclarations(cssVar) {
|
|
75
|
+
return this.data.declarations.get(cssVar) ?? [];
|
|
76
|
+
}
|
|
77
|
+
selectorContextFor(decl) {
|
|
78
|
+
return decl.selector;
|
|
79
|
+
}
|
|
80
|
+
clearFile(fileUri) {
|
|
81
|
+
const fileDecls = this.data.declarationsByFile.get(fileUri);
|
|
82
|
+
if (fileDecls) {
|
|
83
|
+
for (const decl of fileDecls) {
|
|
84
|
+
const byVar = this.data.declarations.get(decl.cssVar);
|
|
85
|
+
if (byVar) {
|
|
86
|
+
const filtered = byVar.filter((d) => d.fileUri !== fileUri);
|
|
87
|
+
if (filtered.length > 0)
|
|
88
|
+
this.data.declarations.set(decl.cssVar, filtered);
|
|
89
|
+
else
|
|
90
|
+
this.data.declarations.delete(decl.cssVar);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
this.data.declarationsByFile.set(fileUri, []);
|
|
94
|
+
}
|
|
95
|
+
const fileProps = this.data.propertiesByFile.get(fileUri);
|
|
96
|
+
if (fileProps) {
|
|
97
|
+
for (const prop of fileProps) {
|
|
98
|
+
const existing = this.data.properties.get(prop.cssVar);
|
|
99
|
+
if (existing?.fileUri === fileUri)
|
|
100
|
+
this.data.properties.delete(prop.cssVar);
|
|
101
|
+
}
|
|
102
|
+
this.data.propertiesByFile.set(fileUri, []);
|
|
103
|
+
}
|
|
104
|
+
const fileUsages = this.data.usagesByFile.get(fileUri);
|
|
105
|
+
if (fileUsages) {
|
|
106
|
+
for (const usage of fileUsages) {
|
|
107
|
+
const byVar = this.data.usages.get(usage.cssVar);
|
|
108
|
+
if (byVar) {
|
|
109
|
+
const filtered = byVar.filter((u) => u.fileUri !== fileUri);
|
|
110
|
+
if (filtered.length > 0)
|
|
111
|
+
this.data.usages.set(usage.cssVar, filtered);
|
|
112
|
+
else
|
|
113
|
+
this.data.usages.delete(usage.cssVar);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
this.data.usagesByFile.set(fileUri, []);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=TokenGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenGraph.js","sourceRoot":"","sources":["../../../src/graph/TokenGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see session/G.TOKEN_LSP.md §16.3 — Artifact format
|
|
3
|
+
*/
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { buildSelectorContext } from "../css/buildSelectorContext.js";
|
|
6
|
+
import { parseArtifactToken } from "./parseArtifactToken.js";
|
|
7
|
+
/**
|
|
8
|
+
* Extract the token entries from a RawArtifact, handling both
|
|
9
|
+
* the flat format (keys are CSS var names) and the wrapped
|
|
10
|
+
* format (`{ tokens: { ... } }`).
|
|
11
|
+
*/
|
|
12
|
+
function extractTokens(artifact) {
|
|
13
|
+
// Wrapped format: { version, generator, tokens: { ... } }
|
|
14
|
+
const a = artifact;
|
|
15
|
+
if ("tokens" in a &&
|
|
16
|
+
"version" in a &&
|
|
17
|
+
typeof a.tokens === "object" &&
|
|
18
|
+
a.tokens !== null) {
|
|
19
|
+
return a.tokens;
|
|
20
|
+
}
|
|
21
|
+
// Flat format — the artifact itself is the token map
|
|
22
|
+
return artifact;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load all tokens from an artifact into a TokenGraph.
|
|
26
|
+
*
|
|
27
|
+
* @param artifactDir - Directory containing the artifact file.
|
|
28
|
+
* Used to resolve relative `cssOutputFile` paths to absolute URIs.
|
|
29
|
+
*/
|
|
30
|
+
export function loadArtifact(artifact, graph, packageSource = "", artifactDir = "") {
|
|
31
|
+
const tokens = extractTokens(artifact);
|
|
32
|
+
for (const [cssVar, raw] of Object.entries(tokens)) {
|
|
33
|
+
const node = parseArtifactToken(cssVar, raw, packageSource, artifactDir);
|
|
34
|
+
graph.addToken(node);
|
|
35
|
+
// Inject artifact-embedded declarations into the graph so the
|
|
36
|
+
// tooltip's declaration sites section works without CSS scanning.
|
|
37
|
+
if (raw.declarations && raw.declarations.length > 0) {
|
|
38
|
+
injectArtifactDeclarations(cssVar, raw.declarations, graph, artifactDir);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
buildAliasChains(graph);
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Alias chain construction
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
const VAR_REF_RE = /^var\((--[\w-]+)\)$/;
|
|
47
|
+
/**
|
|
48
|
+
* Post-pass: build alias chains by following `var()` references and
|
|
49
|
+
* falling back to value-matching for resolved literals.
|
|
50
|
+
*
|
|
51
|
+
* Terrazzo resolves alias values to literals in the build output, so
|
|
52
|
+
* many semantic tokens contain `oklch(...)` rather than `var(--x)`.
|
|
53
|
+
* For these, we match the resolved `valueLight` against primitive
|
|
54
|
+
* tokens to reconstruct the semantic → primitive link.
|
|
55
|
+
*
|
|
56
|
+
* After this pass, `token.aliasChain` contains an ordered list of CSS var
|
|
57
|
+
* names from the token down to the primitive value, and `token.isPrimary`
|
|
58
|
+
* is updated accordingly.
|
|
59
|
+
*/
|
|
60
|
+
function buildAliasChains(graph) {
|
|
61
|
+
// Build a reverse index: valueLight → primitive token cssVar.
|
|
62
|
+
// Used as a fallback when the semantic token's value is a resolved
|
|
63
|
+
// literal rather than a var() reference.
|
|
64
|
+
const primitiveByValue = new Map();
|
|
65
|
+
for (const t of graph.data.tokens.values()) {
|
|
66
|
+
if (t.provenance.kind !== "artifact")
|
|
67
|
+
continue;
|
|
68
|
+
if (t.tier === "primitive" && t.valueLight) {
|
|
69
|
+
// First primitive wins — multiple primitives may share a value
|
|
70
|
+
// but the first is a reasonable default.
|
|
71
|
+
if (!primitiveByValue.has(t.valueLight)) {
|
|
72
|
+
primitiveByValue.set(t.valueLight, t.cssVar);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const token of graph.data.tokens.values()) {
|
|
77
|
+
if (token.provenance.kind !== "artifact")
|
|
78
|
+
continue;
|
|
79
|
+
const chain = [];
|
|
80
|
+
const visited = new Set();
|
|
81
|
+
let current = token.valueLight;
|
|
82
|
+
while (current) {
|
|
83
|
+
const match = VAR_REF_RE.exec(current);
|
|
84
|
+
if (!match)
|
|
85
|
+
break;
|
|
86
|
+
const ref = match[1];
|
|
87
|
+
if (visited.has(ref))
|
|
88
|
+
break; // guard against cycles
|
|
89
|
+
visited.add(ref);
|
|
90
|
+
chain.push(ref);
|
|
91
|
+
const target = graph.data.tokens.get(ref);
|
|
92
|
+
if (!target)
|
|
93
|
+
break;
|
|
94
|
+
current = target.valueLight;
|
|
95
|
+
}
|
|
96
|
+
// Fallback: if no var() chain was found and this is a non-primitive
|
|
97
|
+
// token, try to match its resolved literal value to a primitive.
|
|
98
|
+
if (chain.length === 0 && token.tier !== "primitive" && token.valueLight) {
|
|
99
|
+
const primitiveVar = primitiveByValue.get(token.valueLight);
|
|
100
|
+
if (primitiveVar && primitiveVar !== token.cssVar) {
|
|
101
|
+
chain.push(primitiveVar);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (chain.length > 0) {
|
|
105
|
+
token.aliasChain = chain;
|
|
106
|
+
token.isPrimary = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Artifact declaration injection
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Convert artifact-embedded declarations into DeclarationNode objects
|
|
115
|
+
* and inject them into the graph's declaration stores.
|
|
116
|
+
*
|
|
117
|
+
* This allows the tooltip to display declaration sites (selectors like
|
|
118
|
+
* `:root`, `.warning`, `.constructive`) without requiring CSS file scanning.
|
|
119
|
+
*/
|
|
120
|
+
function injectArtifactDeclarations(cssVar, rawDecls, graph, artifactDir) {
|
|
121
|
+
for (const rawDecl of rawDecls) {
|
|
122
|
+
// Resolve the file path to an absolute file URI
|
|
123
|
+
const filePath = path.isAbsolute(rawDecl.file)
|
|
124
|
+
? rawDecl.file
|
|
125
|
+
: artifactDir
|
|
126
|
+
? path.resolve(artifactDir, rawDecl.file)
|
|
127
|
+
: rawDecl.file;
|
|
128
|
+
const fileUri = filePath.startsWith("file://")
|
|
129
|
+
? filePath
|
|
130
|
+
: `file://${filePath}`;
|
|
131
|
+
const selectorContext = buildSelectorContext(rawDecl.selector, []);
|
|
132
|
+
const declNode = {
|
|
133
|
+
cssVar,
|
|
134
|
+
fileUri,
|
|
135
|
+
line: rawDecl.line,
|
|
136
|
+
column: 0,
|
|
137
|
+
rawValue: "",
|
|
138
|
+
cssType: "<unknown>",
|
|
139
|
+
selector: selectorContext,
|
|
140
|
+
};
|
|
141
|
+
// Add to cssVar → DeclarationNode[] map
|
|
142
|
+
const existing = graph.data.declarations.get(cssVar);
|
|
143
|
+
if (existing) {
|
|
144
|
+
existing.push(declNode);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
graph.data.declarations.set(cssVar, [declNode]);
|
|
148
|
+
}
|
|
149
|
+
// Add to per-file index
|
|
150
|
+
const byFile = graph.data.declarationsByFile.get(fileUri);
|
|
151
|
+
if (byFile) {
|
|
152
|
+
byFile.push(declNode);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
graph.data.declarationsByFile.set(fileUri, [declNode]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=loadArtifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadArtifact.js","sourceRoot":"","sources":["../../../src/graph/loadArtifact.ts"],"names":[],"mappings":"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"}
|