Skip to content

✨ Monaco 编辑器新增 @resource 名称重复警告 - #1762

Open
cyfung1031 wants to merge 2 commits into
mainfrom
claude/monaco-duplicate-resource-warning-1e420b
Open

cyfung1031 wants to merge 2 commits into
mainfrom
claude/monaco-duplicate-resource-warning-1e420b

Conversation

@cyfung1031

@cyfung1031 cyfung1031 commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

N/A — 无关联 issue(本次改动为主动新增的编辑器诊断能力,非已报告问题的修复)。

背景

@resource 声明重复同一个资源名称时(例如复制粘贴导致两行 @resource 用了相同的名字),当前 Monaco 编辑器不会给出任何提示,用户只能在运行时才发现 GM_getResourceURL/GM_getResourceText 取到的是后一条声明覆盖前一条的结果。这属于纯编辑器诊断缺口,不影响保存或运行时逻辑本身。

本次改动

  • src/pkg/utils/monaco-editor/metadata.ts 新增 getDuplicateResourceNameMatches:只扫描第一个成对闭合的 ==UserScript== 区块(与现有 metadata 解析器语义一致),只检查 @resource 声明,复用 src/pkg/utils/resource.tsparseResourceDeclaration 解析 <name> <url>(不新增第二套解析器),按 declaration.name 做大小写敏感分组,一个名称出现多次时为每条冲突声明都返回一个匹配,返回的列范围只覆盖资源名称本身,不包含整行。
  • src/pkg/utils/monaco-editor/index.ts 注册新规则 scriptcat/duplicate-resource-name,产出 MarkerSeverity.Warning 级别的 marker,并接入 updateScriptcatMetadataMarkers()
  • src/pkg/utils/monaco-editor/langs/*.ts 全部 10 个语言文件中新增 duplicateResourceName 文案键,保持 EditorLangEntry 结构一致(pnpm run check:i18n 校验通过)。
  • 未注册 quick fix:重复的 @resource 可能是要删除一条、改名,还是保留另一个 URL,ScriptCat 无法安全替用户做决定,因此只报告警告。

实现考虑

  • 复用 getMetadataAlignmentBlocks 已解析出的 MetadataAlignmentLine(含 tag/value/valueColumn),因为合法的 @resource 声明必然带有 [ \t]+ 分隔的值,一定会出现在对齐行集合里,因此无需像 getUndefinedMetadataTagMatches 那样额外用 model.getLineContent 重新匹配裸标签(@resource 不存在“无值裸标签”的情形)。
  • 名称比较前对 line.valuetrim(),与 src/pkg/utils/script.tsparseMetadata/parseMetadataLines 对元数据值统一 .trim() 后再使用的既有语义保持一致。

已知限制

  • 不新增任何保存时校验:src/pkg/utils/script.ts 未改动,hasDuplicatedMetaline() 对其他重复元数据行的既有行为不在本次范围内。
  • 不提供 quick fix,仅提示。
  • 名称按大小写敏感比较(fooFoo 不视为冲突),与 parseResourceDeclarationname 字段的既有语义一致。

建议审查重点

  • getDuplicateResourceNameMatches 的分组与列范围计算(metadata.test.ts 中的"返回的列范围应精确覆盖资源名称"用例)。
  • 确认新 marker 未意外影响 quick fix 的注册与既有 scriptcat/undefined-metadata-tag、对齐等规则。
  • 确认保存路径(Ctrl+S)未被新规则新增任何阻断。

验证

命令与结果对应本 PR 头部提交 978dd1b(分支 claude/monaco-duplicate-resource-warning-1e420b,基于 main):

  • pnpm exec vitest run --no-coverage src/pkg/utils/monaco-editor/metadata.test.ts — 21 个用例全部通过,覆盖任务要求的完整矩阵:不同 URL 重复、相同 URL 重复、不同名称不告警、foo/Foo 大小写不冲突、格式不合法声明被忽略、@require 等其他标签下同值被忽略、区块外的 @resource 被忽略、第二个 UserScript 区块被忽略、精确列范围。
  • pnpm run typecheck — 通过,无错误。
  • pnpm run lint(prettier --check、tsc --noEmit、check:i18ncheck:issue-templates、eslint)— 全部通过。
  • 手动验证(docs/verification.md 流程):pnpm run build 构建扩展后,用 e2e/session.mjs + e2e/drive.mjs 驱动真实 options 页脚本编辑器,输入两条同名不同 URL 的 @resource Resource_vConsoleVueDevtools 声明。截图与鼠标悬停确认:两行都出现橙色警告波浪线且范围只覆盖资源名称本身;悬停提示文案为 @resource name "Resource_vConsoleVueDevtools" is declared more than once. ScriptCat(scriptcat/duplicate-resource-name),且显示 "No quick fixes available"(未注册 quick fix);随后 Ctrl+S 保存后经 chrome.storage.local 确认脚本已正常保存/安装,保存流程未被新规则阻断。

🤖 Generated with Claude Code

Add a diagnostic-only ScriptCat Monaco marker (scriptcat/duplicate-resource-name)
that flags @resource declarations sharing the same case-sensitive name within
the first valid ==UserScript== block, reusing parseResourceDeclaration for
parsing. No quick fix is offered and no save-time validation is added, since
ScriptCat cannot infer whether the user intends to rename, delete, or keep a
different URL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cyfung1031 cyfung1031 changed the title Warn on duplicate @resource names in Monaco editor ✨ Monaco 编辑器新增 @resource 名称重复警告 Sep 21, 2026
@cyfung1031

Copy link
Copy Markdown
Collaborator Author
Screenshot 2026-09-21 at 18 01 54

…te-resource-warning-1e420b

# Conflicts:
#	src/pkg/utils/monaco-editor/index.ts
#	src/pkg/utils/monaco-editor/langs/de-DE.ts
#	src/pkg/utils/monaco-editor/langs/en-US.ts
#	src/pkg/utils/monaco-editor/langs/ja-JP.ts
#	src/pkg/utils/monaco-editor/langs/ko-KR.ts
#	src/pkg/utils/monaco-editor/langs/pt-BR.ts
#	src/pkg/utils/monaco-editor/langs/ru-RU.ts
#	src/pkg/utils/monaco-editor/langs/tr-TR.ts
#	src/pkg/utils/monaco-editor/langs/vi-VN.ts
#	src/pkg/utils/monaco-editor/langs/zh-CN.ts
#	src/pkg/utils/monaco-editor/langs/zh-TW.ts
#	src/pkg/utils/monaco-editor/metadata.ts
@cyfung1031 cyfung1031 added the P2 🐌 非重要也不紧急的内容 label Sep 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 🐌 非重要也不紧急的内容

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant