VSCode 动态 JSON 模式验证

VSCode dynamic JSON schema validation

我已经为 Web 应用程序配置构建了项目。它包括生成的(来自 TypeScript)JSON 模式。为了简化 - 用户可以配置表单 - 字段顺序(字符串[]),隐藏字段(字符串[])等。JSON Schmeas 对不太熟悉配置的用户非常有帮助,并且它验证了一些错误,这些错误可能是由配置错误引起的。

但它们无法在所有情况下提供帮助 - 在那些字符串数组中 - 用户可以输入任何字符串,并且架构将有效。

我想要做的 - 是一些动态验证 - 当用户打开 [ 字段顺序时 - 他必须从字段列表中进行选择,这些字段将从 API 中获取。

某事,例如当您在 package.json 依赖项中键入 packageName: "" - 它会获得给定包的版本。

我想,我必须为此做一些 VSCode 扩展 - 但我不知道 - 从哪里开始。有人可以指出我的方向 - 例如,有人使用实时 JSON 模式验证将不胜感激。

通过挖掘 vscode 源代码找到了答案。搜索了所有包含 package.jsondependencies 的文件(正则表达式搜索 (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