mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 19:42:56 +01:00
Merge branch 'feature/bump-vscode-json-languageservice' of https://github.com/MakakWasTaken/monaco-editor into feature/bump-vscode-json-languageservice
This commit is contained in:
commit
95fa9e6629
21 changed files with 394 additions and 65 deletions
|
|
@ -24,6 +24,14 @@ resources:
|
|||
endpoint: Monaco
|
||||
|
||||
parameters:
|
||||
- name: publishMonacoEditorCore
|
||||
displayName: 🚀 Publish Monaco Editor Core
|
||||
type: boolean
|
||||
default: true
|
||||
- name: publishMonacoEditor
|
||||
displayName: 🚀 Publish Monaco Editor
|
||||
type: boolean
|
||||
default: true
|
||||
- name: vscodeRef
|
||||
displayName: The VS Code commit id.
|
||||
type: string
|
||||
|
|
@ -56,7 +64,7 @@ extends:
|
|||
|
||||
tag: next
|
||||
ghCreateTag: false
|
||||
publishPackage: true
|
||||
publishPackage: ${{ parameters.publishMonacoEditorCore }}
|
||||
publishRequiresApproval: false
|
||||
|
||||
- name: monaco-editor
|
||||
|
|
@ -74,5 +82,5 @@ extends:
|
|||
displayName: Setup, Build & Test monaco-editor
|
||||
|
||||
tag: next
|
||||
publishPackage: true
|
||||
publishPackage: ${{ parameters.publishMonacoEditor }}
|
||||
publishRequiresApproval: false
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ parameters:
|
|||
type: boolean
|
||||
default: false
|
||||
- name: publishMonacoEditor
|
||||
displayName: 🚀 Publish Editor Core
|
||||
displayName: 🚀 Publish Monaco Editor
|
||||
type: boolean
|
||||
default: false
|
||||
- name: publishWebpackPlugin
|
||||
|
|
|
|||
14
CHANGELOG.md
14
CHANGELOG.md
|
|
@ -1,5 +1,19 @@
|
|||
# Monaco Editor Changelog
|
||||
|
||||
## [0.45.0]
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- `wordBasedSuggestions: boolean` -> `'off' | 'currentDocument' | 'matchingDocuments' | 'allDocuments'`
|
||||
- `occurrencesHighlight: boolean` -> `'off' | 'singleFile' | 'multiFile'`
|
||||
|
||||
### Additions
|
||||
|
||||
- Many bug fixes
|
||||
- `IEditorScrollbarOptions.ignoreHorizontalScrollbarInContentHeight`
|
||||
- `IDiffEditor.goToDiff`
|
||||
- `IDiffEditor.revealFirstDiff`
|
||||
|
||||
## [0.44.0]
|
||||
|
||||
- Removes old diff editor implementation.
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ Many Monaco related objects often implement the `.dispose()` method. This method
|
|||
- [Integrate the AMD version](./docs/integrate-amd.md).
|
||||
- [Integrate the ESM version](./docs/integrate-esm.md)
|
||||
- Learn how to use the editor API and try out your own customizations in the [playground](https://microsoft.github.io/monaco-editor/playground.html).
|
||||
- Explore the [API docs](https://microsoft.github.io/monaco-editor/docs.html) or read them straight from [`monaco.d.ts`](https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/monaco.d.ts).
|
||||
- Explore the [API docs](https://microsoft.github.io/monaco-editor/docs.html) or read them straight from [`monaco.d.ts`](https://github.com/microsoft/monaco-editor/blob/gh-pages/node_modules/monaco-editor/monaco.d.ts).
|
||||
- Read [this guide](https://github.com/microsoft/monaco-editor/wiki/Accessibility-Guide-for-Integrators) to ensure the editor is accessible to all your users!
|
||||
- Create a Monarch tokenizer for a new programming language [in the Monarch playground](https://microsoft.github.io/monaco-editor/monarch.html).
|
||||
- Ask questions on [StackOverflow](https://stackoverflow.com/questions/tagged/monaco-editor)! Search open and closed issues, there are a lot of tips in there!
|
||||
|
|
|
|||
32
package-lock.json
generated
32
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "monaco-editor",
|
||||
"version": "0.44.0",
|
||||
"version": "0.45.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "monaco-editor",
|
||||
"version": "0.44.0",
|
||||
"version": "0.45.0",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
"jsdom": "^19.0.0",
|
||||
"jsonc-parser": "^3.0.0",
|
||||
"mocha": "^9.2.0",
|
||||
"monaco-editor-core": "0.44.0-rc1",
|
||||
"monaco-editor-core": "0.46.0-dev-20240109",
|
||||
"parcel": "^2.7.0",
|
||||
"pin-github-action": "^1.8.0",
|
||||
"playwright": "^1.32.2",
|
||||
|
|
@ -37,7 +37,7 @@
|
|||
"terser": "^5.14.2",
|
||||
"ts-node": "^10.6.0",
|
||||
"typescript": "^5.0.2",
|
||||
"vite": "^3.2.7",
|
||||
"vite": "^3.2.8",
|
||||
"vscode-css-languageservice": "5.4.1",
|
||||
"vscode-html-languageservice": "4.2.4",
|
||||
"vscode-json-languageservice": "5.3.7",
|
||||
|
|
@ -5343,9 +5343,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/monaco-editor-core": {
|
||||
"version": "0.44.0-rc1",
|
||||
"resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.44.0-rc1.tgz",
|
||||
"integrity": "sha512-7dSz2GkAZO4tr0RgbLvjpRKzCamKxHm9yRCaPL+XA90HKEdrKv3uX30BwYq5rji8yuS62YuvcaaPaXEfULZbaA==",
|
||||
"version": "0.46.0-dev-20240109",
|
||||
"resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.46.0-dev-20240109.tgz",
|
||||
"integrity": "sha512-HK4YgFFpBpZ0zGbNbN/Julb8AXaB8Z7wuy4bgezj4MEjMYnTB4zn/CQ+ogCy+ZblVB6pD1X4vXN2mfiTqDeOMw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/mri": {
|
||||
|
|
@ -6972,9 +6972,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "3.2.7",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz",
|
||||
"integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==",
|
||||
"version": "3.2.8",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-3.2.8.tgz",
|
||||
"integrity": "sha512-EtQU16PLIJpAZol2cTLttNP1mX6L0SyI0pgQB1VOoWeQnMSvtiwovV3D6NcjN8CZQWWyESD2v5NGnpz5RvgOZA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"esbuild": "^0.15.9",
|
||||
|
|
@ -11093,9 +11093,9 @@
|
|||
}
|
||||
},
|
||||
"monaco-editor-core": {
|
||||
"version": "0.44.0-rc1",
|
||||
"resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.44.0-rc1.tgz",
|
||||
"integrity": "sha512-7dSz2GkAZO4tr0RgbLvjpRKzCamKxHm9yRCaPL+XA90HKEdrKv3uX30BwYq5rji8yuS62YuvcaaPaXEfULZbaA==",
|
||||
"version": "0.46.0-dev-20240109",
|
||||
"resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.46.0-dev-20240109.tgz",
|
||||
"integrity": "sha512-HK4YgFFpBpZ0zGbNbN/Julb8AXaB8Z7wuy4bgezj4MEjMYnTB4zn/CQ+ogCy+ZblVB6pD1X4vXN2mfiTqDeOMw==",
|
||||
"dev": true
|
||||
},
|
||||
"mri": {
|
||||
|
|
@ -12235,9 +12235,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"vite": {
|
||||
"version": "3.2.7",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz",
|
||||
"integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==",
|
||||
"version": "3.2.8",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-3.2.8.tgz",
|
||||
"integrity": "sha512-EtQU16PLIJpAZol2cTLttNP1mX6L0SyI0pgQB1VOoWeQnMSvtiwovV3D6NcjN8CZQWWyESD2v5NGnpz5RvgOZA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"esbuild": "^0.15.9",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "monaco-editor",
|
||||
"version": "0.44.0",
|
||||
"vscodeRef": "e7e037083ff4455cf320e344325dacb480062c3c",
|
||||
"version": "0.45.0",
|
||||
"vscodeRef": "af28b32d7e553898b2a91af498b1fb666fdebe0c",
|
||||
"private": true,
|
||||
"description": "A browser based code editor",
|
||||
"homepage": "https://github.com/microsoft/monaco-editor",
|
||||
|
|
@ -52,7 +52,7 @@
|
|||
"jsdom": "^19.0.0",
|
||||
"jsonc-parser": "^3.0.0",
|
||||
"mocha": "^9.2.0",
|
||||
"monaco-editor-core": "0.44.0-rc1",
|
||||
"monaco-editor-core": "0.46.0-dev-20240109",
|
||||
"parcel": "^2.7.0",
|
||||
"pin-github-action": "^1.8.0",
|
||||
"playwright": "^1.32.2",
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"terser": "^5.14.2",
|
||||
"ts-node": "^10.6.0",
|
||||
"typescript": "^5.0.2",
|
||||
"vite": "^3.2.7",
|
||||
"vite": "^3.2.8",
|
||||
"vscode-css-languageservice": "5.4.1",
|
||||
"vscode-html-languageservice": "4.2.4",
|
||||
"vscode-json-languageservice": "5.3.7",
|
||||
|
|
|
|||
14
samples/browser-esm-vite-react/package-lock.json
generated
14
samples/browser-esm-vite-react/package-lock.json
generated
|
|
@ -13,7 +13,7 @@
|
|||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"typescript": "^5.0.2",
|
||||
"vite": "^2.9.16"
|
||||
"vite": "^2.9.17"
|
||||
}
|
||||
},
|
||||
"node_modules/@ampproject/remapping": {
|
||||
|
|
@ -1392,9 +1392,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "2.9.16",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.16.tgz",
|
||||
"integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==",
|
||||
"version": "2.9.17",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.17.tgz",
|
||||
"integrity": "sha512-XxcRzra6d7xrKXH66jZUgb+srThoPu+TLJc06GifUyKq9JmjHkc1Numc8ra0h56rju2jfVWw3B3fs5l3OFMvUw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"esbuild": "^0.14.27",
|
||||
|
|
@ -2325,9 +2325,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"vite": {
|
||||
"version": "2.9.16",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.16.tgz",
|
||||
"integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==",
|
||||
"version": "2.9.17",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.17.tgz",
|
||||
"integrity": "sha512-XxcRzra6d7xrKXH66jZUgb+srThoPu+TLJc06GifUyKq9JmjHkc1Numc8ra0h56rju2jfVWw3B3fs5l3OFMvUw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"esbuild": "^0.14.27",
|
||||
|
|
|
|||
|
|
@ -15,6 +15,6 @@
|
|||
"@types/react-dom": "^17.0.11",
|
||||
"@vitejs/plugin-react": "^1.1.4",
|
||||
"typescript": "^5.0.2",
|
||||
"vite": "^2.9.16"
|
||||
"vite": "^2.9.17"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -259,7 +259,6 @@ export const language = <languages.IMonarchLanguage>{
|
|||
'%',
|
||||
'<<',
|
||||
'>>',
|
||||
'>>>',
|
||||
'+=',
|
||||
'-=',
|
||||
'*=',
|
||||
|
|
@ -269,8 +268,7 @@ export const language = <languages.IMonarchLanguage>{
|
|||
'^=',
|
||||
'%=',
|
||||
'<<=',
|
||||
'>>=',
|
||||
'>>>='
|
||||
'>>='
|
||||
],
|
||||
|
||||
// we include these common regular expressions
|
||||
|
|
@ -312,8 +310,7 @@ export const language = <languages.IMonarchLanguage>{
|
|||
// [[ attributes ]].
|
||||
[/\[\s*\[/, { token: 'annotation', next: '@annotation' }],
|
||||
// delimiters and operators
|
||||
[/[{}()\[\]]/, '@brackets'],
|
||||
[/[<>](?!@symbols)/, '@brackets'],
|
||||
[/[{}()<>\[\]]/, '@brackets'],
|
||||
[
|
||||
/@symbols/,
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ export const language = <languages.IMonarchLanguage>{
|
|||
'raise',
|
||||
'return',
|
||||
'try',
|
||||
'type', // new in Python 3.12
|
||||
'while',
|
||||
'with',
|
||||
'yield',
|
||||
|
|
|
|||
|
|
@ -651,7 +651,7 @@ function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit | null): languages.Workspac
|
|||
//#region DocumentSymbolAdapter
|
||||
|
||||
export interface ILanguageWorkerWithDocumentSymbols {
|
||||
findDocumentSymbols(uri: string): Promise<lsTypes.SymbolInformation[]>;
|
||||
findDocumentSymbols(uri: string): Promise<lsTypes.SymbolInformation[] | lsTypes.DocumentSymbol[]>;
|
||||
}
|
||||
|
||||
export class DocumentSymbolAdapter<T extends ILanguageWorkerWithDocumentSymbols>
|
||||
|
|
@ -671,25 +671,48 @@ export class DocumentSymbolAdapter<T extends ILanguageWorkerWithDocumentSymbols>
|
|||
if (!items) {
|
||||
return;
|
||||
}
|
||||
return items.map((item) => ({
|
||||
name: item.name,
|
||||
detail: '',
|
||||
containerName: item.containerName,
|
||||
kind: toSymbolKind(item.kind),
|
||||
range: toRange(item.location.range),
|
||||
selectionRange: toRange(item.location.range),
|
||||
tags: []
|
||||
}));
|
||||
return items.map((item) => {
|
||||
if (isDocumentSymbol(item)) {
|
||||
return toDocumentSymbol(item);
|
||||
}
|
||||
return {
|
||||
name: item.name,
|
||||
detail: '',
|
||||
containerName: item.containerName,
|
||||
kind: toSymbolKind(item.kind),
|
||||
range: toRange(item.location.range),
|
||||
selectionRange: toRange(item.location.range),
|
||||
tags: []
|
||||
};
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function isDocumentSymbol(
|
||||
symbol: lsTypes.SymbolInformation | lsTypes.DocumentSymbol
|
||||
): symbol is lsTypes.DocumentSymbol {
|
||||
return 'children' in symbol;
|
||||
}
|
||||
|
||||
function toDocumentSymbol(symbol: lsTypes.DocumentSymbol): languages.DocumentSymbol {
|
||||
return {
|
||||
name: symbol.name,
|
||||
detail: symbol.detail ?? '',
|
||||
kind: toSymbolKind(symbol.kind),
|
||||
range: toRange(symbol.range),
|
||||
selectionRange: toRange(symbol.selectionRange),
|
||||
tags: symbol.tags ?? [],
|
||||
children: (symbol.children ?? []).map((item) => toDocumentSymbol(item))
|
||||
};
|
||||
}
|
||||
|
||||
function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind {
|
||||
let mKind = languages.SymbolKind;
|
||||
|
||||
switch (kind) {
|
||||
case lsTypes.SymbolKind.File:
|
||||
return mKind.Array;
|
||||
return mKind.File;
|
||||
case lsTypes.SymbolKind.Module:
|
||||
return mKind.Module;
|
||||
case lsTypes.SymbolKind.Namespace:
|
||||
|
|
|
|||
|
|
@ -10,6 +10,18 @@ import * as languageFeatures from '../common/lspLanguageFeatures';
|
|||
import { createTokenizationSupport } from './tokenization';
|
||||
import { Uri, IDisposable, languages, editor } from '../../fillers/monaco-editor-core';
|
||||
|
||||
let worker: languageFeatures.WorkerAccessor<JSONWorker>;
|
||||
|
||||
export function getWorker(): Promise<(...uris: Uri[]) => Promise<JSONWorker>> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!worker) {
|
||||
return reject('JSON not registered!');
|
||||
}
|
||||
|
||||
resolve(worker);
|
||||
});
|
||||
}
|
||||
|
||||
class JSONDiagnosticsAdapter extends languageFeatures.DiagnosticsAdapter<JSONWorker> {
|
||||
constructor(
|
||||
languageId: string,
|
||||
|
|
@ -44,9 +56,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
|
|||
const client = new WorkerManager(defaults);
|
||||
disposables.push(client);
|
||||
|
||||
const worker: languageFeatures.WorkerAccessor<JSONWorker> = (
|
||||
...uris: Uri[]
|
||||
): Promise<JSONWorker> => {
|
||||
worker = (...uris: Uri[]): Promise<JSONWorker> => {
|
||||
return client.getLanguageServiceWorker(...uris);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,10 @@ export class JSONWorker {
|
|||
return resolvePath(base, relativePath);
|
||||
}
|
||||
},
|
||||
schemaRequestService: createData.enableSchemaRequest ? defaultSchemaRequestService : undefined
|
||||
schemaRequestService: createData.enableSchemaRequest
|
||||
? defaultSchemaRequestService
|
||||
: undefined,
|
||||
clientCapabilities: jsonService.ClientCapabilities.LATEST
|
||||
});
|
||||
this._languageService.configure(this._languageSettings);
|
||||
}
|
||||
|
|
@ -82,13 +85,13 @@ export class JSONWorker {
|
|||
async resetSchema(uri: string): Promise<boolean> {
|
||||
return Promise.resolve(this._languageService.resetSchema(uri));
|
||||
}
|
||||
async findDocumentSymbols(uri: string): Promise<jsonService.SymbolInformation[]> {
|
||||
async findDocumentSymbols(uri: string): Promise<jsonService.DocumentSymbol[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let jsonDocument = this._languageService.parseJSONDocument(document);
|
||||
let symbols = this._languageService.findDocumentSymbols(document, jsonDocument);
|
||||
let symbols = this._languageService.findDocumentSymbols2(document, jsonDocument);
|
||||
return Promise.resolve(symbols);
|
||||
}
|
||||
async findDocumentColors(uri: string): Promise<jsonService.ColorInformation[]> {
|
||||
|
|
@ -141,6 +144,22 @@ export class JSONWorker {
|
|||
let ranges = this._languageService.getSelectionRanges(document, positions, jsonDocument);
|
||||
return Promise.resolve(ranges);
|
||||
}
|
||||
async parseJSONDocument(uri: string): Promise<jsonService.JSONDocument | null> {
|
||||
let document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return null;
|
||||
}
|
||||
let jsonDocument = this._languageService.parseJSONDocument(document);
|
||||
return Promise.resolve(jsonDocument);
|
||||
}
|
||||
async getMatchingSchemas(uri: string): Promise<jsonService.MatchingSchema[]> {
|
||||
let document = this._getTextDocument(uri);
|
||||
if (!document) {
|
||||
return [];
|
||||
}
|
||||
let jsonDocument = this._languageService.parseJSONDocument(document);
|
||||
return Promise.resolve(this._languageService.getMatchingSchemas(document, jsonDocument));
|
||||
}
|
||||
private _getTextDocument(uri: string): jsonService.TextDocument | null {
|
||||
let models = this._ctx.getMirrorModels();
|
||||
for (let model of models) {
|
||||
|
|
|
|||
|
|
@ -4,10 +4,147 @@
|
|||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as mode from './jsonMode';
|
||||
import { Emitter, IEvent, languages } from '../../fillers/monaco-editor-core';
|
||||
import { Emitter, IEvent, languages, Uri } from 'monaco-editor-core';
|
||||
|
||||
// ---- JSON service types ----
|
||||
export interface BaseASTNode {
|
||||
readonly type: 'object' | 'array' | 'property' | 'string' | 'number' | 'boolean' | 'null';
|
||||
readonly parent?: ASTNode;
|
||||
readonly offset: number;
|
||||
readonly length: number;
|
||||
readonly children?: ASTNode[];
|
||||
readonly value?: string | boolean | number | null;
|
||||
}
|
||||
export interface ObjectASTNode extends BaseASTNode {
|
||||
readonly type: 'object';
|
||||
readonly properties: PropertyASTNode[];
|
||||
readonly children: ASTNode[];
|
||||
}
|
||||
export interface PropertyASTNode extends BaseASTNode {
|
||||
readonly type: 'property';
|
||||
readonly keyNode: StringASTNode;
|
||||
readonly valueNode?: ASTNode;
|
||||
readonly colonOffset?: number;
|
||||
readonly children: ASTNode[];
|
||||
}
|
||||
export interface ArrayASTNode extends BaseASTNode {
|
||||
readonly type: 'array';
|
||||
readonly items: ASTNode[];
|
||||
readonly children: ASTNode[];
|
||||
}
|
||||
export interface StringASTNode extends BaseASTNode {
|
||||
readonly type: 'string';
|
||||
readonly value: string;
|
||||
}
|
||||
export interface NumberASTNode extends BaseASTNode {
|
||||
readonly type: 'number';
|
||||
readonly value: number;
|
||||
readonly isInteger: boolean;
|
||||
}
|
||||
export interface BooleanASTNode extends BaseASTNode {
|
||||
readonly type: 'boolean';
|
||||
readonly value: boolean;
|
||||
}
|
||||
export interface NullASTNode extends BaseASTNode {
|
||||
readonly type: 'null';
|
||||
readonly value: null;
|
||||
}
|
||||
|
||||
export type ASTNode =
|
||||
| ObjectASTNode
|
||||
| PropertyASTNode
|
||||
| ArrayASTNode
|
||||
| StringASTNode
|
||||
| NumberASTNode
|
||||
| BooleanASTNode
|
||||
| NullASTNode;
|
||||
|
||||
export type JSONDocument = {
|
||||
root: ASTNode | undefined;
|
||||
getNodeFromOffset(offset: number, includeRightBound?: boolean): ASTNode | undefined;
|
||||
};
|
||||
|
||||
export type JSONSchemaRef = JSONSchema | boolean;
|
||||
|
||||
export interface JSONSchemaMap {
|
||||
[name: string]: JSONSchemaRef;
|
||||
}
|
||||
|
||||
export interface JSONSchema {
|
||||
id?: string;
|
||||
$id?: string;
|
||||
$schema?: string;
|
||||
type?: string | string[];
|
||||
title?: string;
|
||||
default?: any;
|
||||
definitions?: {
|
||||
[name: string]: JSONSchema;
|
||||
};
|
||||
description?: string;
|
||||
properties?: JSONSchemaMap;
|
||||
patternProperties?: JSONSchemaMap;
|
||||
additionalProperties?: boolean | JSONSchemaRef;
|
||||
minProperties?: number;
|
||||
maxProperties?: number;
|
||||
dependencies?:
|
||||
| JSONSchemaMap
|
||||
| {
|
||||
[prop: string]: string[];
|
||||
};
|
||||
items?: JSONSchemaRef | JSONSchemaRef[];
|
||||
minItems?: number;
|
||||
maxItems?: number;
|
||||
uniqueItems?: boolean;
|
||||
additionalItems?: boolean | JSONSchemaRef;
|
||||
pattern?: string;
|
||||
minLength?: number;
|
||||
maxLength?: number;
|
||||
minimum?: number;
|
||||
maximum?: number;
|
||||
exclusiveMinimum?: boolean | number;
|
||||
exclusiveMaximum?: boolean | number;
|
||||
multipleOf?: number;
|
||||
required?: string[];
|
||||
$ref?: string;
|
||||
anyOf?: JSONSchemaRef[];
|
||||
allOf?: JSONSchemaRef[];
|
||||
oneOf?: JSONSchemaRef[];
|
||||
not?: JSONSchemaRef;
|
||||
enum?: any[];
|
||||
format?: string;
|
||||
const?: any;
|
||||
contains?: JSONSchemaRef;
|
||||
propertyNames?: JSONSchemaRef;
|
||||
examples?: any[];
|
||||
$comment?: string;
|
||||
if?: JSONSchemaRef;
|
||||
then?: JSONSchemaRef;
|
||||
else?: JSONSchemaRef;
|
||||
defaultSnippets?: {
|
||||
label?: string;
|
||||
description?: string;
|
||||
markdownDescription?: string;
|
||||
body?: any;
|
||||
bodyText?: string;
|
||||
}[];
|
||||
errorMessage?: string;
|
||||
patternErrorMessage?: string;
|
||||
deprecationMessage?: string;
|
||||
enumDescriptions?: string[];
|
||||
markdownEnumDescriptions?: string[];
|
||||
markdownDescription?: string;
|
||||
doNotSuggest?: boolean;
|
||||
suggestSortText?: string;
|
||||
allowComments?: boolean;
|
||||
allowTrailingCommas?: boolean;
|
||||
}
|
||||
|
||||
export interface MatchingSchema {
|
||||
node: ASTNode;
|
||||
schema: JSONSchema;
|
||||
}
|
||||
|
||||
// --- JSON configuration and defaults ---------
|
||||
|
||||
export interface DiagnosticsOptions {
|
||||
/**
|
||||
* If set, the validator will be enabled and perform syntax and schema based validation,
|
||||
|
|
@ -197,8 +334,16 @@ export const jsonDefaults: LanguageServiceDefaults = new LanguageServiceDefaults
|
|||
modeConfigurationDefault
|
||||
);
|
||||
|
||||
export interface IJSONWorker {
|
||||
parseJSONDocument(uri: string): Promise<JSONDocument | null>;
|
||||
getMatchingSchemas(uri: string): Promise<MatchingSchema[]>;
|
||||
}
|
||||
|
||||
export const getWorker = (): Promise<(...uris: Uri[]) => Promise<IJSONWorker>> =>
|
||||
getMode().then((mode) => mode.getWorker());
|
||||
|
||||
// export to the global based API
|
||||
(<any>languages).json = { jsonDefaults };
|
||||
(<any>languages).json = { jsonDefaults, getWorker };
|
||||
|
||||
// --- Registration to monaco editor ---
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,8 @@ async function runTests() {
|
|||
// uncomment to shortcircuit and run a specific combo
|
||||
// await runTest('webpack', 'chromium'); return;
|
||||
/** @type {PackagerKind[]} */
|
||||
const testTypes = ['amd', 'webpack', 'esbuild', 'vite', 'parcel'];
|
||||
const testTypes = ['amd', 'webpack', 'esbuild', 'vite'];
|
||||
// TODO: add parcel! (this currently fails because parcel replaces process with {})
|
||||
|
||||
for (const type of testTypes) {
|
||||
await runTest(type, 'chromium');
|
||||
|
|
|
|||
|
|
@ -26,6 +26,10 @@ global.UIEvent = tmp.window.UIEvent;
|
|||
global.window = {
|
||||
location: {},
|
||||
navigator: tmp.window.navigator,
|
||||
document: {
|
||||
body: tmp.window.document.body,
|
||||
addEventListener: (...args) => tmp.window.document.addEventListener(...args)
|
||||
},
|
||||
matchMedia: function () {
|
||||
return {
|
||||
matches: false,
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@ define('vs/nls', [], {
|
|||
localize: function () {
|
||||
return 'NO_LOCALIZATION_FOR_YOU';
|
||||
},
|
||||
localize2: function () {
|
||||
return 'NO_LOCALIZATION_FOR_YOU';
|
||||
},
|
||||
getConfiguredDefaultLocale: function () {
|
||||
return undefined;
|
||||
}
|
||||
|
|
|
|||
75
website/src/runner/debug.ts
Normal file
75
website/src/runner/debug.ts
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { loadMonaco } from "../monaco-loader";
|
||||
import { IPreviewState } from "../shared";
|
||||
import { LzmaCompressor } from "../website/utils/lzmaCompressor";
|
||||
import "./style.scss";
|
||||
|
||||
let monacoPromise: Promise<any> | undefined = undefined;
|
||||
|
||||
async function initialize(state: IPreviewState) {
|
||||
if (monacoPromise) {
|
||||
throw new Error("already initialized");
|
||||
}
|
||||
|
||||
const loadingContainerDiv = document.createElement("div");
|
||||
loadingContainerDiv.className = "loader-container";
|
||||
const loadingDiv = document.createElement("div");
|
||||
loadingDiv.className = "loader";
|
||||
loadingContainerDiv.appendChild(loadingDiv);
|
||||
document.body.appendChild(loadingContainerDiv);
|
||||
|
||||
monacoPromise = loadMonaco(state.monacoSetup);
|
||||
await monacoPromise;
|
||||
|
||||
loadingContainerDiv.remove();
|
||||
|
||||
const style = document.createElement("style");
|
||||
style.id = "custom-style";
|
||||
style.innerHTML = state.css; // CodeQL [SM03712] This is safe because the runner runs in an isolated iframe. This feature is essential to the functionality of the playground. // CodeQL [SM02688] This is safe because the runner runs in an isolated iframe. This feature is essential to the functionality of the playground.
|
||||
document.body.appendChild(style);
|
||||
|
||||
document.body.innerHTML += state.html;
|
||||
|
||||
const js = state.js;
|
||||
|
||||
try {
|
||||
eval(js); // CodeQL [SM01632] This is safe because the runner runs in an isolated iframe. This feature is essential to the functionality of the playground. // CodeQL [SM02688] This is safe because the runner runs in an isolated iframe. This feature is essential to the functionality of the playground.
|
||||
} catch (err) {
|
||||
const pre = document.createElement("pre");
|
||||
pre.appendChild(
|
||||
document.createTextNode(`${err}: ${(err as any).state}`)
|
||||
);
|
||||
document.body.insertBefore(pre, document.body.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const compressor = new LzmaCompressor<IPreviewState>();
|
||||
const stateStr = new URLSearchParams(window.location.search).get("state");
|
||||
const state = compressor.decodeData<IPreviewState>(stateStr!);
|
||||
|
||||
const previousStateStr = localStorage.getItem("stateStr");
|
||||
if (previousStateStr === stateStr) {
|
||||
initialize(state);
|
||||
} else {
|
||||
// If it does not, show the load button
|
||||
const loadButton = document.createElement("button");
|
||||
loadButton.style.position = "absolute";
|
||||
loadButton.style.top = "50%";
|
||||
loadButton.style.left = "50%";
|
||||
loadButton.style.transform = "translate(-50%, -50%)";
|
||||
loadButton.innerText = "Load";
|
||||
loadButton.style.padding = "10px 20px";
|
||||
loadButton.onclick = () => {
|
||||
loadButton.remove();
|
||||
localStorage.setItem("stateStr", stateStr!);
|
||||
initialize(state);
|
||||
};
|
||||
document.body.appendChild(loadButton);
|
||||
}
|
||||
}
|
||||
main();
|
||||
|
|
@ -43,27 +43,27 @@ monaco.languages.registerColorProvider("colorLanguage", {
|
|||
color: { red: 1, blue: 0, green: 0, alpha: 1 },
|
||||
range: {
|
||||
startLineNumber: 1,
|
||||
startColumn: 0,
|
||||
startColumn: 1,
|
||||
endLineNumber: 1,
|
||||
endColumn: 0,
|
||||
endColumn: 4,
|
||||
},
|
||||
},
|
||||
{
|
||||
color: { red: 0, blue: 1, green: 0, alpha: 1 },
|
||||
range: {
|
||||
startLineNumber: 2,
|
||||
startColumn: 0,
|
||||
startColumn: 1,
|
||||
endLineNumber: 2,
|
||||
endColumn: 0,
|
||||
endColumn: 5,
|
||||
},
|
||||
},
|
||||
{
|
||||
color: { red: 0, blue: 0, green: 1, alpha: 1 },
|
||||
range: {
|
||||
startLineNumber: 3,
|
||||
startColumn: 0,
|
||||
startColumn: 1,
|
||||
endLineNumber: 3,
|
||||
endColumn: 0,
|
||||
endColumn: 6,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -59,9 +59,38 @@ async function _getNpmVersions(): Promise<string[]> {
|
|||
]);
|
||||
|
||||
const validVersions = versions.filter((v) => !brokenVersions.has(v));
|
||||
|
||||
validVersions.sort((v1, v2) => -compareSemanticVersions(v1, v2));
|
||||
|
||||
return validVersions;
|
||||
}
|
||||
|
||||
function compareSemanticVersions(version1: string, version2: string): number {
|
||||
const v1 = version1.split(/[.]/);
|
||||
const v2 = version2.split(/[.]/);
|
||||
for (let i = 0; i < Math.min(v1.length, v2.length); i++) {
|
||||
const isNumber = /^\d+$/.test(v1[i]) && /^\d+$/.test(v2[i]);
|
||||
|
||||
if (isNumber) {
|
||||
const n1 = parseInt(v1[i]);
|
||||
const n2 = parseInt(v2[i]);
|
||||
if (n1 < n2) {
|
||||
return -1;
|
||||
}
|
||||
if (n1 > n2) {
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
const compare = v1[i].localeCompare(v2[i]);
|
||||
if (compare !== 0) {
|
||||
return compare;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return v1.length - v2.length;
|
||||
}
|
||||
|
||||
export async function getVsCodeCommitId(
|
||||
monacoEditorVersion: string
|
||||
): Promise<string | undefined> {
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ meta .[content]</pre
|
|||
<a href="#bracket"
|
||||
><code class="dt">bracket</code></a
|
||||
>
|
||||
attribute is set such that the editor is
|
||||
attribute is set such that the editor
|
||||
matches the braces (and does auto
|
||||
indentation). For example:
|
||||
<pre class="highlight">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue