mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 19:42:56 +01:00
Support html custom data. For microsoft/monaco-editor#2284
This commit is contained in:
parent
e3f8dd8f34
commit
c8b5d5b6d5
7 changed files with 165 additions and 161 deletions
63
monaco.d.ts
vendored
63
monaco.d.ts
vendored
|
|
@ -21,7 +21,7 @@ declare namespace monaco.languages.html {
|
||||||
readonly wrapAttributes: 'auto' | 'force' | 'force-aligned' | 'force-expand-multiline';
|
readonly wrapAttributes: 'auto' | 'force' | 'force-aligned' | 'force-expand-multiline';
|
||||||
}
|
}
|
||||||
export interface CompletionConfiguration {
|
export interface CompletionConfiguration {
|
||||||
[provider: string]: boolean;
|
[providerId: string]: boolean;
|
||||||
}
|
}
|
||||||
export interface Options {
|
export interface Options {
|
||||||
/**
|
/**
|
||||||
|
|
@ -32,6 +32,10 @@ declare namespace monaco.languages.html {
|
||||||
* A list of known schemas and/or associations of schemas to file names.
|
* A list of known schemas and/or associations of schemas to file names.
|
||||||
*/
|
*/
|
||||||
readonly suggest?: CompletionConfiguration;
|
readonly suggest?: CompletionConfiguration;
|
||||||
|
/**
|
||||||
|
* Configures the HTML data types known by the HTML langauge service.
|
||||||
|
*/
|
||||||
|
readonly data?: HTMLDataConfiguration;
|
||||||
}
|
}
|
||||||
export interface ModeConfiguration {
|
export interface ModeConfiguration {
|
||||||
/**
|
/**
|
||||||
|
|
@ -102,9 +106,9 @@ declare namespace monaco.languages.html {
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Registers a new HTML language service for the languageId.
|
* Registers a new HTML language service for the languageId.
|
||||||
* Note: 'html', 'handlebar' and 'razor' registered by default.
|
* Note: 'html', 'handlebar' and 'razor' are registered by default.
|
||||||
*
|
*
|
||||||
* Use this method only to register additional language ids with a HTML service.
|
* Use this method to register additional language ids with a HTML service.
|
||||||
* The language server has to be registered before an editor model is opened.
|
* The language server has to be registered before an editor model is opened.
|
||||||
*/
|
*/
|
||||||
export function registerHTMLLanguageService(
|
export function registerHTMLLanguageService(
|
||||||
|
|
@ -112,4 +116,57 @@ declare namespace monaco.languages.html {
|
||||||
options: Options,
|
options: Options,
|
||||||
modeConfiguration: ModeConfiguration
|
modeConfiguration: ModeConfiguration
|
||||||
): LanguageServiceRegistration;
|
): LanguageServiceRegistration;
|
||||||
|
export interface HTMLDataConfiguration {
|
||||||
|
/**
|
||||||
|
* Defines whether the standard HTML tags and attributes are shown
|
||||||
|
*/
|
||||||
|
useDefaultDataProvider?: boolean;
|
||||||
|
/**
|
||||||
|
* Provides a set of custom data providers.
|
||||||
|
*/
|
||||||
|
dataProviders?: {
|
||||||
|
[providerId: string]: HTMLDataV1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Custom HTML tags attributes and attribute values
|
||||||
|
* https://github.com/microsoft/vscode-html-languageservice/blob/main/docs/customData.md
|
||||||
|
*/
|
||||||
|
export interface HTMLDataV1 {
|
||||||
|
version: 1 | 1.1;
|
||||||
|
tags?: ITagData[];
|
||||||
|
globalAttributes?: IAttributeData[];
|
||||||
|
valueSets?: IValueSet[];
|
||||||
|
}
|
||||||
|
export interface IReference {
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
export interface ITagData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
attributes: IAttributeData[];
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IAttributeData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
valueSet?: string;
|
||||||
|
values?: IValueData[];
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IValueData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IValueSet {
|
||||||
|
name: string;
|
||||||
|
values: IValueData[];
|
||||||
|
}
|
||||||
|
export interface MarkupContent {
|
||||||
|
kind: MarkupKind;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
export type MarkupKind = 'plaintext' | 'markdown';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
package-lock.json
generated
14
package-lock.json
generated
|
|
@ -443,15 +443,23 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"vscode-html-languageservice": {
|
"vscode-html-languageservice": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-4.0.5.tgz",
|
||||||
"integrity": "sha512-CZtnuQoDwZdmPLKLMC6RqFlRTw0jvZK71l53u5ZIM3hSoVKAqW33gahBVNFpC3TPFxZSx0jqEhBTLf37RUMkWg==",
|
"integrity": "sha512-9ZKp7nfR6ObUA+K65GfgDPdOmXaPH8MOWxE2RwWF3tVnVMq2w+COKjDNHMvv+uNxtmaRT7/skls7CD/HzrW99w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"vscode-languageserver-textdocument": "^1.0.1",
|
"vscode-languageserver-textdocument": "^1.0.1",
|
||||||
"vscode-languageserver-types": "^3.16.0",
|
"vscode-languageserver-types": "^3.16.0",
|
||||||
"vscode-nls": "^5.0.0",
|
"vscode-nls": "^5.0.0",
|
||||||
"vscode-uri": "^3.0.2"
|
"vscode-uri": "^3.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"vscode-languageserver-types": {
|
||||||
|
"version": "3.16.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz",
|
||||||
|
"integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vscode-languageserver-textdocument": {
|
"vscode-languageserver-textdocument": {
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@
|
||||||
"prettier": "^2.2.1",
|
"prettier": "^2.2.1",
|
||||||
"pretty-quick": "^3.1.0",
|
"pretty-quick": "^3.1.0",
|
||||||
"requirejs": "^2.3.6",
|
"requirejs": "^2.3.6",
|
||||||
"typescript": "^4.2.3",
|
|
||||||
"terser": "^5.6.0",
|
"terser": "^5.6.0",
|
||||||
"vscode-html-languageservice": "4.0.1",
|
"typescript": "^4.2.3",
|
||||||
|
"vscode-html-languageservice": "^4.0.5",
|
||||||
"vscode-languageserver-types": "3.16.0",
|
"vscode-languageserver-types": "3.16.0",
|
||||||
"vscode-languageserver-textdocument": "^1.0.1"
|
"vscode-languageserver-textdocument": "^1.0.1"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,6 @@ export function setupMode1(defaults: LanguageServiceDefaults): void {
|
||||||
languageId,
|
languageId,
|
||||||
new languageFeatures.DocumentRangeFormattingEditProvider(worker)
|
new languageFeatures.DocumentRangeFormattingEditProvider(worker)
|
||||||
);
|
);
|
||||||
new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,9 +144,6 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (modeConfiguration.diagnostics) {
|
|
||||||
providers.push(new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProviders();
|
registerProviders();
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
import { worker } from './fillers/monaco-editor-core';
|
import { worker } from './fillers/monaco-editor-core';
|
||||||
import * as htmlService from 'vscode-html-languageservice';
|
import * as htmlService from 'vscode-html-languageservice';
|
||||||
import type { Options } from './monaco.contribution';
|
import type { Options } from './monaco.contribution';
|
||||||
|
import { IHTMLDataProvider } from 'vscode-html-languageservice';
|
||||||
|
|
||||||
export class HTMLWorker {
|
export class HTMLWorker {
|
||||||
private _ctx: worker.IWorkerContext;
|
private _ctx: worker.IWorkerContext;
|
||||||
|
|
@ -17,13 +18,19 @@ export class HTMLWorker {
|
||||||
this._ctx = ctx;
|
this._ctx = ctx;
|
||||||
this._languageSettings = createData.languageSettings;
|
this._languageSettings = createData.languageSettings;
|
||||||
this._languageId = createData.languageId;
|
this._languageId = createData.languageId;
|
||||||
this._languageService = htmlService.getLanguageService();
|
|
||||||
|
const data = this._languageSettings.data;
|
||||||
|
|
||||||
|
const useDefaultDataProvider = data?.useDefaultDataProvider;
|
||||||
|
const customDataProviders: IHTMLDataProvider[] = [];
|
||||||
|
if (data?.dataProviders) {
|
||||||
|
for (const id in data.dataProviders) {
|
||||||
|
customDataProviders.push(htmlService.newHTMLDataProvider(id, data.dataProviders[id]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._languageService = htmlService.getLanguageService({ useDefaultDataProvider, customDataProviders });
|
||||||
}
|
}
|
||||||
|
|
||||||
async doValidation(uri: string): Promise<htmlService.Diagnostic[]> {
|
|
||||||
// not yet suported
|
|
||||||
return Promise.resolve([]);
|
|
||||||
}
|
|
||||||
async doComplete(
|
async doComplete(
|
||||||
uri: string,
|
uri: string,
|
||||||
position: htmlService.Position
|
position: htmlService.Position
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { LanguageServiceDefaults } from './monaco.contribution';
|
|
||||||
import type { HTMLWorker } from './htmlWorker';
|
import type { HTMLWorker } from './htmlWorker';
|
||||||
import * as htmlService from 'vscode-html-languageservice';
|
import * as htmlService from 'vscode-html-languageservice';
|
||||||
import {
|
import {
|
||||||
|
|
@ -13,139 +12,13 @@ import {
|
||||||
Position,
|
Position,
|
||||||
Range,
|
Range,
|
||||||
CancellationToken,
|
CancellationToken,
|
||||||
IDisposable,
|
|
||||||
MarkerSeverity,
|
|
||||||
IMarkdownString
|
IMarkdownString
|
||||||
} from './fillers/monaco-editor-core';
|
} from './fillers/monaco-editor-core';
|
||||||
import { InsertReplaceEdit, TextEdit } from 'vscode-html-languageservice';
|
|
||||||
|
|
||||||
export interface WorkerAccessor {
|
export interface WorkerAccessor {
|
||||||
(...more: Uri[]): Promise<HTMLWorker>;
|
(...more: Uri[]): Promise<HTMLWorker>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- diagnostics --- ---
|
|
||||||
|
|
||||||
export class DiagnosticsAdapter {
|
|
||||||
private _disposables: IDisposable[] = [];
|
|
||||||
private _listener: { [uri: string]: IDisposable } = Object.create(null);
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private _languageId: string,
|
|
||||||
private _worker: WorkerAccessor,
|
|
||||||
defaults: LanguageServiceDefaults
|
|
||||||
) {
|
|
||||||
const onModelAdd = (model: editor.IModel): void => {
|
|
||||||
const modeId = model.getModeId();
|
|
||||||
if (modeId !== this._languageId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let handle: number;
|
|
||||||
this._listener[model.uri.toString()] = model.onDidChangeContent(() => {
|
|
||||||
clearTimeout(handle);
|
|
||||||
handle = setTimeout(() => this._doValidate(model.uri, modeId), 500);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._doValidate(model.uri, modeId);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onModelRemoved = (model: editor.IModel): void => {
|
|
||||||
editor.setModelMarkers(model, this._languageId, []);
|
|
||||||
const uriStr = model.uri.toString();
|
|
||||||
const listener = this._listener[uriStr];
|
|
||||||
if (listener) {
|
|
||||||
listener.dispose();
|
|
||||||
delete this._listener[uriStr];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this._disposables.push(editor.onDidCreateModel(onModelAdd));
|
|
||||||
this._disposables.push(
|
|
||||||
editor.onWillDisposeModel((model) => {
|
|
||||||
onModelRemoved(model);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
this._disposables.push(
|
|
||||||
editor.onDidChangeModelLanguage((event) => {
|
|
||||||
onModelRemoved(event.model);
|
|
||||||
onModelAdd(event.model);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
this._disposables.push(
|
|
||||||
defaults.onDidChange((_) => {
|
|
||||||
editor.getModels().forEach((model) => {
|
|
||||||
if (model.getModeId() === this._languageId) {
|
|
||||||
onModelRemoved(model);
|
|
||||||
onModelAdd(model);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
this._disposables.push({
|
|
||||||
dispose: () => {
|
|
||||||
for (const key in this._listener) {
|
|
||||||
this._listener[key].dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
editor.getModels().forEach(onModelAdd);
|
|
||||||
}
|
|
||||||
|
|
||||||
public dispose(): void {
|
|
||||||
this._disposables.forEach((d) => d && d.dispose());
|
|
||||||
this._disposables = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
private _doValidate(resource: Uri, languageId: string): void {
|
|
||||||
this._worker(resource)
|
|
||||||
.then((worker) => {
|
|
||||||
return worker.doValidation(resource.toString()).then((diagnostics) => {
|
|
||||||
const markers = diagnostics.map((d) => toDiagnostics(resource, d));
|
|
||||||
const model = editor.getModel(resource);
|
|
||||||
if (model && model.getModeId() === languageId) {
|
|
||||||
editor.setModelMarkers(model, languageId, markers);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.then(undefined, (err) => {
|
|
||||||
console.error(err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toSeverity(lsSeverity: number): MarkerSeverity {
|
|
||||||
switch (lsSeverity) {
|
|
||||||
case htmlService.DiagnosticSeverity.Error:
|
|
||||||
return MarkerSeverity.Error;
|
|
||||||
case htmlService.DiagnosticSeverity.Warning:
|
|
||||||
return MarkerSeverity.Warning;
|
|
||||||
case htmlService.DiagnosticSeverity.Information:
|
|
||||||
return MarkerSeverity.Info;
|
|
||||||
case htmlService.DiagnosticSeverity.Hint:
|
|
||||||
return MarkerSeverity.Hint;
|
|
||||||
default:
|
|
||||||
return MarkerSeverity.Info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toDiagnostics(resource: Uri, diag: htmlService.Diagnostic): editor.IMarkerData {
|
|
||||||
const code = typeof diag.code === 'number' ? String(diag.code) : <string>diag.code;
|
|
||||||
|
|
||||||
return {
|
|
||||||
severity: toSeverity(diag.severity),
|
|
||||||
startLineNumber: diag.range.start.line + 1,
|
|
||||||
startColumn: diag.range.start.character + 1,
|
|
||||||
endLineNumber: diag.range.end.line + 1,
|
|
||||||
endColumn: diag.range.end.character + 1,
|
|
||||||
message: diag.message,
|
|
||||||
code: code,
|
|
||||||
source: diag.source
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- completion ------
|
// --- completion ------
|
||||||
|
|
||||||
function fromPosition(position: Position): htmlService.Position {
|
function fromPosition(position: Position): htmlService.Position {
|
||||||
|
|
@ -177,10 +50,10 @@ function toRange(range: htmlService.Range): Range {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isInsertReplaceEdit(edit: TextEdit | InsertReplaceEdit): edit is InsertReplaceEdit {
|
function isInsertReplaceEdit(edit: htmlService.TextEdit | htmlService.InsertReplaceEdit): edit is htmlService.InsertReplaceEdit {
|
||||||
return (
|
return (
|
||||||
typeof (<InsertReplaceEdit>edit).insert !== 'undefined' &&
|
typeof (<htmlService.InsertReplaceEdit>edit).insert !== 'undefined' &&
|
||||||
typeof (<InsertReplaceEdit>edit).replace !== 'undefined'
|
typeof (<htmlService.InsertReplaceEdit>edit).replace !== 'undefined'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ export interface HTMLFormatConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CompletionConfiguration {
|
export interface CompletionConfiguration {
|
||||||
[provider: string]: boolean;
|
[providerId: string]: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Options {
|
export interface Options {
|
||||||
|
|
@ -34,6 +34,10 @@ export interface Options {
|
||||||
* A list of known schemas and/or associations of schemas to file names.
|
* A list of known schemas and/or associations of schemas to file names.
|
||||||
*/
|
*/
|
||||||
readonly suggest?: CompletionConfiguration;
|
readonly suggest?: CompletionConfiguration;
|
||||||
|
/**
|
||||||
|
* Configures the HTML data types known by the HTML langauge service.
|
||||||
|
*/
|
||||||
|
readonly data?: HTMLDataConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ModeConfiguration {
|
export interface ModeConfiguration {
|
||||||
|
|
@ -165,17 +169,20 @@ const formatDefaults: Required<HTMLFormatConfiguration> = {
|
||||||
|
|
||||||
const htmlOptionsDefault: Required<Options> = {
|
const htmlOptionsDefault: Required<Options> = {
|
||||||
format: formatDefaults,
|
format: formatDefaults,
|
||||||
suggest: { html5: true, angular1: true, ionic: true }
|
suggest: { html5: true, angular1: true, ionic: true },
|
||||||
|
data: { useDefaultDataProvider: true }
|
||||||
};
|
};
|
||||||
|
|
||||||
const handlebarOptionsDefault: Required<Options> = {
|
const handlebarOptionsDefault: Required<Options> = {
|
||||||
format: formatDefaults,
|
format: formatDefaults,
|
||||||
suggest: { html5: true }
|
suggest: { html5: true },
|
||||||
|
data: { useDefaultDataProvider: true }
|
||||||
};
|
};
|
||||||
|
|
||||||
const razorOptionsDefault: Required<Options> = {
|
const razorOptionsDefault: Required<Options> = {
|
||||||
format: formatDefaults,
|
format: formatDefaults,
|
||||||
suggest: { html5: true, razor: true }
|
suggest: { html5: true, razor: true },
|
||||||
|
data: { useDefaultDataProvider: true }
|
||||||
};
|
};
|
||||||
|
|
||||||
function getConfigurationDefault(languageId: string): Required<ModeConfiguration> {
|
function getConfigurationDefault(languageId: string): Required<ModeConfiguration> {
|
||||||
|
|
@ -261,3 +268,59 @@ export function registerHTMLLanguageService(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export interface HTMLDataConfiguration {
|
||||||
|
/**
|
||||||
|
* Defines whether the standard HTML tags and attributes are shown
|
||||||
|
*/
|
||||||
|
useDefaultDataProvider?: boolean;
|
||||||
|
/**
|
||||||
|
* Provides a set of custom data providers.
|
||||||
|
*/
|
||||||
|
dataProviders?: { [providerId: string]: HTMLDataV1 };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom HTML tags attributes and attribute values
|
||||||
|
* https://github.com/microsoft/vscode-html-languageservice/blob/main/docs/customData.md
|
||||||
|
*/
|
||||||
|
export interface HTMLDataV1 {
|
||||||
|
version: 1 | 1.1;
|
||||||
|
tags?: ITagData[];
|
||||||
|
globalAttributes?: IAttributeData[];
|
||||||
|
valueSets?: IValueSet[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReference {
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
export interface ITagData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
attributes: IAttributeData[];
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IAttributeData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
valueSet?: string;
|
||||||
|
values?: IValueData[];
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IValueData {
|
||||||
|
name: string;
|
||||||
|
description?: string | MarkupContent;
|
||||||
|
references?: IReference[];
|
||||||
|
}
|
||||||
|
export interface IValueSet {
|
||||||
|
name: string;
|
||||||
|
values: IValueData[];
|
||||||
|
}
|
||||||
|
export interface MarkupContent {
|
||||||
|
kind: MarkupKind;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
export declare type MarkupKind = 'plaintext' | 'markdown';
|
||||||
Loading…
Add table
Add a link
Reference in a new issue