VSCode 动态 JSON 模式验证
VSCode dynamic JSON schema validation
我已经为 Web 应用程序配置构建了项目。它包括生成的(来自 TypeScript)JSON 模式。为了简化 - 用户可以配置表单 - 字段顺序(字符串[]),隐藏字段(字符串[])等。JSON Schmeas 对不太熟悉配置的用户非常有帮助,并且它验证了一些错误,这些错误可能是由配置错误引起的。
但它们无法在所有情况下提供帮助 - 在那些字符串数组中 - 用户可以输入任何字符串,并且架构将有效。
我想要做的 - 是一些动态验证 - 当用户打开 [
字段顺序时 - 他必须从字段列表中进行选择,这些字段将从 API 中获取。
某事,例如当您在 package.json 依赖项中键入 packageName: ""
- 它会获得给定包的版本。
我想,我必须为此做一些 VSCode 扩展 - 但我不知道 - 从哪里开始。有人可以指出我的方向 - 例如,有人使用实时 JSON 模式验证将不胜感激。
通过挖掘 vscode 源代码找到了答案。搜索了所有包含 package.json
和 dependencies
的文件(正则表达式搜索 (package.json[\s\S\n]*dependencies)|(dependencies[\s\S\n]*package.json)
)并找到了 class PackageJSONContribution
,这正是我要找的。
然后我使用 yo code
做了一个简单的扩展(从 Your first extension 的例子开始)。
一些接口和 classes 我无法从 vscode
导入,我只是为我的扩展制作了一个本地副本。自己制作的 class FooJSONContribution
唯一不同的是 -
它的 getDocumentSelector()
功能更改为
public getDocumentSelector(): vscode.DocumentSelector {
return [{ language: 'json', scheme: '*', pattern: '**/foo.json' }];
}
调整扩展 package.json
activationEvents
并添加 "onLanguage:json"
(这可以优化)。
通过添加
调整了扩展的 activate
事件
const contribution = new FooJSONContribution(xhr, true);
const disposableCompletionItemProvider = vscode.languages.registerCompletionItemProvider(
contribution.getDocumentSelector(),
new JSONCompletionItemProvider(contribution),
'"',
':'
);
context.subscriptions.push(disposableCompletionItemProvider);
就是这样。所有 foo.json
文件现在都像 package.json
文件一样工作 -
我现在需要做的事情 - 调整 FooJSONContribution.ts
的代码以满足我自己的需要,我自己的 API 的,我自己的文件。
我在这里上传了这个例子https://github.com/leqwasd/VsCodeAsyncJsonAutocomplete
我已经为 Web 应用程序配置构建了项目。它包括生成的(来自 TypeScript)JSON 模式。为了简化 - 用户可以配置表单 - 字段顺序(字符串[]),隐藏字段(字符串[])等。JSON Schmeas 对不太熟悉配置的用户非常有帮助,并且它验证了一些错误,这些错误可能是由配置错误引起的。
但它们无法在所有情况下提供帮助 - 在那些字符串数组中 - 用户可以输入任何字符串,并且架构将有效。
我想要做的 - 是一些动态验证 - 当用户打开 [
字段顺序时 - 他必须从字段列表中进行选择,这些字段将从 API 中获取。
某事,例如当您在 package.json 依赖项中键入 packageName: ""
- 它会获得给定包的版本。
我想,我必须为此做一些 VSCode 扩展 - 但我不知道 - 从哪里开始。有人可以指出我的方向 - 例如,有人使用实时 JSON 模式验证将不胜感激。
通过挖掘 vscode 源代码找到了答案。搜索了所有包含 package.json
和 dependencies
的文件(正则表达式搜索 (package.json[\s\S\n]*dependencies)|(dependencies[\s\S\n]*package.json)
)并找到了 class PackageJSONContribution
,这正是我要找的。
然后我使用 yo code
做了一个简单的扩展(从 Your first extension 的例子开始)。
一些接口和 classes 我无法从 vscode
导入,我只是为我的扩展制作了一个本地副本。自己制作的 class FooJSONContribution
唯一不同的是 -
它的 getDocumentSelector()
功能更改为
public getDocumentSelector(): vscode.DocumentSelector {
return [{ language: 'json', scheme: '*', pattern: '**/foo.json' }];
}
调整扩展 package.json
activationEvents
并添加 "onLanguage:json"
(这可以优化)。
通过添加
调整了扩展的activate
事件
const contribution = new FooJSONContribution(xhr, true);
const disposableCompletionItemProvider = vscode.languages.registerCompletionItemProvider(
contribution.getDocumentSelector(),
new JSONCompletionItemProvider(contribution),
'"',
':'
);
context.subscriptions.push(disposableCompletionItemProvider);
就是这样。所有 foo.json
文件现在都像 package.json
文件一样工作 -
我现在需要做的事情 - 调整 FooJSONContribution.ts
的代码以满足我自己的需要,我自己的 API 的,我自己的文件。
我在这里上传了这个例子https://github.com/leqwasd/VsCodeAsyncJsonAutocomplete