diff --git a/package-lock.json b/package-lock.json index ef623bd5..9e1ec33a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,31 @@ { "name": "monaco-json", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "dev": true + }, "jsonc-parser": { - "version": "2.0.0-next.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.0.0-next.1.tgz", - "integrity": "sha512-7BRgtZ0wPCWOUz8oD1m0qo9KKWq8LF1R6Ko38ofbTG3PLa84ucKLIkC/8PLvjFBInfqRo+ah5aazBLscsLTd2Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.0.1.tgz", + "integrity": "sha512-9w/QyN9qF1dTlffzkmyITa6qAYt6sDArlVZqaP+CXnRh66V73wImQGG8GIBkuas0XLAxddWEWYQ8PPFoK5KNQA==", "dev": true }, "monaco-editor-core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.12.0.tgz", - "integrity": "sha512-wOoEVAoZtrarDRcQC32Fp0ocacpQd6/Nb0FmUZOHeD3swZuPZhDLOxTyoNLjKq3d+h/6g+IARBLnDaLT5OQD4g==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.14.1.tgz", + "integrity": "sha512-bWJuPbDEftxaN2bG+JZ29+aJhg0rmq+y6VmCUqPZpmw8bSevoYjuTcdLkt9BbNaGnwosAVy+vSktXgs/JW7OvQ==", "dev": true }, "monaco-languages": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/monaco-languages/-/monaco-languages-1.0.0.tgz", - "integrity": "sha512-OKwVZJejt07Wpyy60vptcPueIZRBFOiJT8gfp60O861Pu0HHxhLfNBqeJ5zJ9x4PIbhd5Fq7+tSU+NbnOAfEcA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/monaco-languages/-/monaco-languages-1.4.0.tgz", + "integrity": "sha512-39MZMAEKToktfSpOS0Soj05IvkT5vbebL9AIBGPn8fGi8WgJOcfS3YLiMu07gZKViR7CFZ4RyQJKJHglx0fPdA==", "dev": true }, "monaco-plugin-helpers": { @@ -28,7 +34,15 @@ "integrity": "sha512-7kUx8dtd5qVNVgUARBRhnM8oftPglYwlINfigC4yGUiuzqtIN22u1tly8umiOCIPR0eFiBLjt6aN23oZh2QJgg==", "dev": true, "requires": { - "typescript": "2.7.2" + "typescript": "2.9.2" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } } }, "requirejs": { @@ -37,64 +51,56 @@ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", + "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", "dev": true }, "uglify-js": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.14.tgz", - "integrity": "sha512-OY8VPQU25q09gQRbC+Ekk3xgEVBmYFEfVcgS47ksjTiNht2LmLlUkWutyi38ZsDSToJHwbe76kDGwmD226Z2Fg==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz", + "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==", "dev": true, "requires": { - "commander": "2.14.1", + "commander": "2.16.0", "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "vscode-json-languageservice": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.1.0.tgz", - "integrity": "sha512-ybmyI9sn3nGJS8LgLR+YPk6M0LH8A7hp14ZGYDeNgrNVqkbZRN6K+JthHkhCR0MmA0RluwDtOJlAeqRFUEiK2A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.1.4.tgz", + "integrity": "sha512-RiLEhif0MzwIscoxKZ0lL1fvKUbB1DLJcPXGCm/K9WouLbEQu1OuIBsMPp3NnK+ZOW7uMXZgGfpMtWow7YgOiQ==", "dev": true, "requires": { - "jsonc-parser": "2.0.0-next.1", - "vscode-languageserver-types": "3.6.1", - "vscode-nls": "3.2.2", - "vscode-uri": "1.0.3" + "jsonc-parser": "2.0.1", + "vscode-languageserver-types": "3.10.0", + "vscode-nls": "3.2.4", + "vscode-uri": "1.0.5" } }, "vscode-languageserver-types": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz", - "integrity": "sha512-Npi3i8gUWcx5h8z5idNqPKBLJmZothXK2FSG4csEmxAR7avb8W6l9Ny+VW9yCUB3bOdD7iXfah8IO0AS1jwQmQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz", + "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==", "dev": true }, "vscode-nls": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.2.tgz", - "integrity": "sha512-/Ur1+tgazwd51+ncRyoy0UIu4dvMdVXS9XMUULQlZIBoNGEwOhwEx9x+hHWoUjldMrOQ32t2CGKo0u6D4R6/hg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.4.tgz", + "integrity": "sha512-FTjdqa4jDDoBjJqr36O8lmmZf/55kQ2w4ZY/+GL6K92fq765BqO3aYw21atnXUno/P04V5DWagNl4ybDIndJsw==", "dev": true }, "vscode-uri": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz", - "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.5.tgz", + "integrity": "sha1-O4majvccN/MFTXm9vdoxx7828g0=", "dev": true } } diff --git a/package.json b/package.json index bd584d46..090d8a12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "monaco-json", - "version": "2.1.2", + "version": "2.2.0", "description": "JSON plugin for the Monaco Editor", "scripts": { "compile": "mrmdir ./out && tsc -p ./src/tsconfig.json && tsc -p ./src/tsconfig.esm.json", @@ -19,14 +19,14 @@ "url": "https://github.com/Microsoft/monaco-json/issues" }, "devDependencies": { - "jsonc-parser": "2.0.0-next.1", - "monaco-editor-core": "0.12.0", - "monaco-languages": "1.0.0", + "jsonc-parser": "^2.0.1", + "monaco-editor-core": "0.14.1", + "monaco-languages": "1.4.0", "monaco-plugin-helpers": "^1.0.2", "requirejs": "^2.3.5", - "typescript": "2.7.2", - "uglify-js": "^3.3.14", - "vscode-json-languageservice": "3.1.0", - "vscode-languageserver-types": "3.6.1" + "typescript": "3.0.1", + "uglify-js": "^3.4.7", + "vscode-json-languageservice": "3.1.4", + "vscode-languageserver-types": "3.10.0" } } diff --git a/src/jsonMode.ts b/src/jsonMode.ts index 39d8f7df..3b1b7cf2 100644 --- a/src/jsonMode.ts +++ b/src/jsonMode.ts @@ -36,6 +36,7 @@ export function setupMode(defaults: LanguageServiceDefaultsImpl): void { disposables.push(monaco.languages.setTokensProvider(languageId, createTokenizationSupport(true))); disposables.push(monaco.languages.setLanguageConfiguration(languageId, richEditConfiguration)); disposables.push(monaco.languages.registerColorProvider(languageId, new languageFeatures.DocumentColorAdapter(worker))); + disposables.push(monaco.languages.registerFoldingRangeProvider(languageId, new languageFeatures.FoldingRangeAdapter(worker))); } diff --git a/src/jsonWorker.ts b/src/jsonWorker.ts index a717e6e4..d272169f 100644 --- a/src/jsonWorker.ts +++ b/src/jsonWorker.ts @@ -96,18 +96,23 @@ export class JSONWorker { let symbols = this._languageService.findDocumentSymbols(document, jsonDocument); return Promise.as(symbols); } - findDocumentColors(uri: string): Thenable { + findDocumentColors(uri: string): Thenable { let document = this._getTextDocument(uri); let stylesheet = this._languageService.parseJSONDocument(document); let colorSymbols = this._languageService.findDocumentColors(document, stylesheet); return Promise.as(colorSymbols); } - getColorPresentations(uri: string, color: jsonService.Color, range: ls.Range): Thenable { + getColorPresentations(uri: string, color: ls.Color, range: ls.Range): Thenable { let document = this._getTextDocument(uri); let stylesheet = this._languageService.parseJSONDocument(document); let colorPresentations = this._languageService.getColorPresentations(document, stylesheet, color, range); return Promise.as(colorPresentations); } + provideFoldingRanges(uri: string, context?: { rangeLimit?: number; }): Thenable { + let document = this._getTextDocument(uri); + let ranges = this._languageService.getFoldingRanges(document, context); + return Promise.as(ranges); + } private _getTextDocument(uri: string): ls.TextDocument { let models = this._ctx.getMirrorModels(); for (let model of models) { diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 78f434ab..7781ac16 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -423,7 +423,7 @@ export class DocumentSymbolAdapter implements monaco.languages.DocumentSymbolPro constructor(private _worker: WorkerAccessor) { } - public provideDocumentSymbols(model: monaco.editor.IReadOnlyModel, token: CancellationToken): Thenable { + public provideDocumentSymbols(model: monaco.editor.IReadOnlyModel, token: CancellationToken): Thenable { const resource = model.uri; return wireCancellationToken(token, this._worker(resource).then(worker => worker.findDocumentSymbols(resource.toString())).then(items => { @@ -432,9 +432,11 @@ export class DocumentSymbolAdapter implements monaco.languages.DocumentSymbolPro } return items.map(item => ({ name: item.name, + detail: '', containerName: item.containerName, kind: toSymbolKind(item.kind), - location: toLocation(item.location) + range: toRange(item.location.range), + selectionRange: toRange(item.location.range) })); })); } @@ -528,6 +530,42 @@ export class DocumentColorAdapter implements monaco.languages.DocumentColorProvi } } +export class FoldingRangeAdapter implements monaco.languages.FoldingRangeProvider { + + constructor(private _worker: WorkerAccessor) { + } + + public provideFoldingRanges(model: monaco.editor.IReadOnlyModel, context: monaco.languages.FoldingContext, token: CancellationToken): Thenable { + const resource = model.uri; + + return wireCancellationToken(token, this._worker(resource).then(worker => worker.provideFoldingRanges(resource.toString(), context)).then(ranges => { + if (!ranges) { + return; + } + return ranges.map(range => { + let result: monaco.languages.FoldingRange = { + start: range.startLine + 1, + end: range.endLine + 1 + }; + if (typeof range.kind !== 'undefined') { + result.kind = toFoldingRangeKind(range.kind); + } + return result; + }); + })); + } + +} + +function toFoldingRangeKind(kind: ls.FoldingRangeKind): monaco.languages.FoldingRangeKind { + switch (kind) { + case ls.FoldingRangeKind.Comment: return monaco.languages.FoldingRangeKind.Comment; + case ls.FoldingRangeKind.Imports: return monaco.languages.FoldingRangeKind.Imports; + case ls.FoldingRangeKind.Region: return monaco.languages.FoldingRangeKind.Region; + } + return void 0; +} + /** * Hook a cancellation token to a WinJS Promise */ diff --git a/test/index.html b/test/index.html index f6eba4c6..1a644ec6 100644 --- a/test/index.html +++ b/test/index.html @@ -12,12 +12,21 @@