@canonical/terrazzo-lsp
语言服务器为设计令牌工作流程提供CSS自定义属性智能. 读取 tokens.json 构建文物并提供CSS和SCSS文件的编辑功能.
特征
| 特性 | 说明 |
|---|---|
| 完成情况 | 了解背景的建议 var(--...) 参考书目,按类型可转让性、语义层次和出处排列. |
| 缓冲 | 切入元数据,包括已解析的值,颜色监视,别名链条,分级徽章,选择器上下文,以及源位置. |
| 诊断 | 类型不匹配检测,缺失/堆积倒置警告,不可取用符分析,原始用法警告等. |
| 转到定义 | 从一个跳 var() 提及象征性声明. |
| 重命名 | 重命名导入图中所有文件中的 CSS 自定义属性 . |
| 文档颜色 | 内置色表和色取器,用于表示后置色值. |
| 语义符号 | 语法突出区分出文物标志,地产,外出参考. |
| 工作空间符号 | 按名称或类型搜索整个工作空间的标志. |
编辑器设置
VS 代码 (建议):
npm install -D @canonical/design-tokens
npx @canonical/terrazzo-lsp-extension
扩展自动检测 bun 先掉头 node >= 22。 。 。 .
国 际
npx terrazzo-lsp --stdio # Start LSP server on stdio
npx terrazzo-lsp --stdio --allow-degraded # Start with reduced capabilities when config is missing
npx terrazzo-lsp check [globs] # Run diagnostics on CSS files
npx terrazzo-lsp status # Show config and artifact status
npx terrazzo-lsp inspect <var> # Inspect a CSS custom property
npx terrazzo-lsp resolve <spec> # Resolve an import specifier
npx terrazzo-lsp graph <file> # Show import graph from a file
参考文献
LSP发布14个诊断码. CSS诊断在工作空间的每个CSS/SCSS文件中运行. DTCG 诊断在装入时运行一次 tokens.json 文物和鉴定是否符合 DTCG 2025。 10 规格。 每个诊断可以配置到 "error", (中文(简体) ), "warning", (中文(简体) ), "info",或 "off" 内 terrazzo-lsp.config.json。 。 。 .
| 代码 | 配置密钥 | 默认 | 说明 |
|---|---|---|---|
css/unknown-var | unknownProperties | 关 | A 类 var() 引用不匹配任何已知的自定义属性. |
css/missing-fallback | missingFallback | 警告 | A 类 var() 提及非艺术财产无倒置价值,无 @property 登记。 跳过文物代币,因为这些代币被保证被定义. |
css/stale-fallback | staleFallback | 警告 | 倒数一 var() 不匹配该符号的当前解析值. |
css/type-mismatch | typeMismatch | 错误 | 一个符号的 DTCG 类型与 CSS 属性不相容( 例如: 颜色符号 in padding) (中文(简体) ). |
css/type-uncertain | typeUncertain | 资讯 | 键入的令牌出现在一个可以接受多个值类型的短手或上下文中. |
css/unreachable-token | unreachableToken | 警告 | 该符号的文物输出文件无法通过 @import 图表或全局样式表. |
css/primitive-token | primitiveToken | 警告 | 直接使用一种原始的代号,在代名词中应优先使用. |
css/scoped-usage | scopedDeclaration | 警告 | 在特定选定人范围下宣布的标志在更广泛的范围内使用. |
css/no-color-scheme | lightDarkNoScheme | 资讯 | A 类 light-dark() 数值没有 color-scheme 在选择者或祖先上声明. |
dtcg/broken-alias | brokenAlias | 错误 | 文物中的别名指代不存在的代号ID. |
dtcg/schema-violation | schemaViolation | 错误 | 表示符的值对其已声明的无效 $type (例如:. $type: color ),无色值. |
dtcg/circular-alias | circularAlias | 错误 | 别名链会形成一个循环——一个符号ID在解析路径中不止一次出现. |
dtcg/missing-type | inferredType | 资讯 | 一个标志没有明确的 $type 其类型模糊不清. |
dtcg/draft-syntax | draftFormat | 资讯 | 符号使用标准化前的字段语法草案(value编号 :type 无 $ 前缀). |
CSS 诊断实例
下面的例子触发一个文件中的每个 CSS 诊断:
/* Assume the following tokens exist in the artifact:
* --color-fg : oklch(17.2% 0 0) tier: semantic, type: color
* --spacing-sm : 0.5rem tier: semantic, type: dimension
* --color-palette-blue : oklch(50% 0.15 250) tier: primitive, type: color
* --button-pad : 0.75rem tier: semantic, scoped to .button
* --unreachable-token : 1rem (in a file not imported by this sheet)
*/
/* css/unknown-var — off by default, enable via config */
.unknown { margin: var(--does-not-exist); }
/* css/missing-fallback — no fallback for a non-artifact property */
.missing { padding: var(--local-pad); }
/* css/stale-fallback — resolved value is 0.5rem, not 16px */
.stale { gap: var(--spacing-sm, 16px); }
/* css/type-mismatch — colour token in a length context */
.type-err { width: var(--color-fg); }
/* css/type-uncertain — dimension in a shorthand accepting many types */
.type-warn { background: var(--spacing-sm); }
/* css/unreachable-token — output file not in @import graph */
.unreach { margin: var(--unreachable-token); }
/* css/primitive-token — prefer semantic alias */
.primitive { color: var(--color-palette-blue); }
/* css/scoped-usage — --button-pad is scoped to .button */
.card { padding: var(--button-pad); }
/* css/no-color-scheme — light-dark() without color-scheme */
.no-scheme { color: light-dark(black, white); }
DTCG 诊断例
DTCG诊断在符号定义本身的表面问题. 这些出现在 tokens.json 文物条目, 不在 CSS 文件中 :
{
// dtcg/broken-alias — alias target does not exist
"color.ghost": { "aliasChain": ["color.nonexistent"], "type": "color" },
// dtcg/schema-violation — "not-a-colour" is not a valid CSS colour
"color.invalid": { "valueLight": "not-a-colour", "type": "color" },
// dtcg/circular-alias — loop-a → loop-b → loop-a
"color.loop-a": { "aliasChain": ["color.loop-b", "color.loop-a"], "type": "color" },
// dtcg/missing-type — no $type field, type is ambiguous
"spacing.bare": { "valueLight": "4px", "type": null },
// dtcg/draft-syntax — uses pre-standard value/type without $ prefix
"color.legacy": { "type": "color", "extensions": { "com.terrazzo.draft-syntax": true } }
}
压制语法
诊断可用下列评论压制:
/* Disable all checks for a region: */
/* terrazzo-lsp-disable */
.suppressed { width: var(--color-fg); }
/* terrazzo-lsp-enable */
/* Disable a specific code for the next line: */
/* terrazzo-lsp-disable css/primitive-token */
.selective { color: var(--color-palette-blue); }
/* terrazzo-lsp-enable css/primitive-token */
配置
创建一个 terrazzo-lsp.config.json 在工作空间根中:
{
"artifacts": ["@canonical/design-tokens/dist/tokens.json"],
"globalStylesheets": [".storybook/styles.css"]
}
如果没有配置文件, 输出面板记录每个候选路径
尝试,打印一个可复制的启动配置,然后退出。 临时
降低启动、通过 --allow-degraded。 。 。 .
{ "artifacts": ["@canonical/design-tokens/dist/tokens.json"] }
完整配置参考
{
"artifacts": [],
"distDir": "dist",
"scanGlobs": ["src/**/*.css", "src/**/*.scss"],
"globalStylesheets": null,
"diagnostics": {
"unknownProperties": "off",
"missingFallback": "warning",
"staleFallback": "warning",
"typeMismatch": "error",
"typeUncertain": "info",
"unreachableToken": "warning",
"primitiveToken": "warning",
"scopedDeclaration": "warning",
"lightDarkNoScheme": "info",
"brokenAlias": "error",
"schemaViolation": "error",
"circularAlias": "error",
"inferredType": "info",
"draftFormat": "info",
"ignoreGlobs": []
},
"hover": {
"showColourSwatches": true,
"showSelectorContext": true,
"showProvenanceBadge": true,
"showAliasChain": true,
"showSourceLocation": true,
"showNavigationTier": true,
"showSpecReferences": true
},
"inlayHints": {
"enabled": false,
"showColourSwatches": true
},
"logLevel": "info"
}
| 密钥 | 说明 |
|---|---|
artifacts | 路径 tokens.json 建造文物. 光谱师解决 node_modules/。相对路径必须始于 ./ 或者说 ../。 。 。 . |
distDir | 目录包含 *.css.map 用于源代码映射的文件. |
scanGlobs | CSS/SCSS文件扫描诊断的Glob模式. |
globalStylesheets | CSS文件从每个文档中都隐含可以到达. null 指从文物中自动取出. |
diagnostics | 诊断严重性超过。 数值 : "error", (中文(简体) ), "warning", (中文(简体) ), "info", (中文(简体) ), "off"。 。 。 . |
diagnostics.ignoreGlobs | 排除诊断文件的 Glob 模式 . |
hover | 切换悬浮弹出物的单个部分. |
inlayHints | 内置提示显示( 默认损坏) . |
logLevel | 服务器日志动词 : "off", (中文(简体) ), "error", (中文(简体) ), "warn", (中文(简体) ), "info", (中文(简体) ), "debug"。 。 。 . |
VS 代码扩展设置
| 设置 | 默认 | 说明 |
|---|---|---|
terrazzo-lsp.serverPath | "" | 路径 dist/esm/cli.js。如果为空,请使用捆绑的服务器. |
terrazzo-lsp.runtime | "" | 运行时间覆盖 。 空 = 自动检测( E)bun 喜欢, node >= 22 倒计时). |
terrazzo-lsp.trace.server | "off" | "off" 只显示启动摘要. "verbose" 在输出通道中添加每个请求的痕迹 . |
发展
建筑
LSP 服务器主要分为四层:
| 层 | 路径 | 责任 |
|---|---|---|
| 议定书 | protocol/ | JSON- RPC 消息解析, 配置装入, 请求/ 响应匹配 |
| 运行时间 | runtime/ | 服务器使用寿命周期、文件管理、进口图形建筑、工人调度 |
| 图 | graph/ | 托肯图数据结构、文物装载、可达性缓存 |
| 供应商 | providers/ | 所有LSP特征:完成,徘徊,诊断,重命名等. |
诊断管道:
CSS diagnostics: orchestrateDiagnostics → per-rule check modules → makeDiagnostic
DTCG diagnostics: produceArtifactDiagnostics → per-rule check modules → makeDiagnostic
每个诊断规则都生活在自己的档案中(diagnostics/checkMissingFallback.ts, (中文(简体) ), artifactDiagnostics/checkBrokenAlias.ts(例如) 与同一地点 .tests.ts 文档。 管弦乐团绕过用法(CSS)或道具(DTCG)并代表每个检查功能.
bun run build # Compile LSP server (tsc)
bun run test # Run tests
bun run check # Lint + type check