From a0db6427174c820cdbbb8aaf6e35d40dc043e6d4 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Thu, 25 Oct 2018 09:57:08 +0800 Subject: [PATCH] chore: align with pengx17/master branch --- .npmignore | 5 +- README.md | 22 +- gulpfile.js | 190 -- package.json | 44 +- scripts/bundle.js | 82 + scripts/release.js | 28 + src/languageFeatures.ts | 79 +- .../jsonContributions.ts | 1 + .../jsonSchema.ts | 2 + .../parser/jsonParser.ts | 15 +- .../parser/yamlParser.ts | 50 +- .../services/documentSymbols.ts | 10 +- .../services/jsonSchemaService.ts | 36 +- .../services/yamlCompletion.ts | 381 ++- src/languageservice/services/yamlFormatter.ts | 47 + .../services/yamlHover.ts | 23 +- .../services/yamlValidation.ts | 60 +- src/languageservice/utils/arrUtils.ts | 75 + .../utils/documentPositionCalculator.ts | 5 + .../utils/errorHandler.ts | 5 +- .../utils/objects.ts | 0 .../utils/strings.ts | 14 +- .../utils/uri.ts | 0 src/languageservice/yamlLanguageService.ts | 155 ++ src/monaco.contribution.ts | 5 +- src/monaco.d.ts | 43 +- src/tsconfig.esm.json | 16 + src/tsconfig.json | 16 +- src/workerManager.ts | 4 +- src/yaml-ast-parser/type.ts | 2 +- src/yaml-languageservice/LICENSE | 21 - .../services/yamlFormatter.ts | 26 - src/yaml-languageservice/utils/arrUtils.ts | 72 - .../yamlLanguageService.ts | 173 -- src/yaml.worker.ts | 15 + src/yamlMode.ts | 142 +- src/yamlWorker.ts | 360 +-- test-demo.png | Bin 0 -> 157932 bytes test/index.html | 141 +- yarn.lock | 2060 +---------------- 40 files changed, 1499 insertions(+), 2926 deletions(-) delete mode 100644 gulpfile.js create mode 100644 scripts/bundle.js create mode 100644 scripts/release.js rename src/{yaml-languageservice => languageservice}/jsonContributions.ts (96%) rename src/{yaml-languageservice => languageservice}/jsonSchema.ts (89%) rename src/{yaml-languageservice => languageservice}/parser/jsonParser.ts (99%) rename src/{yaml-languageservice => languageservice}/parser/yamlParser.ts (78%) rename src/{yaml-languageservice => languageservice}/services/documentSymbols.ts (95%) rename src/{yaml-languageservice => languageservice}/services/jsonSchemaService.ts (90%) rename src/{yaml-languageservice => languageservice}/services/yamlCompletion.ts (50%) create mode 100644 src/languageservice/services/yamlFormatter.ts rename src/{yaml-languageservice => languageservice}/services/yamlHover.ts (85%) rename src/{yaml-languageservice => languageservice}/services/yamlValidation.ts (57%) create mode 100644 src/languageservice/utils/arrUtils.ts rename src/{yaml-languageservice => languageservice}/utils/documentPositionCalculator.ts (79%) rename src/{yaml-languageservice => languageservice}/utils/errorHandler.ts (92%) rename src/{yaml-languageservice => languageservice}/utils/objects.ts (100%) rename src/{yaml-languageservice => languageservice}/utils/strings.ts (64%) rename src/{yaml-languageservice => languageservice}/utils/uri.ts (100%) create mode 100644 src/languageservice/yamlLanguageService.ts create mode 100644 src/tsconfig.esm.json delete mode 100644 src/yaml-languageservice/LICENSE delete mode 100644 src/yaml-languageservice/services/yamlFormatter.ts delete mode 100644 src/yaml-languageservice/utils/arrUtils.ts delete mode 100644 src/yaml-languageservice/yamlLanguageService.ts create mode 100644 src/yaml.worker.ts create mode 100644 test-demo.png diff --git a/.npmignore b/.npmignore index c16d57c..cf5b4b4 100644 --- a/.npmignore +++ b/.npmignore @@ -1,8 +1,7 @@ /.vscode/ -/lib/ /out/ +/scripts/ /src/ /test/ -/release/dev/ -/gulpfile.js +/.gitignore /.npmignore diff --git a/README.md b/README.md index e445c60..d68e8d7 100644 --- a/README.md +++ b/README.md @@ -7,21 +7,37 @@ YAML language plugin for the Monaco Editor. It provides the following features w * Formatting * Document Symbols * Syntax highlighting +* Automatically load remote schema files -Schemas can be provided by configuration. See [here](https://github.com/Microsoft/monaco-json/blob/master/src/monaco.d.ts) +Schemas can also be provided by configuration. See [here](https://github.com/Microsoft/monaco-json/blob/master/src/monaco.d.ts) for the API that the JSON plugin offers to configure the JSON language support. ## Installing -TODO: Document exact distribution method +`yarn add monaco-yaml` +See `test/index.html` as an example. Currently only load with vs loader is supported. (AMD) +Load with ESM is added, but not yet tested. ## Development * `git clone https://github.com/kpdecker/monaco-yaml` * `cd monaco-yaml` * `yarn` -* `npm run watch` +* `yarn watch` * open `$/monaco-yaml/test/index.html` in your favorite browser. +A running example: +![demo-image](test-demo.png) + +## Credits +- https://github.com/redhat-developer/yaml-language-server + +### Maintain +Manually clone dependencies list below and update the project files accordingly: +- `src/languageservice`: https://github.com/redhat-developer/yaml-language-server + - `cp yaml-language-server/src/languageservice monaco-yaml/src/languageservice` + - Modify the import paths, go to the test page and see if it still works +- `src/yaml-ast-parser`: https://github.com/mulesoft-labs/yaml-ast-parser/tree/master/src + ## License [MIT](https://github.com/kpdecker/monaco-yaml/blob/master/LICENSE.md) diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 8c84b3e..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,190 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -var gulp = require('gulp'); -var tsb = require('gulp-tsb'); -var assign = require('object-assign'); -var fs = require('fs'); -var path = require('path'); -var merge = require('merge-stream'); -var rjs = require('gulp-requirejs'); -var uglify = require('gulp-uglify'); -var rimraf = require('rimraf'); -var es = require('event-stream'); - -gulp.task('clean-release', function (cb) { rimraf('release', { maxBusyTries: 1 }, cb); }); -gulp.task('release', ['clean-release', 'compile'], function () { - - var sha1 = getGitVersion(__dirname); - var semver = require('./package.json').version; - var headerVersion = semver + '(' + sha1 + ')'; - - var BUNDLED_FILE_HEADER = [ - '/*!-----------------------------------------------------------------------------', - ' * Copyright (c) Microsoft Corporation. All rights reserved.', - ' * monaco-json version: ' + headerVersion, - ' * Released under the MIT license', - ' * https://github.com/Microsoft/monaco-json/blob/master/LICENSE.md', - ' *-----------------------------------------------------------------------------*/', - '' - ].join('\n'); - - function getDependencyLocation(name, libLocation, container) { - var location = __dirname + '/node_modules/' + name + '/' + libLocation; - if (!fs.existsSync(location)) { - var oldLocation = __dirname + '/node_modules/' + container + '/node_modules/' + name + '/' + libLocation; - if (!fs.existsSync(oldLocation)) { - console.error('Unable to find ' + name + ' node module at ' + location + ' or ' + oldLocation); - return; - } - return oldLocation; - } - return location; - } - - var jsoncLocation = getDependencyLocation('jsonc-parser', 'lib', 'vscode-json-languageservice'); - var uriLocation = getDependencyLocation('vscode-uri', 'lib', 'vscode-json-languageservice'); - - function bundleOne(moduleId, exclude) { - - - return rjs({ - baseUrl: '/out/', - name: 'vs/languages/yaml/' + moduleId, - out: moduleId + '.js', - exclude: exclude, - paths: { - 'vs/languages/yaml': __dirname + '/out' - }, - packages: [{ - name: 'yaml-ast-parser', - location: __dirname + '/out/yaml-ast-parser', - main: 'index' - }, { - name: 'js-yaml', - location: __dirname + '/node_modules/js-yaml/dist', - main: 'js-yaml' - }, { - name: 'vscode-json-languageservice', - location: __dirname + '/node_modules/vscode-json-languageservice', - main: 'jsonLanguageService' - }, { - name: 'vscode-languageserver-types', - location: __dirname + '/node_modules/vscode-languageserver-types/lib', - main: 'main' - }, { - name: 'vscode-uri', - location: uriLocation, - main: 'index' - }, { - name: 'jsonc-parser', - location: jsoncLocation, - main: 'main' - }, { - name: 'vscode-uri', - location: uriLocation, - main: 'index' - }, { - name: 'vscode-nls', - location: __dirname + '/out/fillers', - main: 'vscode-nls' - }, { - name: 'os', - location: __dirname + '/out/fillers', - main: 'os' - }] - }) - } - - return merge( - merge( - bundleOne('monaco.contribution', ['vs/languages/yaml/yamlMode']), - bundleOne('yamlMode'), - bundleOne('yamlWorker') - ) - .pipe(es.through(function (data) { - data.contents = new Buffer( - BUNDLED_FILE_HEADER - + data.contents.toString() - ); - this.emit('data', data); - })) - .pipe(gulp.dest('./release/dev')) - .pipe(uglify({ - preserveComments: 'some' - })) - .pipe(gulp.dest('./release/min')), - gulp.src('src/monaco.d.ts').pipe(gulp.dest('./release/min')) - ); -}); - - -var compilation = tsb.create(assign({ verbose: true }, require('./src/tsconfig.json').compilerOptions)); - -var tsSources = 'src/**/*.ts'; - -function compileTask() { - return merge( - gulp.src(tsSources).pipe(compilation()) - ) - .pipe(gulp.dest('out')); -} - -gulp.task('clean-out', function (cb) { rimraf('out', { maxBusyTries: 1 }, cb); }); -gulp.task('compile', ['clean-out'], compileTask); -gulp.task('compile-without-clean', compileTask); -gulp.task('watch', ['compile'], function () { - gulp.watch(tsSources, ['compile-without-clean']); -}); - -function getGitVersion(repo) { - var git = path.join(repo, '.git'); - var headPath = path.join(git, 'HEAD'); - var head; - - try { - head = fs.readFileSync(headPath, 'utf8').trim(); - } catch (e) { - return void 0; - } - - if (/^[0-9a-f]{40}$/i.test(head)) { - return head; - } - - var refMatch = /^ref: (.*)$/.exec(head); - - if (!refMatch) { - return void 0; - } - - var ref = refMatch[1]; - var refPath = path.join(git, ref); - - try { - return fs.readFileSync(refPath, 'utf8').trim(); - } catch (e) { - // noop - } - - var packedRefsPath = path.join(git, 'packed-refs'); - var refsRaw; - - try { - refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim(); - } catch (e) { - return void 0; - } - - var refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm; - var refsMatch; - var refs = {}; - - while (refsMatch = refsRegex.exec(refsRaw)) { - refs[refsMatch[2]] = refsMatch[1]; - } - - return refs[ref]; -} \ No newline at end of file diff --git a/package.json b/package.json index 365b1ed..dd53d85 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,39 @@ { "name": "monaco-yaml", - "version": "1.0.0", + "version": "1.1.0", "description": "YAML plugin for the Monaco Editor", "scripts": { - "compile": "gulp compile", - "watch": "gulp watch", - "prepublish": "gulp release" + "compile": "rimraf ./out && tsc -p ./src/tsconfig.json && tsc -p ./src/tsconfig.esm.json", + "watch": "tsc -p ./src --watch", + "prepublish": "rimraf ./release && yarn run compile && node ./scripts/release.js && node ./scripts/bundle && mcopy ./src/monaco.d.ts ./release/monaco.d.ts" }, "author": "Kevin Decker (http://incaseofstairs.com)", + "maintainers": [ + "kpdecker", + "pengx17" + ], "license": "MIT", "repository": { "type": "git", "url": "https://github.com/kpdecker/monaco-yaml" }, + "bugs": { + "url": "https://github.com/kpdecker/monaco-yaml/issues" + }, "devDependencies": { - "event-stream": "^3.3.2", - "gulp": "^3.9.1", - "gulp-requirejs": "^0.1.3", - "gulp-tsb": "^2.0.0", - "gulp-uglify": "^1.5.3", - "js-yaml": "^3.10.0", - "jsonc-parser": "1.0.0", - "merge-stream": "^1.0.0", - "monaco-editor-core": "^0.10.1", - "monaco-languages": "^0.9.0", - "object-assign": "^4.1.0", - "rimraf": "^2.5.2", - "typescript": "^2.7.1", - "vscode-json-languageservice": "^3.0.5", - "vscode-languageserver-types": "^3.5.0" + "@types/chai": "^4.1.4", + "@types/mocha": "^5.2.5", + "@types/node": "^10.9.3", + "js-yaml": "^3.12.0", + "jsonc-parser": "^2.0.2", + "monaco-editor-core": "0.14.6", + "monaco-languages": "1.5.1", + "monaco-plugin-helpers": "^1.0.2", + "requirejs": "^2.3.5", + "rimraf": "^2.6.2", + "typescript": "^3.0.3", + "uglify-es": "^3.3.9", + "vscode-json-languageservice": "^3.1.6", + "vscode-languageserver-types": "3.12.0" } } diff --git a/scripts/bundle.js b/scripts/bundle.js new file mode 100644 index 0000000..51ff186 --- /dev/null +++ b/scripts/bundle.js @@ -0,0 +1,82 @@ +const requirejs = require('requirejs'); +const path = require('path'); +const fs = require('fs'); +const UglifyES = require("uglify-es"); +const helpers = require('monaco-plugin-helpers'); + +const REPO_ROOT = path.resolve(__dirname, '..'); + +const sha1 = helpers.getGitVersion(REPO_ROOT); +const semver = require('../package.json').version; +const headerVersion = semver + '(' + sha1 + ')'; + +const BUNDLED_FILE_HEADER = [ + '/*!-----------------------------------------------------------------------------', + ' * Copyright (c) Microsoft Corporation. All rights reserved.', + ' * monaco-yaml version: ' + headerVersion, + ' * Released under the MIT license', + ' * https://github.com/kpdecker/monaco-yaml/blob/master/LICENSE.md', + ' *-----------------------------------------------------------------------------*/', + '' +].join('\n'); + +bundleOne('monaco.contribution'); +bundleOne('yamlMode'); +bundleOne('yamlWorker'); + +function bundleOne(moduleId, exclude) { + requirejs.optimize({ + baseUrl: 'out/amd/', + name: 'vs/language/yaml/' + moduleId, + out: 'release/dev/' + moduleId + '.js', + exclude: exclude, + paths: { + 'vs/language/yaml': REPO_ROOT + '/out/amd' + }, + optimize: 'none', + packages: [ + { + name: 'js-yaml', + location: path.join(REPO_ROOT, 'node_modules/js-yaml/dist'), + main: 'js-yaml' + }, + + // The following is required by YAML language service + { + name: 'jsonc-parser', + location: path.join(REPO_ROOT, 'node_modules/jsonc-parser/lib/umd'), + main: 'main' + }, { + name: 'vscode-json-languageservice/lib', + location: path.join(REPO_ROOT, 'node_modules/vscode-json-languageservice/lib/umd') + }, + + { + name: 'vscode-languageserver-types', + location: path.join(REPO_ROOT, 'node_modules/vscode-languageserver-types/lib/umd'), + main: 'main' + }, { + name: 'vscode-uri', + location: path.join(REPO_ROOT, 'node_modules/vscode-uri/lib/umd'), + main: 'index' + }, { + name: 'vscode-nls', + location: path.join(REPO_ROOT, '/out/amd/fillers'), + main: 'vscode-nls' + }] + }, function () { + const devFilePath = path.join(REPO_ROOT, 'release/dev/' + moduleId + '.js'); + const minFilePath = path.join(REPO_ROOT, 'release/min/' + moduleId + '.js'); + const fileContents = fs.readFileSync(devFilePath).toString(); + console.log(); + console.log(`Minifying ${devFilePath}...`); + const result = UglifyES.minify(fileContents, { + output: { + comments: 'some' + } + }); + console.log(`Done.`); + try { fs.mkdirSync(path.join(REPO_ROOT, 'release/min')) } catch (err) { } + fs.writeFileSync(minFilePath, BUNDLED_FILE_HEADER + result.code); + }) +} diff --git a/scripts/release.js b/scripts/release.js new file mode 100644 index 0000000..593140c --- /dev/null +++ b/scripts/release.js @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const path = require("path"); +const helpers = require("monaco-plugin-helpers"); + +const REPO_ROOT = path.join(__dirname, "../"); + +helpers.packageESM({ + repoRoot: REPO_ROOT, + esmSource: "out/esm", + esmDestination: "release/esm", + entryPoints: ["monaco.contribution.js", "yamlMode.js", "yaml.worker.js"], + resolveAlias: { + "vscode-nls": path.join(REPO_ROOT, "out/esm/fillers/vscode-nls.js") + }, + resolveSkip: ["monaco-editor-core", "js-yaml"], + destinationFolderSimplification: { + node_modules: "_deps", + "jsonc-parser/lib/esm": "jsonc-parser", + "vscode-languageserver-types/lib/esm": "vscode-languageserver-types", + "vscode-uri/lib/esm": "vscode-uri", + "vscode-json-languageservice/lib/esm": "vscode-json-languageservice", + // "js-yaml/dist": "js-yaml" + } +}); diff --git a/src/languageFeatures.ts b/src/languageFeatures.ts index 97afcbd..b518e9e 100644 --- a/src/languageFeatures.ts +++ b/src/languageFeatures.ts @@ -12,6 +12,7 @@ import * as ls from 'vscode-languageserver-types'; import Uri = monaco.Uri; import Position = monaco.Position; import Range = monaco.Range; +import IRange = monaco.IRange; import Thenable = monaco.Thenable; import Promise = monaco.Promise; import CancellationToken = monaco.CancellationToken; @@ -24,19 +25,19 @@ export interface WorkerAccessor { // --- diagnostics --- --- -export class DiagnostcsAdapter { +export class DiagnosticsAdapter { private _disposables: IDisposable[] = []; private _listener: { [uri: string]: IDisposable } = Object.create(null); - constructor(private _languageId: string, private _worker: WorkerAccessor) { + constructor(private _languageId: string, private _worker: WorkerAccessor, defaults: LanguageServiceDefaultsImpl) { const onModelAdd = (model: monaco.editor.IModel): void => { let modeId = model.getModeId(); if (modeId !== this._languageId) { return; } - let handle: number; + let handle: NodeJS.Timer; this._listener[model.uri.toString()] = model.onDidChangeContent(() => { clearTimeout(handle); handle = setTimeout(() => this._doValidate(model.uri, modeId), 500); @@ -66,8 +67,18 @@ export class DiagnostcsAdapter { this._resetSchema(event.model.uri); })); + this._disposables.push(defaults.onDidChange(_ => { + monaco.editor.getModels().forEach(model => { + if (model.getModeId() === this._languageId) { + onModelRemoved(model); + onModelAdd(model); + } + }); + })); + this._disposables.push({ dispose: () => { + monaco.editor.getModels().forEach(onModelRemoved); for (let key in this._listener) { this._listener[key].dispose(); } @@ -104,14 +115,14 @@ export class DiagnostcsAdapter { } -function toSeverity(lsSeverity: number): monaco.Severity { +function toSeverity(lsSeverity: number): monaco.MarkerSeverity { switch (lsSeverity) { - case ls.DiagnosticSeverity.Error: return monaco.Severity.Error; - case ls.DiagnosticSeverity.Warning: return monaco.Severity.Warning; - case ls.DiagnosticSeverity.Information: - case ls.DiagnosticSeverity.Hint: + case ls.DiagnosticSeverity.Error: return monaco.MarkerSeverity.Error; + case ls.DiagnosticSeverity.Warning: return monaco.MarkerSeverity.Warning; + case ls.DiagnosticSeverity.Information: return monaco.MarkerSeverity.Info; + case ls.DiagnosticSeverity.Hint: return monaco.MarkerSeverity.Hint; default: - return monaco.Severity.Info; + return monaco.MarkerSeverity.Info; } } @@ -139,13 +150,12 @@ function fromPosition(position: Position): ls.Position { return { character: position.column - 1, line: position.lineNumber - 1 }; } -function fromRange(range: Range): ls.Range { +function fromRange(range: IRange): ls.Range { if (!range) { return void 0; } - return { start: fromPosition(range.getStartPosition()), end: fromPosition(range.getEndPosition()) }; + return { start: { line: range.startLineNumber - 1, character: range.startColumn - 1 }, end: { line: range.endLineNumber - 1, character: range.endColumn - 1 } }; } - function toRange(range: ls.Range): Range { if (!range) { return void 0; @@ -233,12 +243,19 @@ function toCompletionItem(entry: ls.CompletionItem): DataCompletionItem { }; } +function fromMarkdownString(entry: string | monaco.IMarkdownString): ls.MarkupContent { + return { + kind: (typeof entry === 'string' ? ls.MarkupKind.PlainText : ls.MarkupKind.Markdown), + value: (typeof entry === 'string' ? entry : entry.value) + } +} + function fromCompletionItem(entry: DataCompletionItem): ls.CompletionItem { let item: ls.CompletionItem = { label: entry.label, sortText: entry.sortText, filterText: entry.filterText, - documentation: entry.documentation, + documentation: fromMarkdownString(entry.documentation), detail: entry.detail, kind: fromCompletionItemKind(entry.kind), data: entry.data @@ -303,14 +320,38 @@ export class CompletionAdapter implements monaco.languages.CompletionItemProvide } } -function toMarkedStringArray(contents: ls.MarkedString | ls.MarkedString[]): monaco.MarkedString[] { +function isMarkupContent(thing: any): thing is ls.MarkupContent { + return thing && typeof thing === 'object' && typeof (thing).kind === 'string'; +} + +function toMarkdownString(entry: ls.MarkupContent | ls.MarkedString): monaco.IMarkdownString { + if (typeof entry === 'string') { + return { + value: entry + }; + } + if (isMarkupContent(entry)) { + if (entry.kind === 'plaintext') { + return { + value: entry.value.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&') + }; + } + return { + value: entry.value + }; + } + + return { value: '```' + entry.language + '\n' + entry.value + '\n```\n' }; +} + +function toMarkedStringArray(contents: ls.MarkupContent | ls.MarkedString | ls.MarkedString[]): monaco.IMarkdownString[] { if (!contents) { return void 0; } if (Array.isArray(contents)) { - return (contents); + return contents.map(toMarkdownString); } - return [contents]; + return [toMarkdownString(contents)]; } @@ -382,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 => { @@ -391,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) })); })); } diff --git a/src/yaml-languageservice/jsonContributions.ts b/src/languageservice/jsonContributions.ts similarity index 96% rename from src/yaml-languageservice/jsonContributions.ts rename to src/languageservice/jsonContributions.ts index 081d242..f11bcd0 100644 --- a/src/yaml-languageservice/jsonContributions.ts +++ b/src/languageservice/jsonContributions.ts @@ -1,4 +1,5 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ diff --git a/src/yaml-languageservice/jsonSchema.ts b/src/languageservice/jsonSchema.ts similarity index 89% rename from src/yaml-languageservice/jsonSchema.ts rename to src/languageservice/jsonSchema.ts index 9f9f19f..0052129 100644 --- a/src/yaml-languageservice/jsonSchema.ts +++ b/src/languageservice/jsonSchema.ts @@ -1,4 +1,5 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ @@ -43,6 +44,7 @@ export interface JSONSchema { patternErrorMessage?: string; // VSCode extension deprecationMessage?: string; // VSCode extension enumDescriptions?: string[]; // VSCode extension + schemaSequence?: JSONSchema[]; // extension for multiple schemas related to multiple documents in single yaml file "x-kubernetes-group-version-kind"?; //Kubernetes extension } diff --git a/src/yaml-languageservice/parser/jsonParser.ts b/src/languageservice/parser/jsonParser.ts similarity index 99% rename from src/yaml-languageservice/parser/jsonParser.ts rename to src/languageservice/parser/jsonParser.ts index a18140b..584341e 100644 --- a/src/yaml-languageservice/parser/jsonParser.ts +++ b/src/languageservice/parser/jsonParser.ts @@ -1,10 +1,11 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Json = require('jsonc-parser'); +import * as Json from 'jsonc-parser'; import { JSONSchema } from '../jsonSchema'; import * as objects from '../utils/objects'; @@ -118,7 +119,7 @@ export class ASTNode { collector.push(item); } } - return node; + return node; }; let foundNode = findNode(this); return collector.length; @@ -157,7 +158,7 @@ export class ASTNode { if (!matchingSchemas.include(this)) { return; } - + if (Array.isArray(schema.type)) { if ((schema.type).indexOf(this.type) === -1) { validationResult.problems.push({ @@ -539,7 +540,7 @@ export class StringASTNode extends ASTNode { }); } } - + } } @@ -649,7 +650,7 @@ export class ObjectASTNode extends ASTNode { let seenKeys: { [key: string]: ASTNode } = Object.create(null); let unprocessedProperties: string[] = []; this.properties.forEach((node) => { - + let key = node.key.value; //Replace the merge key with the actual values of what the node value points to in seen keys @@ -682,7 +683,7 @@ export class ObjectASTNode extends ASTNode { seenKeys[key] = node.value; unprocessedProperties.push(key); } - + }); if (Array.isArray(schema.required)) { @@ -770,7 +771,7 @@ export class ObjectASTNode extends ASTNode { } }); } - } + } if (schema.maxProperties) { if (this.properties.length > schema.maxProperties) { diff --git a/src/yaml-languageservice/parser/yamlParser.ts b/src/languageservice/parser/yamlParser.ts similarity index 78% rename from src/yaml-languageservice/parser/yamlParser.ts rename to src/languageservice/parser/yamlParser.ts index c1752f2..15af94f 100644 --- a/src/yaml-languageservice/parser/yamlParser.ts +++ b/src/languageservice/parser/yamlParser.ts @@ -1,6 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Adam Voss. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { JSONSchema } from 'vscode-json-languageservice/lib/jsonSchema'; import { ASTNode, ErrorCode, BooleanASTNode, NullASTNode, ArrayASTNode, NumberASTNode, ObjectASTNode, PropertyASTNode, StringASTNode, IApplicableSchema, JSONDocument } from './jsonParser'; import * as nls from 'vscode-nls'; @@ -8,8 +12,10 @@ const localize = nls.loadMessageBundle(); import * as Yaml from '../../yaml-ast-parser/index' import { Kind } from '../../yaml-ast-parser/index' +import { Schema, Type } from 'js-yaml'; import { getLineStartPositions, getPosition } from '../utils/documentPositionCalculator' +import YAMLException from '../../yaml-ast-parser/exception'; export class SingleYAMLDocument extends JSONDocument { private lines; @@ -153,7 +159,7 @@ function recursivelyBuildAst(parent: ASTNode, node: Yaml.YAMLNode): ASTNode { switch (type) { case Yaml.ScalarType.null: { - return new NullASTNode(parent, name, instance.startPosition, instance.endPosition); + return new StringASTNode(parent, name, false, instance.startPosition, instance.endPosition); } case Yaml.ScalarType.bool: { return new BooleanASTNode(parent, name, Yaml.parseYamlBoolean(value), node.startPosition, node.endPosition) @@ -193,11 +199,11 @@ function recursivelyBuildAst(parent: ASTNode, node: Yaml.YAMLNode): ASTNode { } } -function convertError(e: Yaml.YAMLException) { +function convertError(e: YAMLException) { return { message: `${e.reason}`, location: { start: e.mark.position, end: e.mark.position + e.mark.column, code: ErrorCode.Undefined } } } -function createJSONDocument(yamlDoc: Yaml.YAMLNode, startPositions: number[]) { +function createJSONDocument(yamlDoc: Yaml.YAMLNode, startPositions: number[], text: string) { let _doc = new SingleYAMLDocument(startPositions); _doc.root = recursivelyBuildAst(null, yamlDoc) @@ -208,8 +214,18 @@ function createJSONDocument(yamlDoc: Yaml.YAMLNode, startPositions: number[]) { const duplicateKeyReason = 'duplicate key' + //Patch ontop of yaml-ast-parser to disable duplicate key message on merge key + let isDuplicateAndNotMergeKey = function (error: YAMLException, yamlText: string) { + let errorConverted = convertError(error); + let errorStart = errorConverted.location.start; + let errorEnd = errorConverted.location.end; + if (error.reason === duplicateKeyReason && yamlText.substring(errorStart, errorEnd).startsWith("<<")) { + return false; + } + return true; + }; const errors = yamlDoc.errors.filter(e => e.reason !== duplicateKeyReason && !e.isWarning).map(e => convertError(e)) - const warnings = yamlDoc.errors.filter(e => e.reason === duplicateKeyReason || e.isWarning).map(e => convertError(e)) + const warnings = yamlDoc.errors.filter(e => (e.reason === duplicateKeyReason && isDuplicateAndNotMergeKey(e, text)) || e.isWarning).map(e => convertError(e)) errors.forEach(e => _doc.errors.push(e)); warnings.forEach(e => _doc.warnings.push(e)); @@ -230,13 +246,29 @@ export class YAMLDocument { } -export function parse(text: string): YAMLDocument { +export function parse(text: string, customTags = []): YAMLDocument { const startPositions = getLineStartPositions(text) // This is documented to return a YAMLNode even though the // typing only returns a YAMLDocument const yamlDocs = [] - Yaml.loadAll(text, doc => yamlDocs.push(doc), {}) - return new YAMLDocument(yamlDocs.map(doc => createJSONDocument(doc, startPositions))); -} \ No newline at end of file + let schemaWithAdditionalTags = Schema.create(customTags.map((tag) => { + const typeInfo = tag.split(' '); + return new Type(typeInfo[0], { kind: typeInfo[1] || 'scalar' }); + })); + + //We need compiledTypeMap to be available from schemaWithAdditionalTags before we add the new custom properties + customTags.map((tag) => { + const typeInfo = tag.split(' '); + schemaWithAdditionalTags.compiledTypeMap[typeInfo[0]] = new Type(typeInfo[0], { kind: typeInfo[1] || 'scalar' }); + }); + + let additionalOptions: Yaml.LoadOptions = { + schema: schemaWithAdditionalTags + } + + Yaml.loadAll(text, doc => yamlDocs.push(doc), additionalOptions); + + return new YAMLDocument(yamlDocs.map(doc => createJSONDocument(doc, startPositions, text))); +} diff --git a/src/yaml-languageservice/services/documentSymbols.ts b/src/languageservice/services/documentSymbols.ts similarity index 95% rename from src/yaml-languageservice/services/documentSymbols.ts rename to src/languageservice/services/documentSymbols.ts index da0de0c..92a03e7 100644 --- a/src/yaml-languageservice/services/documentSymbols.ts +++ b/src/languageservice/services/documentSymbols.ts @@ -1,11 +1,11 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Parser = require('../parser/jsonParser'); -import Strings = require('../utils/strings'); +import * as Parser from '../parser/jsonParser'; import { SymbolInformation, SymbolKind, TextDocument, Range, Location } from 'vscode-languageserver-types'; import { Thenable } from "../yamlLanguageService"; @@ -18,7 +18,7 @@ export class YAMLDocumentSymbols { if(!doc || doc["documents"].length === 0){ return null; } - + let collectOutlineEntries = (result: SymbolInformation[], node: Parser.ASTNode, containerName: string): SymbolInformation[] => { if (node.type === 'array') { (node).items.forEach((node: Parser.ASTNode) => { @@ -26,7 +26,7 @@ export class YAMLDocumentSymbols { }); } else if (node.type === 'object') { let objectNode = node; - + objectNode.properties.forEach((property: Parser.PropertyASTNode) => { let location = Location.create(document.uri, Range.create(document.positionAt(property.start), document.positionAt(property.end))); let valueNode = property.value; @@ -48,7 +48,7 @@ export class YAMLDocumentSymbols { results = results.concat(result); } } - + return results; } diff --git a/src/yaml-languageservice/services/jsonSchemaService.ts b/src/languageservice/services/jsonSchemaService.ts similarity index 90% rename from src/yaml-languageservice/services/jsonSchemaService.ts rename to src/languageservice/services/jsonSchemaService.ts index 9d998c3..761dc10 100644 --- a/src/yaml-languageservice/services/jsonSchemaService.ts +++ b/src/languageservice/services/jsonSchemaService.ts @@ -1,20 +1,42 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Json = require('jsonc-parser'); +import * as Json from 'jsonc-parser'; import {JSONSchema, JSONSchemaMap} from '../jsonSchema'; import URI from 'vscode-uri'; -import Strings = require('../utils/strings'); -import Parser = require('../parser/jsonParser'); +import * as Strings from '../utils/strings'; import {SchemaRequestService, WorkspaceContextService, PromiseConstructor, Thenable} from '../yamlLanguageService'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); +/** + * getParseErrorMessage has been removed from jsonc-parser since 1.0.0 + * + * see https://github.com/Microsoft/node-jsonc-parser/blob/42ec16f9c91582d4267a0c48199cdac283c90fc9/CHANGELOG.md + * 1.0.0 + * remove nls dependency (remove getParseErrorMessage) + */ +function getParseErrorMessage(errorCode: Json.ParseErrorCode): string { + switch (errorCode) { + case Json.ParseErrorCode.InvalidSymbol: return localize('error.invalidSymbol', 'Invalid symbol'); + case Json.ParseErrorCode.InvalidNumberFormat: return localize('error.invalidNumberFormat', 'Invalid number format'); + case Json.ParseErrorCode.PropertyNameExpected: return localize('error.propertyNameExpected', 'Property name expected'); + case Json.ParseErrorCode.ValueExpected: return localize('error.valueExpected', 'Value expected'); + case Json.ParseErrorCode.ColonExpected: return localize('error.colonExpected', 'Colon expected'); + case Json.ParseErrorCode.CommaExpected: return localize('error.commaExpected', 'Comma expected'); + case Json.ParseErrorCode.CloseBraceExpected: return localize('error.closeBraceExpected', 'Closing brace expected'); + case Json.ParseErrorCode.CloseBracketExpected: return localize('error.closeBracketExpected', 'Closing bracket expected'); + case Json.ParseErrorCode.EndOfFileExpected: return localize('error.endOfFileExpected', 'End of file expected'); + default: return ''; + } +} + export interface IJSONSchemaService { /** @@ -82,7 +104,7 @@ export class FilePatternAssociation { constructor(pattern: string) { this.combinedSchemaId = 'schemaservice://combinedSchema/' + encodeURIComponent(pattern); try { - this.patternRegExp = new RegExp(Strings.convertSimple2RegExpPattern(pattern) + '$'); + this.patternRegExp = Strings.convertSimple2RegExp(pattern); } catch (e) { // invalid pattern this.patternRegExp = null; @@ -368,7 +390,7 @@ export class JSONSchemaService implements IJSONSchemaService { let schemaContent: JSONSchema = {}; let jsonErrors = []; schemaContent = Json.parse(content, jsonErrors); - let errors = jsonErrors.length ? [localize('json.schema.invalidFormat', 'Unable to parse content from \'{0}\': {1}.', toDisplayString(url), Json.getParseErrorMessage(jsonErrors[0]))] : []; + let errors = jsonErrors.length ? [localize('json.schema.invalidFormat', 'Unable to parse content from \'{0}\': {1}.', toDisplayString(url), getParseErrorMessage(jsonErrors[0]))] : []; return new UnresolvedSchema(schemaContent, errors); }, (error: any) => { @@ -479,7 +501,7 @@ export class JSONSchemaService implements IJSONSchemaService { } collectEntries(next.items, next.additionalProperties, next.not); collectMapEntries(next.definitions, next.properties, next.patternProperties, next.dependencies); - collectArrayEntries(next.anyOf, next.allOf, next.oneOf, next.items); + collectArrayEntries(next.anyOf, next.allOf, next.oneOf, next.items, next.schemaSequence); } return this.promise.all(openPromises); }; @@ -496,7 +518,7 @@ export class JSONSchemaService implements IJSONSchemaService { return entry.getCombinedSchema(this).getResolvedSchema(); } } - return null; + return this.promise.resolve(null); }; if (this.customSchemaProvider) { return this.customSchemaProvider(resource).then(schemaUri => { diff --git a/src/yaml-languageservice/services/yamlCompletion.ts b/src/languageservice/services/yamlCompletion.ts similarity index 50% rename from src/yaml-languageservice/services/yamlCompletion.ts rename to src/languageservice/services/yamlCompletion.ts index 96f5e6a..72457b6 100644 --- a/src/yaml-languageservice/services/yamlCompletion.ts +++ b/src/languageservice/services/yamlCompletion.ts @@ -6,14 +6,14 @@ 'use strict'; -import Parser = require('../parser/jsonParser'); -import Json = require('jsonc-parser'); -import SchemaService = require('./jsonSchemaService'); +import * as Parser from '../parser/jsonParser'; +import * as Json from 'jsonc-parser'; +import * as SchemaService from './jsonSchemaService'; import { JSONSchema } from '../jsonSchema'; import { JSONWorkerContribution, CompletionsCollector } from '../jsonContributions'; import { PromiseConstructor, Thenable } from 'vscode-json-languageservice'; -import { CompletionItem, CompletionItemKind, CompletionList, TextDocument, Position, Range, TextEdit } from 'vscode-languageserver-types'; +import { CompletionItem, CompletionItemKind, CompletionList, TextDocument, Position, Range, TextEdit, InsertTextFormat } from 'vscode-languageserver-types'; import * as nls from 'vscode-nls'; import { matchOffsetToDocument } from '../utils/arrUtils'; @@ -25,11 +25,17 @@ export class YAMLCompletion { private schemaService: SchemaService.IJSONSchemaService; private contributions: JSONWorkerContribution[]; private promise: PromiseConstructor; + private customTags: Array; constructor(schemaService: SchemaService.IJSONSchemaService, contributions: JSONWorkerContribution[] = [], promiseConstructor?: PromiseConstructor) { this.schemaService = schemaService; this.contributions = contributions; this.promise = promiseConstructor || Promise; + this.customTags = []; + } + + public configure(customTags: Array){ + this.customTags = customTags; } public doResolve(item: CompletionItem): Thenable { @@ -44,7 +50,7 @@ export class YAMLCompletion { return this.promise.resolve(item); } - public doComplete(document: TextDocument, position: Position, doc: Parser.JSONDocument): Thenable { + public doComplete(document: TextDocument, position: Position, doc): Thenable { let result: CompletionList = { items: [], @@ -52,14 +58,15 @@ export class YAMLCompletion { }; let offset = document.offsetAt(position); - if (document.getText()[offset] === ":") { - return null; + if(document.getText()[offset] === ":"){ + return Promise.resolve(result); } let currentDoc = matchOffsetToDocument(offset, doc); - if (currentDoc === null) { - return null; + if(currentDoc === null){ + return Promise.resolve(result); } + const currentDocIndex = doc.documents.indexOf(currentDoc); let node = currentDoc.getNodeFromOffsetEndInclusive(offset); if (this.isInComment(document, node ? node.start : 0, offset)) { return Promise.resolve(result); @@ -67,12 +74,32 @@ export class YAMLCompletion { let currentWord = this.getCurrentWord(document, offset); + let overwriteRange = null; + if(node && node.type === 'null'){ + let nodeStartPos = document.positionAt(node.start); + nodeStartPos.character += 1; + let nodeEndPos = document.positionAt(node.end); + nodeEndPos.character += 1; + overwriteRange = Range.create(nodeStartPos, nodeEndPos); + }else if (node && (node.type === 'string' || node.type === 'number' || node.type === 'boolean')) { + overwriteRange = Range.create(document.positionAt(node.start), document.positionAt(node.end)); + } else { + let overwriteStart = offset - currentWord.length; + if (overwriteStart > 0 && document.getText()[overwriteStart - 1] === '"') { + overwriteStart--; + } + overwriteRange = Range.create(document.positionAt(overwriteStart), position); + } + let proposed: { [key: string]: CompletionItem } = {}; let collector: CompletionsCollector = { add: (suggestion: CompletionItem) => { let existing = proposed[suggestion.label]; if (!existing) { proposed[suggestion.label] = suggestion; + if (overwriteRange) { + suggestion.textEdit = TextEdit.replace(overwriteRange, suggestion.insertText); + } result.items.push(suggestion); } else if (!existing.documentation) { existing.documentation = suggestion.documentation; @@ -94,8 +121,12 @@ export class YAMLCompletion { return this.schemaService.getSchemaForResource(document.uri).then((schema) => { - if (!schema) { - return null; + if(!schema){ + return Promise.resolve(result); + } + let newSchema = schema; + if (schema.schema && schema.schema.schemaSequence && schema.schema.schemaSequence[currentDocIndex]) { + newSchema = new SchemaService.ResolvedSchema(schema.schema.schemaSequence[currentDocIndex]); } let collectionPromises: Thenable[] = []; @@ -129,9 +160,14 @@ export class YAMLCompletion { } }); - if (schema) { + let separatorAfter = ''; + if (addValue) { + separatorAfter = this.evaluateSeparatorAfter(document, document.offsetAt(overwriteRange.end)); + } + + if (newSchema) { // property proposals with schema - this.getPropertyCompletions(schema, currentDoc, node, addValue, collector); + this.getPropertyCompletions(newSchema, currentDoc, node, addValue, collector, separatorAfter); } let location = node.getPath(); @@ -144,19 +180,24 @@ export class YAMLCompletion { if ((!schema && currentWord.length > 0 && document.getText().charAt(offset - currentWord.length - 1) !== '"')) { collector.add({ kind: CompletionItemKind.Property, - label: this.getLabelForValue(currentWord) + label: this.getLabelForValue(currentWord), + insertText: this.getInsertTextForProperty(currentWord, null, false, separatorAfter), + insertTextFormat: InsertTextFormat.Snippet, + documentation: '' }); } } // proposals for values - let types: { [type: string]: boolean } = {}; - if (schema) { - this.getValueCompletions(schema, currentDoc, node, offset, document, collector, types); + if (newSchema) { + this.getValueCompletions(newSchema, currentDoc, node, offset, document, collector); } if (this.contributions.length > 0) { this.getContributedValueCompletions(currentDoc, node, offset, document, collector, collectionPromises); } + if (this.customTags.length > 0) { + this.getCustomTagValueCompletions(collector); + } return this.promise.all(collectionPromises).then(() => { return result; @@ -164,7 +205,7 @@ export class YAMLCompletion { }); } - private getPropertyCompletions(schema: SchemaService.ResolvedSchema, doc, node: Parser.ASTNode, addValue: boolean, collector: CompletionsCollector): void { + private getPropertyCompletions(schema: SchemaService.ResolvedSchema, doc, node: Parser.ASTNode, addValue: boolean, collector: CompletionsCollector, separatorAfter: string): void { let matchingSchemas = doc.getMatchingSchemas(schema.schema); matchingSchemas.forEach((s) => { if (s.node === node && !s.inverted) { @@ -176,18 +217,26 @@ export class YAMLCompletion { collector.add({ kind: CompletionItemKind.Property, label: key, - insertText: `${key}:`, - filterText: this.getFilterTextForValue(key), + insertText: this.getInsertTextForProperty(key, propertySchema, addValue, separatorAfter), + insertTextFormat: InsertTextFormat.Snippet, documentation: propertySchema.description || '' }); } }); } + // Error fix + // If this is a array of string/boolean/number + // test: + // - item1 + // it will treated as a property key since `:` has been appended + if (node.type === 'object' && node.parent && node.parent.type === 'array' && s.schema.type !== 'object') { + this.addSchemaValueCompletions(s.schema, collector, separatorAfter) + } } }); } - private getValueCompletions(schema: SchemaService.ResolvedSchema, doc, node: Parser.ASTNode, offset: number, document: TextDocument, collector: CompletionsCollector, types: { [type: string]: boolean }): void { + private getValueCompletions(schema: SchemaService.ResolvedSchema, doc, node: Parser.ASTNode, offset: number, document: TextDocument, collector: CompletionsCollector): void { let offsetForSeparator = offset; let parentKey: string = null; let valueNode: Parser.ASTNode = null; @@ -198,17 +247,17 @@ export class YAMLCompletion { node = node.parent; } - if (node && node.type === 'null') { + if(node && node.type === 'null'){ let nodeParent = node.parent; /* * This is going to be an object for some reason and we need to find the property * Its an issue with the null node */ - if (nodeParent && nodeParent.type === "object") { - for (let prop in nodeParent["properties"]) { + if(nodeParent && nodeParent.type === "object"){ + for(let prop in nodeParent["properties"]){ let currNode = nodeParent["properties"][prop]; - if (currNode.key && currNode.key.location === node.location) { + if(currNode.key && currNode.key.location === node.location){ node = currNode; } } @@ -216,7 +265,7 @@ export class YAMLCompletion { } if (!node) { - this.addSchemaValueCompletions(schema.schema, collector, types); + this.addSchemaValueCompletions(schema.schema, collector, ""); return; } @@ -230,6 +279,7 @@ export class YAMLCompletion { node = node.parent; } + let separatorAfter = this.evaluateSeparatorAfter(document, offsetForSeparator); if (node && (parentKey !== null || node.type === 'array')) { let matchingSchemas = doc.getMatchingSchemas(schema.schema); matchingSchemas.forEach(s => { @@ -238,30 +288,30 @@ export class YAMLCompletion { if (Array.isArray(s.schema.items)) { let index = this.findItemAtOffset(node, document, offset); if (index < s.schema.items.length) { - this.addSchemaValueCompletions(s.schema.items[index], collector, types); + this.addSchemaValueCompletions(s.schema.items[index], collector, separatorAfter, true); } - } else { - this.addSchemaValueCompletions(s.schema.items, collector, types); + } else if (s.schema.items.type === 'object') { + collector.add({ + kind: this.getSuggestionKind(s.schema.items.type), + label: `- (array item)`, + documentation: `Create an item of an array${s.schema.description === undefined ? '' : '(' + s.schema.description + ')'}`, + insertText: `- ${this.getInsertTextForObject(s.schema.items, separatorAfter).insertText.trimLeft()}`, + insertTextFormat: InsertTextFormat.Snippet, + }); + } + else { + this.addSchemaValueCompletions(s.schema.items, collector, separatorAfter, true); } } if (s.schema.properties) { let propertySchema = s.schema.properties[parentKey]; if (propertySchema) { - this.addSchemaValueCompletions(propertySchema, collector, types); + this.addSchemaValueCompletions(propertySchema, collector, separatorAfter, false); } } } }); } - if (node) { - if (types['boolean']) { - this.addBooleanValueCompletion(true, collector); - this.addBooleanValueCompletion(false, collector); - } - if (types['null']) { - this.addNullValueCompletion(collector); - } - } } private getContributedValueCompletions(doc: Parser.JSONDocument, node: Parser.ASTNode, offset: number, document: TextDocument, collector: CompletionsCollector, collectionPromises: Thenable[]) { @@ -293,22 +343,43 @@ export class YAMLCompletion { } } - private addSchemaValueCompletions(schema: JSONSchema, collector: CompletionsCollector, types: { [type: string]: boolean }): void { - this.addDefaultValueCompletions(schema, collector); - this.addEnumValueCompletions(schema, collector); - this.collectTypes(schema, types); - if (Array.isArray(schema.allOf)) { - schema.allOf.forEach(s => this.addSchemaValueCompletions(s, collector, types)); + private getCustomTagValueCompletions(collector: CompletionsCollector) { + this.customTags.forEach((customTagItem) => { + let tagItemSplit = customTagItem.split(" "); + if(tagItemSplit && tagItemSplit[0]){ + this.addCustomTagValueCompletion(collector, " ", tagItemSplit[0]); + } + }); + } + + private addSchemaValueCompletions(schema: JSONSchema, collector: CompletionsCollector, separatorAfter: string, forArrayItem = false): void { + let types: { [type: string]: boolean } = {}; + this.addSchemaValueCompletionsCore(schema, collector, types, separatorAfter, forArrayItem); + if (types['boolean']) { + this.addBooleanValueCompletion(true, collector, separatorAfter); + this.addBooleanValueCompletion(false, collector, separatorAfter); } - if (Array.isArray(schema.anyOf)) { - schema.anyOf.forEach(s => this.addSchemaValueCompletions(s, collector, types)); - } - if (Array.isArray(schema.oneOf)) { - schema.oneOf.forEach(s => this.addSchemaValueCompletions(s, collector, types)); + if (types['null']) { + this.addNullValueCompletion(collector, separatorAfter); } } - private addDefaultValueCompletions(schema: JSONSchema, collector: CompletionsCollector, arrayDepth = 0): void { + private addSchemaValueCompletionsCore(schema: JSONSchema, collector: CompletionsCollector, types: { [type: string]: boolean }, separatorAfter: string, forArrayItem = false): void { + this.addDefaultValueCompletions(schema, collector, separatorAfter, 0, forArrayItem); + this.addEnumValueCompletions(schema, collector, separatorAfter, forArrayItem); + this.collectTypes(schema, types); + if (Array.isArray(schema.allOf)) { + schema.allOf.forEach(s => this.addSchemaValueCompletionsCore(s, collector, types, separatorAfter, forArrayItem)); + } + if (Array.isArray(schema.anyOf)) { + schema.anyOf.forEach(s => this.addSchemaValueCompletionsCore(s, collector, types, separatorAfter, forArrayItem)); + } + if (Array.isArray(schema.oneOf)) { + schema.oneOf.forEach(s => this.addSchemaValueCompletionsCore(s, collector, types, separatorAfter, forArrayItem)); + } + } + + private addDefaultValueCompletions(schema: JSONSchema, collector: CompletionsCollector, separatorAfter: string, arrayDepth = 0, forArrayItem = false): void { let hasProposals = false; if (schema.default) { let type = schema.type; @@ -319,17 +390,19 @@ export class YAMLCompletion { } collector.add({ kind: this.getSuggestionKind(type), - label: this.getLabelForValue(value), + label: forArrayItem ? `- ${this.getLabelForValue(value)}` : this.getLabelForValue(value), + insertText: forArrayItem ? `- ${this.getInsertTextForValue(value, separatorAfter)}` : this.getInsertTextForValue(value, separatorAfter), + insertTextFormat: InsertTextFormat.Snippet, detail: localize('json.suggest.default', 'Default value'), }); hasProposals = true; } if (!hasProposals && schema.items && !Array.isArray(schema.items)) { - this.addDefaultValueCompletions(schema.items, collector, arrayDepth + 1); + this.addDefaultValueCompletions(schema.items, collector, separatorAfter, arrayDepth + 1); } } - private addEnumValueCompletions(schema: JSONSchema, collector: CompletionsCollector): void { + private addEnumValueCompletions(schema: JSONSchema, collector: CompletionsCollector, separatorAfter: string, forArrayItem = false): void { if (Array.isArray(schema.enum)) { for (let i = 0, length = schema.enum.length; i < length; i++) { let enm = schema.enum[i]; @@ -339,7 +412,9 @@ export class YAMLCompletion { } collector.add({ kind: this.getSuggestionKind(schema.type), - label: this.getLabelForValue(enm), + label: forArrayItem ? `- ${this.getLabelForValue(enm)}` : this.getLabelForValue(enm), + insertText: forArrayItem ? `- ${this.getInsertTextForValue(enm, separatorAfter)}` : this.getInsertTextForValue(enm, separatorAfter), + insertTextFormat: InsertTextFormat.Snippet, documentation }); } @@ -355,18 +430,32 @@ export class YAMLCompletion { } } - private addBooleanValueCompletion(value: boolean, collector: CompletionsCollector): void { + private addBooleanValueCompletion(value: boolean, collector: CompletionsCollector, separatorAfter: string): void { collector.add({ kind: this.getSuggestionKind('boolean'), label: value ? 'true' : 'false', + insertText: this.getInsertTextForValue(value, separatorAfter), + insertTextFormat: InsertTextFormat.Snippet, documentation: '' }); } - private addNullValueCompletion(collector: CompletionsCollector): void { + private addNullValueCompletion(collector: CompletionsCollector, separatorAfter: string): void { collector.add({ kind: this.getSuggestionKind('null'), label: 'null', + insertText: 'null' + separatorAfter, + insertTextFormat: InsertTextFormat.Snippet, + documentation: '' + }); + } + + private addCustomTagValueCompletion(collector: CompletionsCollector, separatorAfter: string, label: string): void { + collector.add({ + kind: this.getSuggestionKind('string'), + label: label, + insertText: label + separatorAfter, + insertTextFormat: InsertTextFormat.Snippet, documentation: '' }); } @@ -379,10 +468,6 @@ export class YAMLCompletion { return label; } - private getFilterTextForValue(value): string { - return JSON.stringify(value); - } - private getSuggestionKind(type: any): CompletionItemKind { if (Array.isArray(type)) { let array = type; @@ -436,4 +521,178 @@ export class YAMLCompletion { } return (token === Json.SyntaxKind.LineCommentTrivia || token === Json.SyntaxKind.BlockCommentTrivia) && scanner.getTokenOffset() <= offset; } + + private getInsertTextForPlainText(text: string): string { + return text.replace(/[\\\$\}]/g, '\\$&'); // escape $, \ and } + } + + private getInsertTextForValue(value: any, separatorAfter: string): string { + var text = value; + if (text === '{}') { + return '{\n\t$1\n}' + separatorAfter; + } else if (text === '[]') { + return '[\n\t$1\n]' + separatorAfter; + } + return this.getInsertTextForPlainText(text + separatorAfter); + } + + private getInsertTextForObject(schema: JSONSchema, separatorAfter: string, indent = '\t', insertIndex = 1) { + let insertText = ""; + if (!schema.properties) { + insertText = `${indent}\$${insertIndex++}\n`; + return { insertText, insertIndex }; + } + + Object.keys(schema.properties).forEach((key: string) => { + let propertySchema = schema.properties[key]; + let type = Array.isArray(propertySchema.type) ? propertySchema.type[0] : propertySchema.type; + if (!type) { + if (propertySchema.properties) { + type = 'object'; + } + if (propertySchema.items) { + type = 'array'; + } + } + if (schema.required && schema.required.indexOf(key) > -1) { + switch (type) { + case 'boolean': + case 'string': + case 'number': + case 'integer': + insertText += `${indent}${key}: \$${insertIndex++}\n` + break; + case 'array': + let arrayInsertResult = this.getInsertTextForArray(propertySchema.items, separatorAfter, `${indent}\t`, insertIndex++); + insertIndex = arrayInsertResult.insertIndex; + insertText += `${indent}${key}:\n${indent}\t- ${arrayInsertResult.insertText}\n`; + break; + case 'object': + let objectInsertResult = this.getInsertTextForObject(propertySchema, separatorAfter, `${indent}\t`, insertIndex++); + insertIndex = objectInsertResult.insertIndex; + insertText += `${indent}${key}:\n${objectInsertResult.insertText}\n`; + break; + } + } else if (propertySchema.default !== undefined) { + switch (type) { + case 'boolean': + case 'string': + case 'number': + case 'integer': + insertText += `${indent}${key}: \${${insertIndex++}:${propertySchema.default}}\n` + break; + case 'array': + case 'object': + // TODO: support default value for array object + break; + } + } + }); + if (insertText.trim().length === 0) { + insertText = `${indent}\$${insertIndex++}\n`; + } + insertText = insertText.trimRight() + separatorAfter; + return { insertText, insertIndex }; + } + + private getInsertTextForArray(schema: JSONSchema, separatorAfter: string, indent = '\t', insertIndex = 1) { + let insertText = ''; + if (!schema) { + insertText = `\$${insertIndex++}`; + } + let type = Array.isArray(schema.type) ? schema.type[0] : schema.type; + if (!type) { + if (schema.properties) { + type = 'object'; + } + if (schema.items) { + type = 'array'; + } + } + switch (schema.type) { + case 'boolean': + insertText = `\${${insertIndex++}:false}`; + break; + case 'number': + case 'integer': + insertText = `\${${insertIndex++}:0}`; + break; + case 'string': + insertText = `\${${insertIndex++}:null}`; + break; + case 'object': + let objectInsertResult = this.getInsertTextForObject(schema, separatorAfter, `${indent}\t`, insertIndex++); + insertText = objectInsertResult.insertText.trimLeft(); + insertIndex = objectInsertResult.insertIndex; + break; + } + return { insertText, insertIndex }; + } + + private getInsertTextForProperty(key: string, propertySchema: JSONSchema, addValue: boolean, separatorAfter: string): string { + + let propertyText = this.getInsertTextForValue(key, ''); + // if (!addValue) { + // return propertyText; + // } + let resultText = propertyText + ':'; + + let value; + if (propertySchema) { + if (propertySchema.default !== undefined) { + value = ` \${1:${propertySchema.default}}` + } + else if (propertySchema.properties) { + return `${resultText}\n${this.getInsertTextForObject(propertySchema, separatorAfter).insertText}`; + } + else if (propertySchema.items) { + return `${resultText}\n\t- ${this.getInsertTextForArray(propertySchema.items, separatorAfter).insertText}`; + } + else { + var type = Array.isArray(propertySchema.type) ? propertySchema.type[0] : propertySchema.type; + switch (type) { + case 'boolean': + value = ' $1'; + break; + case 'string': + value = ' $1'; + break; + case 'object': + value = '\n\t'; + break; + case 'array': + value = '\n\t- '; + break; + case 'number': + case 'integer': + value = ' ${1:0}'; + break; + case 'null': + value = ' ${1:null}'; + break; + default: + return propertyText; + } + } + } + if (!value) { + value = '$1'; + } + return resultText + value + separatorAfter; + } + + private evaluateSeparatorAfter(document: TextDocument, offset: number) { + let scanner = Json.createScanner(document.getText(), true); + scanner.setPosition(offset); + let token = scanner.scan(); + switch (token) { + case Json.SyntaxKind.CommaToken: + case Json.SyntaxKind.CloseBraceToken: + case Json.SyntaxKind.CloseBracketToken: + case Json.SyntaxKind.EOF: + return ''; + default: + return ''; + } + } } \ No newline at end of file diff --git a/src/languageservice/services/yamlFormatter.ts b/src/languageservice/services/yamlFormatter.ts new file mode 100644 index 0000000..f299224 --- /dev/null +++ b/src/languageservice/services/yamlFormatter.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Adam Voss. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as jsyaml from 'js-yaml'; +import * as Yaml from '../../yaml-ast-parser/index' +import { EOL } from '../../fillers/os'; +import { TextDocument, Range, Position, FormattingOptions, TextEdit } from 'vscode-languageserver-types'; + +export function format(document: TextDocument, options: FormattingOptions, customTags: Array): TextEdit[] { + const text = document.getText(); + + let schemaWithAdditionalTags = jsyaml.Schema.create(customTags.map((tag) => { + const typeInfo = tag.split(' '); + return new jsyaml.Type(typeInfo[0], { kind: typeInfo[1] || 'scalar' }); + })); + + //We need compiledTypeMap to be available from schemaWithAdditionalTags before we add the new custom properties + customTags.map((tag) => { + const typeInfo = tag.split(' '); + schemaWithAdditionalTags.compiledTypeMap[typeInfo[0]] = new jsyaml.Type(typeInfo[0], { kind: typeInfo[1] || 'scalar' }); + }); + + let additionalOptions: Yaml.LoadOptions = { + schema: schemaWithAdditionalTags + } + + const documents = [] + jsyaml.loadAll(text, doc => documents.push(doc), additionalOptions) + + const dumpOptions = { indent: options.tabSize, noCompatMode: true }; + + let newText; + if (documents.length == 1) { + const yaml = documents[0] + newText = jsyaml.safeDump(yaml, dumpOptions) + } + else { + const formatted = documents.map(d => jsyaml.safeDump(d, dumpOptions)) + newText = '%YAML 1.2' + EOL + '---' + EOL + formatted.join('...' + EOL + '---' + EOL) + '...' + EOL + } + + return [TextEdit.replace(Range.create(Position.create(0, 0), document.positionAt(text.length)), newText)] +} \ No newline at end of file diff --git a/src/yaml-languageservice/services/yamlHover.ts b/src/languageservice/services/yamlHover.ts similarity index 85% rename from src/yaml-languageservice/services/yamlHover.ts rename to src/languageservice/services/yamlHover.ts index a332d7b..2b794a5 100644 --- a/src/yaml-languageservice/services/yamlHover.ts +++ b/src/languageservice/services/yamlHover.ts @@ -1,12 +1,13 @@ /*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Parser = require('../parser/jsonParser'); -import SchemaService = require('./jsonSchemaService'); +import * as Parser from '../parser/jsonParser'; +import * as SchemaService from './jsonSchemaService'; import {JSONWorkerContribution} from '../jsonContributions'; import {PromiseConstructor, Thenable} from 'vscode-json-languageservice'; @@ -25,13 +26,18 @@ export class YAMLHover { this.promise = promiseConstructor || Promise; } - public doHover(document: TextDocument, position: Position, doc: Parser.JSONDocument): Thenable { + public doHover(document: TextDocument, position: Position, doc): Thenable { + + if(!document){ + this.promise.resolve(void 0); + } let offset = document.offsetAt(position); let currentDoc = matchOffsetToDocument(offset, doc); if(currentDoc === null){ - return null; + return this.promise.resolve(void 0); } + const currentDocIndex = doc.documents.indexOf(currentDoc); let node = currentDoc.getNodeFromOffset(offset); if (!node || (node.type === 'object' || node.type === 'array') && offset > node.start + 1 && offset < node.end - 1) { return this.promise.resolve(void 0); @@ -46,7 +52,7 @@ export class YAMLHover { node = propertyNode.value; if (!node) { return this.promise.resolve(void 0); - } + } } } @@ -71,8 +77,11 @@ export class YAMLHover { return this.schemaService.getSchemaForResource(document.uri).then((schema) => { if (schema) { - - let matchingSchemas = currentDoc.getMatchingSchemas(schema.schema, node.start); + let newSchema = schema; + if (schema.schema && schema.schema.schemaSequence && schema.schema.schemaSequence[currentDocIndex]) { + newSchema = new SchemaService.ResolvedSchema(schema.schema.schemaSequence[currentDocIndex]); + } + let matchingSchemas = currentDoc.getMatchingSchemas(newSchema.schema, node.start); let title: string = null; let markdownDescription: string = null; diff --git a/src/yaml-languageservice/services/yamlValidation.ts b/src/languageservice/services/yamlValidation.ts similarity index 57% rename from src/yaml-languageservice/services/yamlValidation.ts rename to src/languageservice/services/yamlValidation.ts index 6b8a78c..91c59d4 100644 --- a/src/yaml-languageservice/services/yamlValidation.ts +++ b/src/languageservice/services/yamlValidation.ts @@ -1,15 +1,17 @@ /*--------------------------------------------------------------------------------------------- -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. See License.txt in the project root for license information. -*--------------------------------------------------------------------------------------------*/ + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; -import { JSONSchemaService } from './jsonSchemaService'; +import { JSONSchemaService, ResolvedSchema } from './jsonSchemaService'; import { JSONDocument, ObjectASTNode, IProblem, ProblemSeverity } from '../parser/jsonParser'; import { TextDocument, Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-types'; -import { LanguageSettings, PromiseConstructor, Thenable } from '../yamlLanguageService'; +import { PromiseConstructor, Thenable, LanguageSettings} from '../yamlLanguageService'; export class YAMLValidation { - + private jsonSchemaService: JSONSchemaService; private promise: PromiseConstructor; private comments: boolean; @@ -21,35 +23,59 @@ export class YAMLValidation { this.validationEnabled = true; } - public configure(shouldValidate: LanguageSettings) { - if (shouldValidate) { + public configure(shouldValidate: LanguageSettings){ + if(shouldValidate){ this.validationEnabled = shouldValidate.validate; } } - + public doValidation(textDocument, yamlDocument) { - if (!this.validationEnabled) { + if(!this.validationEnabled){ return this.promise.resolve([]); } return this.jsonSchemaService.getSchemaForResource(textDocument.uri).then(function (schema) { + var diagnostics = []; + var added = {}; + let newSchema = schema; if (schema) { - - for (let currentYAMLDoc in yamlDocument.documents) { + let documentIndex = 0; + for(let currentYAMLDoc in yamlDocument.documents){ let currentDoc = yamlDocument.documents[currentYAMLDoc]; - let diagnostics = currentDoc.getValidationProblems(schema.schema); - for (let diag in diagnostics) { + if (schema.schema && schema.schema.schemaSequence && schema.schema.schemaSequence[documentIndex]) { + newSchema = new ResolvedSchema(schema.schema.schemaSequence[documentIndex]); + } + let diagnostics = currentDoc.getValidationProblems(newSchema.schema); + for(let diag in diagnostics){ let curDiagnostic = diagnostics[diag]; currentDoc.errors.push({ location: { start: curDiagnostic.location.start, end: curDiagnostic.location.end }, message: curDiagnostic.message }) } + documentIndex++; } + } + if(newSchema && newSchema.errors.length > 0){ + + for(let curDiagnostic of newSchema.errors){ + diagnostics.push({ + severity: DiagnosticSeverity.Error, + range: { + start: { + line: 0, + character: 0 + }, + end: { + line: 0, + character: 1 + } + }, + message: curDiagnostic + }); + } } - var diagnostics = []; - var added = {}; - for (let currentYAMLDoc in yamlDocument.documents) { + for(let currentYAMLDoc in yamlDocument.documents){ let currentDoc = yamlDocument.documents[currentYAMLDoc]; currentDoc.errors.concat(currentDoc.warnings).forEach(function (error, idx) { // remove duplicated messages diff --git a/src/languageservice/utils/arrUtils.ts b/src/languageservice/utils/arrUtils.ts new file mode 100644 index 0000000..4130f35 --- /dev/null +++ b/src/languageservice/utils/arrUtils.ts @@ -0,0 +1,75 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { SingleYAMLDocument } from "../parser/yamlParser"; + +export function removeDuplicates(arr, prop) { + var new_arr = []; + var lookup = {}; + + for (var i in arr) { + lookup[arr[i][prop]] = arr[i]; + } + + for (i in lookup) { + new_arr.push(lookup[i]); + } + + return new_arr; +} + +export function getLineOffsets(textDocString: String): number[] { + + let lineOffsets: number[] = []; + let text = textDocString; + let isLineStart = true; + for (let i = 0; i < text.length; i++) { + if (isLineStart) { + lineOffsets.push(i); + isLineStart = false; + } + let ch = text.charAt(i); + isLineStart = (ch === '\r' || ch === '\n'); + if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { + i++; + } + } + if (isLineStart && text.length > 0) { + lineOffsets.push(text.length); + } + + return lineOffsets; +} + +export function removeDuplicatesObj(objArray){ + + let nonDuplicateSet = new Set(); + let nonDuplicateArr = []; + for(let obj in objArray){ + + let currObj = objArray[obj]; + let stringifiedObj = JSON.stringify(currObj); + if(!nonDuplicateSet.has(stringifiedObj)){ + nonDuplicateArr.push(currObj); + nonDuplicateSet.add(stringifiedObj); + } + + } + + return nonDuplicateArr; + +} + +export function matchOffsetToDocument(offset: number, jsonDocuments): SingleYAMLDocument { + + for(let jsonDoc in jsonDocuments.documents){ + let currJsonDoc = jsonDocuments.documents[jsonDoc]; + if(currJsonDoc.root && currJsonDoc.root.end >= offset && currJsonDoc.root.start <= offset){ + return currJsonDoc; + } + } + + return null; + +} \ No newline at end of file diff --git a/src/yaml-languageservice/utils/documentPositionCalculator.ts b/src/languageservice/utils/documentPositionCalculator.ts similarity index 79% rename from src/yaml-languageservice/utils/documentPositionCalculator.ts rename to src/languageservice/utils/documentPositionCalculator.ts index b408a38..04d1d64 100644 --- a/src/yaml-languageservice/utils/documentPositionCalculator.ts +++ b/src/languageservice/utils/documentPositionCalculator.ts @@ -1,3 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ "use strict" export function insertionPointReturnValue(pt: number) { diff --git a/src/yaml-languageservice/utils/errorHandler.ts b/src/languageservice/utils/errorHandler.ts similarity index 92% rename from src/yaml-languageservice/utils/errorHandler.ts rename to src/languageservice/utils/errorHandler.ts index afa865c..eff20f1 100644 --- a/src/yaml-languageservice/utils/errorHandler.ts +++ b/src/languageservice/utils/errorHandler.ts @@ -2,12 +2,11 @@ * Copyright (c) Red Hat, Inc. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DiagnosticSeverity } from "vscode-languageserver/lib/main"; export class ErrorHandler { private errorResultsList; private textDocument; - + constructor(textDocument){ this.errorResultsList = []; this.textDocument = textDocument; @@ -22,7 +21,7 @@ export class ErrorHandler { }, message: errorMessage }); - + } public getErrorResultsList(){ diff --git a/src/yaml-languageservice/utils/objects.ts b/src/languageservice/utils/objects.ts similarity index 100% rename from src/yaml-languageservice/utils/objects.ts rename to src/languageservice/utils/objects.ts diff --git a/src/yaml-languageservice/utils/strings.ts b/src/languageservice/utils/strings.ts similarity index 64% rename from src/yaml-languageservice/utils/strings.ts rename to src/languageservice/utils/strings.ts index bd1bee1..2050772 100644 --- a/src/yaml-languageservice/utils/strings.ts +++ b/src/languageservice/utils/strings.ts @@ -32,6 +32,16 @@ export function endsWith(haystack: string, needle: string): boolean { } } -export function convertSimple2RegExpPattern(pattern: string): string { - return pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*'); +export function convertSimple2RegExp(pattern: string): RegExp { + var match = pattern.match(new RegExp('^/(.*?)/([gimy]*)$')); + return match ? convertRegexString2RegExp(match[1], match[2]) + : convertGlobalPattern2RegExp(pattern) +} + +function convertGlobalPattern2RegExp(pattern: string): RegExp { + return new RegExp(pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*') + '$'); +} + +function convertRegexString2RegExp(pattern: string, flag: string): RegExp { + return new RegExp(pattern, flag); } \ No newline at end of file diff --git a/src/yaml-languageservice/utils/uri.ts b/src/languageservice/utils/uri.ts similarity index 100% rename from src/yaml-languageservice/utils/uri.ts rename to src/languageservice/utils/uri.ts diff --git a/src/languageservice/yamlLanguageService.ts b/src/languageservice/yamlLanguageService.ts new file mode 100644 index 0000000..d43aa17 --- /dev/null +++ b/src/languageservice/yamlLanguageService.ts @@ -0,0 +1,155 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { JSONSchemaService } from "./services/jsonSchemaService"; +import { + TextDocument, + Position, + CompletionList, + FormattingOptions, + Diagnostic +} from "vscode-languageserver-types"; +import { JSONSchema } from "./jsonSchema"; +import { YAMLDocumentSymbols } from "./services/documentSymbols"; +import { YAMLCompletion } from "./services/yamlCompletion"; +import { JSONDocument } from "vscode-json-languageservice"; +import { YAMLHover } from "./services/yamlHover"; +import { YAMLValidation } from "./services/yamlValidation"; +import { format } from "./services/yamlFormatter"; +import { parse as parseYAML } from "./parser/yamlParser"; +export interface LanguageSettings { + validate?: boolean; //Setting for whether we want to validate the schema + isKubernetes?: boolean; //If true then its validating against kubernetes + schemas?: any[]; //List of schemas, + customTags?: Array; //Array of Custom Tags +} + +export type YAMLDocument = { documents: JSONDocument[] }; + +export interface PromiseConstructor { + /** + * Creates a new Promise. + * @param executor A callback used to initialize the promise. This callback is passed two arguments: + * a resolve callback used resolve the promise with a value or the result of another promise, + * and a reject callback used to reject the promise with a provided reason or error. + */ + new ( + executor: ( + resolve: (value?: T | Thenable) => void, + reject: (reason?: any) => void + ) => void + ): Thenable; + + /** + * Creates a Promise that is resolved with an array of results when all of the provided Promises + * resolve, or rejected when any Promise is rejected. + * @param values An array of Promises. + * @returns A new Promise. + */ + all(values: Array>): Thenable; + /** + * Creates a new rejected promise for the provided reason. + * @param reason The reason the promise was rejected. + * @returns A new rejected Promise. + */ + reject(reason: any): Thenable; + + /** + * Creates a new resolved promise for the provided value. + * @param value A promise. + * @returns A promise whose internal state matches the provided promise. + */ + resolve(value: T | Thenable): Thenable; + +} + +export interface Thenable { + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then( + onfulfilled?: (value: R) => TResult | Thenable, + onrejected?: (reason: any) => TResult | Thenable + ): Thenable; + then( + onfulfilled?: (value: R) => TResult | Thenable, + onrejected?: (reason: any) => void + ): Thenable; +} + +export interface WorkspaceContextService { + resolveRelativePath(relativePath: string, resource: string): string; +} +/** + * The schema request service is used to fetch schemas. The result should the schema file comment, or, + * in case of an error, a displayable error string + */ +export interface SchemaRequestService { + (uri: string): Thenable; +} + +export interface SchemaConfiguration { + /** + * The URI of the schema, which is also the identifier of the schema. + */ + uri: string; + /** + * A list of file names that are associated to the schema. The '*' wildcard can be used. For example '*.schema.json', 'package.json' + */ + fileMatch?: string[]; + /** + * The schema for the given URI. + * If no schema is provided, the schema will be fetched with the schema request service (if available). + */ + schema?: JSONSchema; +} + +export interface LanguageService { + configure(settings): void; + doComplete(document: TextDocument, position: Position, doc): Thenable; + doValidation(document: TextDocument, yamlDocument): Thenable; + doHover(document: TextDocument, position: Position, doc); + findDocumentSymbols(document: TextDocument, doc); + doResolve(completionItem); + resetSchema(uri: string): boolean; + doFormat(document: TextDocument, options: FormattingOptions, customTags: Array); + parseYAMLDocument(document: TextDocument): YAMLDocument; +} + +export function getLanguageService(schemaRequestService, workspaceContext, contributions, customSchemaProvider, promiseConstructor?): LanguageService { + let promise = promiseConstructor || Promise; + + let schemaService = new JSONSchemaService(schemaRequestService, workspaceContext, customSchemaProvider); + + let completer = new YAMLCompletion(schemaService, contributions, promise); + let hover = new YAMLHover(schemaService, contributions, promise); + let yamlDocumentSymbols = new YAMLDocumentSymbols(); + let yamlValidation = new YAMLValidation(schemaService, promise); + + return { + configure: (settings) => { + schemaService.clearExternalSchemas(); + if (settings.schemas) { + settings.schemas.forEach(settings => { + schemaService.registerExternalSchema(settings.uri, settings.fileMatch, settings.schema); + }); + } + yamlValidation.configure(settings); + let customTagsSetting = settings && settings["customTags"] ? settings["customTags"] : []; + completer.configure(customTagsSetting); + }, + doComplete: completer.doComplete.bind(completer), + doResolve: completer.doResolve.bind(completer), + doValidation: yamlValidation.doValidation.bind(yamlValidation), + doHover: hover.doHover.bind(hover), + findDocumentSymbols: yamlDocumentSymbols.findDocumentSymbols.bind(yamlDocumentSymbols), + resetSchema: (uri: string) => schemaService.onResourceChange(uri), + doFormat: format, + parseYAMLDocument: (document: TextDocument) => parseYAML(document.getText()) + } +} diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index da34a5a..d9b9d39 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -8,11 +8,10 @@ import * as mode from './yamlMode'; import Emitter = monaco.Emitter; import IEvent = monaco.IEvent; -import IDisposable = monaco.IDisposable; declare var require: (moduleId: [string], callback: (module: T) => void) => void; -// --- JSON configuration and defaults --------- +// --- YAML configuration and defaults --------- export class LanguageServiceDefaultsImpl implements monaco.languages.yaml.LanguageServiceDefaults { @@ -62,7 +61,7 @@ monaco.languages.yaml = createAPI(); // --- Registration to monaco editor --- function withMode(callback: (module: typeof mode) => void): void { - require(['vs/languages/yaml/yamlMode'], callback); + require(['vs/language/yaml/yamlMode'], callback); } monaco.languages.register({ diff --git a/src/monaco.d.ts b/src/monaco.d.ts index 875ec6d..76e6aa4 100644 --- a/src/monaco.d.ts +++ b/src/monaco.d.ts @@ -5,34 +5,35 @@ declare module monaco.languages.yaml { export interface DiagnosticsOptions { + /** + * If set, the validator will be enabled and perform syntax validation as well as schema based validation. + */ + readonly validate?: boolean; + + /** + * A list of known schemas and/or associations of schemas to file names. + */ + readonly schemas?: { /** - * If set, the validator will be enabled and perform syntax validation as well as schema based validation. + * The URI of the schema, which is also the identifier of the schema. */ - readonly validate?: boolean; + readonly uri: string; /** - * A list of known schemas and/or associations of schemas to file names. + * A list of file names that are associated to the schema. The '*' wildcard can be used. For example '*.schema.json', 'package.json' */ - readonly schemas?: { - /** - * The URI of the schema, which is also the identifier of the schema. - */ - readonly uri: string; - /** - * A list of file names that are associated to the schema. The '*' wildcard can be used. For example '*.schema.json', 'package.json' - */ - readonly fileMatch?: string[]; - /** - * The schema for the given URI. - */ - readonly schema?: any; - }[]; + readonly fileMatch?: string[]; + /** + * The schema for the given URI. + */ + readonly schema?: any; + }[]; } export interface LanguageServiceDefaults { - readonly onDidChange: IEvent; - readonly diagnosticsOptions: DiagnosticsOptions; - setDiagnosticsOptions(options: DiagnosticsOptions): void; + readonly onDidChange: IEvent; + readonly diagnosticsOptions: DiagnosticsOptions; + setDiagnosticsOptions(options: DiagnosticsOptions): void; } export var yamlDefaults: LanguageServiceDefaults; -} \ No newline at end of file + } diff --git a/src/tsconfig.esm.json b/src/tsconfig.esm.json new file mode 100644 index 0000000..3f4a079 --- /dev/null +++ b/src/tsconfig.esm.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "esnext", + "moduleResolution": "node", + "outDir": "../out/esm", + "target": "es5", + "lib": [ + "dom", + "es5", + "es2015.collection", + "es2015.promise", + "es2016", + "es2017.string" + ] + } +} diff --git a/src/tsconfig.json b/src/tsconfig.json index 6bd5e44..1996cf5 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -2,7 +2,17 @@ "compilerOptions": { "module": "umd", "moduleResolution": "node", - "outDir": "../out", - "target": "es5" + "outDir": "../out/amd", + "forceConsistentCasingInFileNames": true, + "target": "es5", + "lib": [ + "dom", + "es5", + "es2015.collection", + "es2015.promise", + "es2016", + "es2017.string" + ], + "downlevelIteration": true } -} \ No newline at end of file +} diff --git a/src/workerManager.ts b/src/workerManager.ts index 63d5827..db6ef9e 100644 --- a/src/workerManager.ts +++ b/src/workerManager.ts @@ -16,7 +16,7 @@ const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min export class WorkerManager { private _defaults: LanguageServiceDefaultsImpl; - private _idleCheckInterval: number; + private _idleCheckInterval: NodeJS.Timer; private _lastUsedTime: number; private _configChangeListener: IDisposable; @@ -62,7 +62,7 @@ export class WorkerManager { this._worker = monaco.editor.createWebWorker({ // module that exports the create() method and returns a `YAMLWorker` instance - moduleId: 'vs/languages/yaml/yamlWorker', + moduleId: 'vs/language/yaml/yamlWorker', label: this._defaults.languageId, diff --git a/src/yaml-ast-parser/type.ts b/src/yaml-ast-parser/type.ts index 13a2f84..b80ff79 100644 --- a/src/yaml-ast-parser/type.ts +++ b/src/yaml-ast-parser/type.ts @@ -1,6 +1,6 @@ 'use strict'; -import YAMLException = require('./exception'); +import YAMLException from './exception'; var TYPE_CONSTRUCTOR_OPTIONS = [ 'kind', diff --git a/src/yaml-languageservice/LICENSE b/src/yaml-languageservice/LICENSE deleted file mode 100644 index 867d47e..0000000 --- a/src/yaml-languageservice/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Red Hat Inc. and others. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/src/yaml-languageservice/services/yamlFormatter.ts b/src/yaml-languageservice/services/yamlFormatter.ts deleted file mode 100644 index eb8b80e..0000000 --- a/src/yaml-languageservice/services/yamlFormatter.ts +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -import * as jsyaml from 'js-yaml' -import { EOL } from 'os'; -import { TextDocument, Range, Position, FormattingOptions, TextEdit } from 'vscode-languageserver-types'; - -export function format(document: TextDocument, options: FormattingOptions): TextEdit[] { - const text = document.getText() - - const documents = [] - jsyaml.loadAll(text, doc => documents.push(doc)) - - const dumpOptions = { indent: options.tabSize, noCompatMode: true }; - - let newText; - if (documents.length == 1) { - const yaml = documents[0] - newText = jsyaml.safeDump(yaml, dumpOptions) - } - else { - const formatted = documents.map(d => jsyaml.safeDump(d, dumpOptions)) - newText = '%YAML 1.2' + EOL + '---' + EOL + formatted.join('...' + EOL + '---' + EOL) + '...' + EOL - } - - return [TextEdit.replace(Range.create(Position.create(0, 0), document.positionAt(text.length)), newText)] -} \ No newline at end of file diff --git a/src/yaml-languageservice/utils/arrUtils.ts b/src/yaml-languageservice/utils/arrUtils.ts deleted file mode 100644 index b4295f9..0000000 --- a/src/yaml-languageservice/utils/arrUtils.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { YAMLDocument } from "../yamlLanguageService"; -import { SingleYAMLDocument } from "../parser/yamlParser"; - -export function removeDuplicates(arr, prop) { - var new_arr = []; - var lookup = {}; - - for (var i in arr) { - lookup[arr[i][prop]] = arr[i]; - } - - for (i in lookup) { - new_arr.push(lookup[i]); - } - - return new_arr; -} - -export function getLineOffsets(textDocString: String): number[] { - - let lineOffsets: number[] = []; - let text = textDocString; - let isLineStart = true; - for (let i = 0; i < text.length; i++) { - if (isLineStart) { - lineOffsets.push(i); - isLineStart = false; - } - let ch = text.charAt(i); - isLineStart = (ch === '\r' || ch === '\n'); - if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { - i++; - } - } - if (isLineStart && text.length > 0) { - lineOffsets.push(text.length); - } - - return lineOffsets; -} - -export function removeDuplicatesObj(objArray) { - - let nonDuplicateSet = new Set(); - let nonDuplicateArr = []; - for (let obj in objArray) { - - let currObj = objArray[obj]; - let stringifiedObj = JSON.stringify(currObj); - if (!nonDuplicateSet.has(stringifiedObj)) { - nonDuplicateArr.push(currObj); - nonDuplicateSet.add(stringifiedObj); - } - - } - - return nonDuplicateArr; - -} - -export function matchOffsetToDocument(offset: number, jsonDocuments): SingleYAMLDocument { - - for (let jsonDoc in jsonDocuments.documents) { - let currJsonDoc = jsonDocuments.documents[jsonDoc]; - if (currJsonDoc.root && currJsonDoc.root.end >= offset && currJsonDoc.root.start <= offset) { - return currJsonDoc; - } - } - - return null; - -} \ No newline at end of file diff --git a/src/yaml-languageservice/yamlLanguageService.ts b/src/yaml-languageservice/yamlLanguageService.ts deleted file mode 100644 index a13127e..0000000 --- a/src/yaml-languageservice/yamlLanguageService.ts +++ /dev/null @@ -1,173 +0,0 @@ - -import { - TextDocument, Position, CompletionItem, CompletionList, Hover, Range, SymbolInformation, Diagnostic, - TextEdit, FormattingOptions, MarkedString -} from 'vscode-languageserver-types'; - -import { JSONSchemaService } from './services/jsonSchemaService' -import { JSONSchema } from './jsonSchema'; -import { parse as parseYAML } from "./parser/yamlParser"; -import { YAMLDocumentSymbols } from './services/documentSymbols'; -import { YAMLCompletion } from "./services/yamlCompletion"; -import { YAMLHover } from "./services/yamlHover"; -import { YAMLValidation } from "./services/yamlValidation"; -import { format as formatYAML } from './services/yamlFormatter'; - -export type JSONDocument = {} -export type YAMLDocument = { documents: JSONDocument[] } - -export interface LanguageService { - configure(settings: LanguageSettings): void; - doValidation(document: TextDocument, yamlDocument: YAMLDocument): Thenable; - parseYAMLDocument(document: TextDocument): YAMLDocument; - resetSchema(uri: string): boolean; - doResolve(item: CompletionItem): Thenable; - doComplete(document: TextDocument, position: Position, doc: YAMLDocument): Thenable; - findDocumentSymbols(document: TextDocument, doc: YAMLDocument): SymbolInformation[]; - doHover(document: TextDocument, position: Position, doc: YAMLDocument): Thenable; - format(document: TextDocument, options: FormattingOptions): TextEdit[]; -} - -export interface LanguageSettings { - /** - * If set, the validator will return syntax errors. - */ - validate?: boolean; - - /** - * A list of known schemas and/or associations of schemas to file names. - */ - schemas?: SchemaConfiguration[]; -} - -export interface SchemaConfiguration { - /** - * The URI of the schema, which is also the identifier of the schema. - */ - uri: string; - /** - * A list of file names that are associated to the schema. The '*' wildcard can be used. For example '*.schema.json', 'package.json' - */ - fileMatch?: string[]; - /** - * The schema for the given URI. - * If no schema is provided, the schema will be fetched with the schema request service (if available). - */ - schema?: JSONSchema; -} -export interface LanguageSettings { - validate?: boolean; //Setting for whether we want to validate the schema - schemas?: any[]; //List of schemas -} - -export interface PromiseConstructor { - /** - * Creates a new Promise. - * @param executor A callback used to initialize the promise. This callback is passed two arguments: - * a resolve callback used resolve the spromise with a value or the result of another promise, - * and a reject callback used to reject the promise with a provided reason or error. - */ - new (executor: (resolve: (value?: T | Thenable) => void, reject: (reason?: any) => void) => void): Thenable; - - /** - * Creates a Promise that is resolved with an array of results when all of the provided Promises - * resolve, or rejected when any Promise is rejected. - * @param values An array of Promises. - * @returns A new Promise. - */ - all(values: Array>): Thenable; - /** - * Creates a new rejected promise for the provided reason. - * @param reason The reason the promise was rejected. - * @returns A new rejected Promise. - */ - reject(reason: any): Thenable; - - /** - * Creates a new resolved promise for the provided value. - * @param value A promise. - * @returns A promise whose internal state matches the provided promise. - */ - resolve(value: T | Thenable): Thenable; - -} - -export interface Thenable { - /** - * Attaches callbacks for the resolution and/or rejection of the Promise. - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A Promise for the completion of which ever callback is executed. - */ - then(onfulfilled?: (value: R) => TResult | Thenable, onrejected?: (reason: any) => TResult | Thenable): Thenable; - then(onfulfilled?: (value: R) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable; -} - -export interface WorkspaceContextService { - resolveRelativePath(relativePath: string, resource: string): string; -} -/** - * The schema request service is used to fetch schemas. The result should the schema file comment, or, - * in case of an error, a displayable error string - */ -export interface SchemaRequestService { - (uri: string): Thenable; -} - -export interface SchemaConfiguration { - /** - * The URI of the schema, which is also the identifier of the schema. - */ - uri: string; - /** - * A list of file names that are associated to the schema. The '*' wildcard can be used. For example '*.schema.json', 'package.json' - */ - fileMatch?: string[]; - /** - * The schema for the given URI. - * If no schema is provided, the schema will be fetched with the schema request service (if available). - */ - schema?: JSONSchema; -} - -export interface LanguageService { - configure(settings): void; - parseYAMLDocument(document: TextDocument): YAMLDocument, - doComplete(document: TextDocument, position: Position, doc): Thenable; - doValidation(document: TextDocument, yamlDocument): Thenable; - doHover(document: TextDocument, position: Position, doc); - findDocumentSymbols(document: TextDocument, doc); - doResolve(completionItem); - resetSchema(uri: string): boolean; -} - -export function getLanguageService(schemaRequestService, workspaceContext, contributions, customSchemaProvider, promiseConstructor?): LanguageService { - let promise = promiseConstructor || Promise; - - let schemaService = new JSONSchemaService(schemaRequestService, workspaceContext, customSchemaProvider); - - let completer = new YAMLCompletion(schemaService, contributions, promise); - let hover = new YAMLHover(schemaService, contributions, promise); - let yamlDocumentSymbols = new YAMLDocumentSymbols(); - let yamlValidation = new YAMLValidation(schemaService, promise); - - return { - configure: (settings) => { - schemaService.clearExternalSchemas(); - if (settings.schemas) { - settings.schemas.forEach(settings => { - schemaService.registerExternalSchema(settings.uri, settings.fileMatch, settings.schema); - }); - } - yamlValidation.configure(settings); - }, - parseYAMLDocument: (document: TextDocument) => parseYAML(document.getText()), - doComplete: completer.doComplete.bind(completer), - doResolve: completer.doResolve.bind(completer), - doValidation: yamlValidation.doValidation.bind(yamlValidation), - doHover: hover.doHover.bind(hover), - findDocumentSymbols: yamlDocumentSymbols.findDocumentSymbols.bind(yamlDocumentSymbols), - resetSchema: (uri: string) => schemaService.onResourceChange(uri), - format: formatYAML - } -} diff --git a/src/yaml.worker.ts b/src/yaml.worker.ts new file mode 100644 index 0000000..de9cccc --- /dev/null +++ b/src/yaml.worker.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker'; +import { YAMLWorker } from './yamlWorker'; + +self.onmessage = () => { + // ignore the first message + worker.initialize((ctx, createData) => { + return new YAMLWorker(ctx, createData) + }); +}; diff --git a/src/yamlMode.ts b/src/yamlMode.ts index b0349eb..6001336 100644 --- a/src/yamlMode.ts +++ b/src/yamlMode.ts @@ -1,71 +1,71 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { WorkerManager } from './workerManager'; -import { YAMLWorker } from './yamlWorker'; -import { LanguageServiceDefaultsImpl } from './monaco.contribution'; -import * as languageFeatures from './languageFeatures'; - -import Promise = monaco.Promise; -import Uri = monaco.Uri; -import IDisposable = monaco.IDisposable; - -export function setupMode(defaults: LanguageServiceDefaultsImpl): void { - - let disposables: IDisposable[] = []; - - const client = new WorkerManager(defaults); - disposables.push(client); - - const worker: languageFeatures.WorkerAccessor = (...uris: Uri[]): Promise => { - return client.getLanguageServiceWorker(...uris); - }; - - let languageId = defaults.languageId; - - disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker))); - disposables.push(monaco.languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))); - disposables.push(monaco.languages.registerDocumentSymbolProvider(languageId, new languageFeatures.DocumentSymbolAdapter(worker))); - disposables.push(monaco.languages.registerDocumentFormattingEditProvider(languageId, new languageFeatures.DocumentFormattingEditProvider(worker))); - disposables.push(monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, new languageFeatures.DocumentRangeFormattingEditProvider(worker))); - disposables.push(new languageFeatures.DiagnostcsAdapter(languageId, worker)); - // disposables.push(monaco.languages.setTokensProvider(languageId, createTokenizationSupport(true))); - disposables.push(monaco.languages.setLanguageConfiguration(languageId, richEditConfiguration)); -} - - -const richEditConfiguration: monaco.languages.LanguageConfiguration = { - comments: { - lineComment: '#' - }, - brackets: [ - ['{', '}'], - ['[', ']'], - ['(', ')'] - ], - autoClosingPairs: [ - { open: '{', close: '}' }, - { open: '[', close: ']' }, - { open: '(', close: ')' }, - { open: '"', close: '"' }, - { open: '\'', close: '\'' }, - ], - surroundingPairs: [ - { open: '{', close: '}' }, - { open: '[', close: ']' }, - { open: '(', close: ')' }, - { open: '"', close: '"' }, - { open: '\'', close: '\'' }, - ], - - onEnterRules: [ - { - beforeText: /:\s*$/, - action: { indentAction: monaco.languages.IndentAction.Indent } - } - ], -}; - +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { WorkerManager } from './workerManager'; +import { YAMLWorker } from './yamlWorker'; +import { LanguageServiceDefaultsImpl } from './monaco.contribution'; +import * as languageFeatures from './languageFeatures'; + +import Promise = monaco.Promise; +import Uri = monaco.Uri; +import IDisposable = monaco.IDisposable; + +export function setupMode(defaults: LanguageServiceDefaultsImpl): void { + + let disposables: IDisposable[] = []; + + const client = new WorkerManager(defaults); + disposables.push(client); + + const worker: languageFeatures.WorkerAccessor = (...uris: Uri[]): Promise => { + return client.getLanguageServiceWorker(...uris); + }; + + let languageId = defaults.languageId; + + disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker))); + disposables.push(monaco.languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))); + disposables.push(monaco.languages.registerDocumentSymbolProvider(languageId, new languageFeatures.DocumentSymbolAdapter(worker))); + disposables.push(monaco.languages.registerDocumentFormattingEditProvider(languageId, new languageFeatures.DocumentFormattingEditProvider(worker))); + disposables.push(monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, new languageFeatures.DocumentRangeFormattingEditProvider(worker))); + disposables.push(new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults)); + // disposables.push(monaco.languages.setTokensProvider(languageId, createTokenizationSupport(true))); + disposables.push(monaco.languages.setLanguageConfiguration(languageId, richEditConfiguration)); +} + + +const richEditConfiguration: monaco.languages.LanguageConfiguration = { + comments: { + lineComment: '#' + }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'] + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: '\'', close: '\'' }, + ], + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: '\'', close: '\'' }, + ], + + onEnterRules: [ + { + beforeText: /:\s*$/, + action: { indentAction: monaco.languages.IndentAction.Indent } + } + ], +}; + diff --git a/src/yamlWorker.ts b/src/yamlWorker.ts index a9f5c72..0cdf407 100644 --- a/src/yamlWorker.ts +++ b/src/yamlWorker.ts @@ -1,146 +1,214 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Red Hat, Inc. All rights reserved. - * Copyright (c) Adam Voss. All rights reserved. - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Promise = monaco.Promise; -import Thenable = monaco.Thenable; -import IWorkerContext = monaco.worker.IWorkerContext; - -import * as yamlService from './yaml-languageservice/yamlLanguageService'; -import * as ls from 'vscode-languageserver-types'; -import { getLineOffsets } from './yaml-languageservice/utils/arrUtils'; -import { parse as parseYAML } from "./yaml-languageservice/parser/yamlParser"; - -export class YAMLWorker { - - private _ctx: IWorkerContext; - private _languageService: yamlService.LanguageService; - private _languageSettings: yamlService.LanguageSettings; - private _languageId: string; - - constructor(ctx: IWorkerContext, createData: ICreateData) { - this._ctx = ctx; - this._languageSettings = createData.languageSettings; - this._languageId = createData.languageId; - this._languageService = yamlService.getLanguageService(); - this._languageService.configure(this._languageSettings); - } - - doValidation(uri: string): Thenable { - let document = this._getTextDocument(uri); - if (document) { - let jsonDocument = this._languageService.parseYAMLDocument(document); - return this._languageService.doValidation(document, jsonDocument); - } - return Promise.as([]); - } - doComplete(uri: string, position: ls.Position): Thenable { - let document = this._getTextDocument(uri); - let completionFix = completionHelper(document, position); - let newText = completionFix.newText; - let jsonDocument = parseYAML(newText); - return this._languageService.doComplete(document, position, jsonDocument); - } - doResolve(item: ls.CompletionItem): Thenable { - return this._languageService.doResolve(item); - } - doHover(uri: string, position: ls.Position): Thenable { - let document = this._getTextDocument(uri); - let jsonDocument = this._languageService.parseYAMLDocument(document); - return this._languageService.doHover(document, position, jsonDocument); - } - format(uri: string, range: ls.Range, options: ls.FormattingOptions): Thenable { - let document = this._getTextDocument(uri); - let textEdits = this._languageService.format(document, options); - return Promise.as(textEdits); - } - resetSchema(uri: string): Thenable { - return Promise.as(this._languageService.resetSchema(uri)); - } - findDocumentSymbols(uri: string): Promise { - let document = this._getTextDocument(uri); - let jsonDocument = this._languageService.parseYAMLDocument(document); - let symbols = this._languageService.findDocumentSymbols(document, jsonDocument); - return Promise.as(symbols); - } - private _getTextDocument(uri: string): ls.TextDocument { - let models = this._ctx.getMirrorModels(); - for (let model of models) { - if (model.uri.toString() === uri) { - return ls.TextDocument.create(uri, this._languageId, model.version, model.getValue()); - } - } - return null; - } -} - -export interface ICreateData { - languageId: string; - languageSettings: yamlService.LanguageSettings; -} - -export function create(ctx: IWorkerContext, createData: ICreateData): YAMLWorker { - return new YAMLWorker(ctx, createData); -} - - -// https://github.com/redhat-developer/yaml-language-server/blob/5e069c0e9d7004d57f1fa6e93df670d4895883d1/src/server.ts#L453 -function completionHelper(document: ls.TextDocument, textDocumentPosition: ls.Position) { - - //Get the string we are looking at via a substring - let linePos = textDocumentPosition.line; - let position = textDocumentPosition; - let lineOffset = getLineOffsets(document.getText()); - let start = lineOffset[linePos]; //Start of where the autocompletion is happening - let end = 0; //End of where the autocompletion is happening - if (lineOffset[linePos + 1]) { - end = lineOffset[linePos + 1]; - } else { - end = document.getText().length; - } - let textLine = document.getText().substring(start, end); - - //Check if the string we are looking at is a node - if (textLine.indexOf(":") === -1) { - //We need to add the ":" to load the nodes - let newText = ""; - - //This is for the empty line case - let trimmedText = textLine.trim(); - if (trimmedText.length === 0 || (trimmedText.length === 1 && trimmedText[0] === '-')) { - //Add a temp node that is in the document but we don't use at all. - if (lineOffset[linePos + 1]) { - newText = document.getText().substring(0, start + (textLine.length - 1)) + "holder:\r\n" + document.getText().substr(end + 2); - } else { - newText = document.getText().substring(0, start + (textLine.length)) + "holder:\r\n" + document.getText().substr(end + 2); - } - //For when missing semi colon case - } else { - //Add a semicolon to the end of the current line so we can validate the node - if (lineOffset[linePos + 1]) { - newText = document.getText().substring(0, start + (textLine.length - 1)) + ":\r\n" + document.getText().substr(end + 2); - } else { - newText = document.getText().substring(0, start + (textLine.length)) + ":\r\n" + document.getText().substr(end + 2); - } - } - - return { - "newText": newText, - "newPosition": textDocumentPosition - } - - } else { - - //All the nodes are loaded - position.character = position.character - 1; - return { - "newText": document.getText(), - "newPosition": position - } - } - -} +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Copyright (c) Adam Voss. All rights reserved. + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import Promise = monaco.Promise; +import Thenable = monaco.Thenable; +import IWorkerContext = monaco.worker.IWorkerContext; + +import * as ls from 'vscode-languageserver-types'; +import * as yamlService from './languageservice/yamlLanguageService'; +import { SchemaRequestService } from './languageservice/yamlLanguageService'; + +class PromiseAdapter implements yamlService.Thenable { + private wrapped: monaco.Promise; + + constructor(executor: (resolve: (value?: T | yamlService.Thenable) => void, reject: (reason?: any) => void) => void) { + this.wrapped = new monaco.Promise(executor); + } + public then(onfulfilled?: (value: T) => TResult | yamlService.Thenable, onrejected?: (reason: any) => void): yamlService.Thenable { + let thenable : yamlService.Thenable = this.wrapped; + return thenable.then(onfulfilled, onrejected); + } + public getWrapped(): monaco.Thenable { + return this.wrapped; + } + public cancel(): void { + this.wrapped.cancel(); + } + public static resolve(v: T | Thenable): yamlService.Thenable { + return > monaco.Promise.as(v); + } + public static reject(v: T): yamlService.Thenable { + return monaco.Promise.wrapError(v); + } + public static all(values: yamlService.Thenable[]): yamlService.Thenable { + return monaco.Promise.join(values); + } +} + +// Currently we only support loading schemas via xhr: +const ajax = (url: string) => + new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.onreadystatechange = () => { + if (request.readyState === XMLHttpRequest.DONE) { + const response = request.responseText; + if (request.status < 400) { + resolve(response); + } else { + reject(response); + } + } + }; + request.onerror = reject; + request.open('GET', url); + request.send(); + }); + +export class YAMLWorker { + + private _ctx: IWorkerContext; + private _languageService: yamlService.LanguageService; + private _languageSettings: yamlService.LanguageSettings; + private _languageId: string; + + constructor(ctx: IWorkerContext, createData: ICreateData) { + this._ctx = ctx; + this._languageSettings = createData.languageSettings; + this._languageId = createData.languageId; + this._languageService = yamlService.getLanguageService(ajax, null, [], null, PromiseAdapter); + this._languageService.configure(this._languageSettings); + } + + doValidation(uri: string): Thenable { + let document = this._getTextDocument(uri); + if (document) { + let yamlDocument = this._languageService.parseYAMLDocument(document); + return this._languageService.doValidation(document, yamlDocument); + } + return Promise.as([]); + } + + doComplete(uri: string, position: ls.Position): Thenable { + let document = this._getTextDocument(uri); + let completionFix = completionHelper(document, position); + let yamlDocument = this._languageService.parseYAMLDocument(document); + return this._languageService.doComplete(document, position, yamlDocument); + } + doResolve(item: ls.CompletionItem): Thenable { + return this._languageService.doResolve(item); + } + doHover(uri: string, position: ls.Position): Thenable { + let document = this._getTextDocument(uri); + let yamlDocument = this._languageService.parseYAMLDocument(document) + return this._languageService.doHover(document, position, yamlDocument); + } + format(uri: string, range: ls.Range, options: ls.FormattingOptions): Thenable { + let document = this._getTextDocument(uri); + let textEdits = this._languageService.doFormat(document, options, []); + return Promise.as(textEdits); + } + resetSchema(uri: string): Thenable { + return Promise.as(this._languageService.resetSchema(uri)); + } + findDocumentSymbols(uri: string): Thenable { + let document = this._getTextDocument(uri); + let yamlDocument = this._languageService.parseYAMLDocument(document); + let symbols = this._languageService.findDocumentSymbols(document, yamlDocument); + return Promise.as(symbols); + } + private _getTextDocument(uri: string): ls.TextDocument { + let models = this._ctx.getMirrorModels(); + for (let model of models) { + if (model.uri.toString() === uri) { + return ls.TextDocument.create(uri, this._languageId, model.version, model.getValue()); + } + } + return null; + } +} + +export interface ICreateData { + languageId: string; + languageSettings: yamlService.LanguageSettings; + schemaRequestService?: SchemaRequestService; +} + +export function create(ctx: IWorkerContext, createData: ICreateData): YAMLWorker { + return new YAMLWorker(ctx, createData); +} + +export function getLineOffsets(textDocString: String): number[] { + + let lineOffsets: number[] = []; + let text = textDocString; + let isLineStart = true; + for (let i = 0; i < text.length; i++) { + if (isLineStart) { + lineOffsets.push(i); + isLineStart = false; + } + let ch = text.charAt(i); + isLineStart = (ch === '\r' || ch === '\n'); + if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { + i++; + } + } + if (isLineStart && text.length > 0) { + lineOffsets.push(text.length); + } + + return lineOffsets; +} + +// https://github.com/redhat-developer/yaml-language-server/blob/5e069c0e9d7004d57f1fa6e93df670d4895883d1/src/server.ts#L453 +function completionHelper(document: ls.TextDocument, textDocumentPosition: ls.Position) { + + //Get the string we are looking at via a substring + let linePos = textDocumentPosition.line; + let position = textDocumentPosition; + let lineOffset = getLineOffsets(document.getText()); + let start = lineOffset[linePos]; //Start of where the autocompletion is happening + let end = 0; //End of where the autocompletion is happening + if (lineOffset[linePos + 1]) { + end = lineOffset[linePos + 1]; + } else { + end = document.getText().length; + } + let textLine = document.getText().substring(start, end); + + //Check if the string we are looking at is a node + if (textLine.indexOf(":") === -1) { + //We need to add the ":" to load the nodes + let newText = ""; + + //This is for the empty line case + let trimmedText = textLine.trim(); + if (trimmedText.length === 0 || (trimmedText.length === 1 && trimmedText[0] === '-')) { + //Add a temp node that is in the document but we don't use at all. + if (lineOffset[linePos + 1]) { + newText = document.getText().substring(0, start + (textLine.length - 1)) + "holder:\r\n" + document.getText().substr(end + 2); + } else { + newText = document.getText().substring(0, start + (textLine.length)) + "holder:\r\n" + document.getText().substr(end + 2); + } + //For when missing semi colon case + } else { + //Add a semicolon to the end of the current line so we can validate the node + if (lineOffset[linePos + 1]) { + newText = document.getText().substring(0, start + (textLine.length - 1)) + ":\r\n" + document.getText().substr(end + 2); + } else { + newText = document.getText().substring(0, start + (textLine.length)) + ":\r\n" + document.getText().substr(end + 2); + } + } + + return { + "newText": newText, + "newPosition": textDocumentPosition + } + + } else { + + //All the nodes are loaded + position.character = position.character - 1; + return { + "newText": document.getText(), + "newPosition": position + } + } + +} diff --git a/test-demo.png b/test-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..427719a5d902600503e0404f723d6d08fbddd5bc GIT binary patch literal 157932 zcmeFYbx@q$(ws(0TfyY*~+ ze|>-bs?O9*-Boj+K3DhY(|x+HFnL*VgwMF2As`?SBqc-?As}EVAs{}q!NLA{BGssQ z00Hqu%3N4jUQ$??Sl+?b#N5gl0zx7zQSGC;(lBPGmZGGYADqOe_AteK=}$R9^eWXT zaRNeNBqX6rI+z&Rt)adMIv5I|d5oBb+)5{u)5^UZdTN>zgYMvwG<0>fPVhQ-0zBUC zGm(Ci71s=&fXG%FjF-Am(1G|&CR*DUioB42`vvm|G8@7$8)nRxAHa}Yi-u|dk+Aj5 zzjx>4OL?KDouI8Z`K~sN2Dj%45d$4s2kqbu*~bs*n|xJJ`xPRTPu`ZdPNK9=iI^>> z8=54E+CCaLnaVy1SFOw{4viD}0@C-#&Xo}-gc(qXx9oS;2e*1#p;Ky zaiPep{A_eun3=^j$rwW+C;dsGeIO2mN-9)xaSPY`OSjUOC}JB7sU@mj9-+tl-&>l{ zJyVQMXX-`rak(W}CrOw=WEP%!5;tfp_Z%v}iE`$&1g)qUWM>|>{Y32qOCPT|%oT)c zx#W0glCcuACq6PjGWmWGf`q5s9D-sNphtGOZMf~$J5I6d`tUvGLtvL^9?rdl(zwJX z>!$>NeiBru$56dc3st!AoVT4&RWB#V<lHXSkhs;+|#220>y(=))}>lp|RvE z&MYTQh>K}GO#|ub4@)?w(9Ve5kqr=-&R;D1=?%maT#YbZD>X%Xr%_cNcLfQr)UI4p ze~-wH=-}yi=*RP1PcuscM7h+OnJDc9>7G$e-*=X(6CQKK0`!vHM+!*v<< z9d^G9m!r!a)+74$dAw{B#TDj<HmHPp^tDfwV+@hNSq5su7)Eibqr+MN~s@S=KyHJNH%|w!~f8!vcaeB~@BSqN0#ZK~CvHUeChZ zT*Lg)LS_!tl5VPW;YskMe8H>2g~clsElM~|NNFl*)_Ep+)@E9F=I9ra;|03==9#v z#B9YpZ@!1HivS?!pb)D{EgSg57P!vYPVq$M#r?|Y<>#I9#`YTjgoK0Lo7$~^iL=4j z$Slk3{v{Ol9#%U*J3uO+9hLz0HTWrb2SEuz`imt30Na_FsgNLkbj-B!=een_X$O%p zTR5*2hs9BGp+d5FI}@%ox)m8qDdURiukpinrcsVDj!D-<`-m$YG*I8LQSR`Mc$sfS zGEZW7k@rO7L^@3F?}r;d6qG1tMP`=^SAQ_1BK}TE6a6hY&h|Tl<%HQZ^<&yWY85NL z#kys8HC#QiR(S)5$<@cvn0}MJx>AiI_1C1rq}Zg-qZLU6Ndc<&s#K~G<@XwE4TYM| z>ZV#%4K~1YU`=&cLyF<7*-aW<|H7cEQS17B=m*V#&{jDTamv^th|v@0U5!>~VHfqqv#Rul>O>rU(Jo?kps zJ(C{O@5mp5A11)Or_U3Uqg6w;of~>@^lxr&t*==>s%6m-({5<(7cp1GpXeI7U?}7BJ5o#GqyZdtpFPg}d{=k(I6Bk7jWd)^> zC<#>+&6xp2%|p?~)W+Y#Y~b8?B_U+=YqxX=Pn(%OYqjePa2=hB=R}=~nSri@_DVcJ zC5AbR88IN%Um4bpW{O7ZefEd3glX@A*s|E#IrTlAUzT%#a#+~C4fhvO$>n1b*CzGO#7k-A1k31pu1~b( zywtyV!R-2v`3s|ZNoMZOeYwFQXKu-#m~k+7$G9U6w+g|Jl}iL-;&dTAiv|U3 zYxTcwcWtk11DTaf2`Q&(ViUB}_gE~C$_ER!3N|JOOm9qqlQrpeb`!77r_EXiBsaDD z4U@o3J+@9$!9IT-_!9UV%(s>yr|DzSst(EL!iuqSE5YSnThb0|+C}>0#0~Y+PS+b$ z&oEcXK}A3TUXphyvT}OWuZr^0m+HvQ(-#+;4HX~udL9qA!Ov9~X{xAdQmVRo81)v5 z7VYx|Wki)>IhPCuMZVABw2*gcC;=C#WZO4ig& zHG%c#<6_+dqiO!^tk!I++Rcxzm{&<@TBMC^i>vc$)}%Hx>-T0J$M?(|&z>9Ay+-1D z(Ex68?p7D_bFTT#wW;dWU*K@DdWGqwR@0HpiS`^1tu*b_#&g5-vKPpg?1wD?5wlNQ z2fw?|Gi25W8UE!rWtSNH>RcT2%z4npSBoPX8QU{1bf@C>@y@f&NkgA?x20>lGn8IZ znrKBp5&;31s=L)@)2-`9SUMWgY7uaQkMn4EUI|UkDLtCc>puBXPc~COi_@8H^K{G6 z`v5Tm%(>yveIj%tIvMfN=kDe1XNa2k4f%z1MMg)4wGLWKv@T+c=eE>gqF$v#m2MNJ zOT~%%$XyzHA?UD!s_Ai8^{wKd6XTuD)uWrBCnLPI#ii^#Wxeb@d8hN<$-{}LnaKTp zJ0Slfkm#C-?^WmRIV7`I{8n5AKu5^VWAEe8#NGzH0Sx=x@+9&RoYK52T}-x^B2Icg z(L7W|{Bgz}nWLFV?dtb44|@}8J9-UBWM4oYI+yO3GW}XRz}EH0Htrj~v)7&O6e0)y&ww2`~_SUA!aTIIKttyIUQ~GV#C2BLQM_P}~|rT2mun<#+;t!om#W5X23T zmkMkwEKT-ihda){Pw60{u}UYCrAT_}x-lupTUfeXAs>X^5DH4Xqd%g7$^Il4pX?+w z93dbu$^YjEQc{uZ5&}X1LQ+If*%k6M!`2K>t>rySyOvlO(`pFG>QG2Wu~-;B$y^`p zFrw*K_h+5rNGyxGp!RThmw39SYs}jF@d#}<_{tffg?0EaFD%8~9@w%NgFoLLluJSA zR54#MP)~)RQ1gieKcJE^cAAQ%rZ6*`zDd-QQamCqrE)sHc~5k5PVzWre)voj_yJk~ z;$H`sz$QOe%(pmbNMwkA9Z?X_31)D_5K#X%2uL9yjR&Vl_5U9)fuo#;{eKA}1_3n^ zog?1!Z*%;4jx3*x;0powZ{t_wA2|tx0fB=5zFy*N5xjq2DDojTBpfAoFyW_wf1gG` zAdKzbp&*`O`Xi_F7hY7@f5j8o*B90L-(?iYHiRb5KE-w?`|_`d6GK3ful&1=z5;`A z0s_lSw-VU@s(JwkD5?5?ml47*8pYSQ*6=Wv@m~@5{hx;M;s2qr{}{%9gY*BzFgW0# z|NKFY&rg#|{AhB4O0N>t>2CUR6^-S^0UWQ#m_Ur}Cr+;U_$$R(NT2I987^l(KtF)t z|JrtbuYz4u*`P;*R78A^skx17qy`--(X)LArK8eEp1a41%KRva%&$-`Gcv$DlhwBV zcOuo|48rQ0$C9o`oyTe3f)SSp+IaljFeFp+^E}Q}ZkOP7*Mbl+hJ(!95if1g5{0Ms z{Q*JgH2FdKWapY2w@aq`In$uR&)QEWf@SZ^U^&I(LJzG^=tp@_GVGjKO^KZH?wE3{ znvcSDFGVGnp~aUPmv6hpbz*MfX}dPVT=f69Z_xbq6OOVK@m|4*Y(`n6h`y42Z)5!C ziC?aHEv}{P5ubys9cIupMSxO-$p&w0uzyp~Hq4Qe3TBrCKr`B4a6-bi zU;{7rmf(nv!yWnXO=fPVaHh!MwyYNys3Afslk%o1sGbtp`t9}BBembb>;J9l!W3Os@hLxV9f@YxQlsFd zdiY`MHHA#RqqU?jpuViTsn(gaDq&Qm;7K~sXH=?LUHKYVE4BYrT5HF5zRoAEDCLxV zhzZ2xdG4B_bCa6aqMEdumVWHw1a%}SeBsv`z~&08>Z8`CD80#AF5GTrJGRx;stuRl_YZP%Sbp27t#&meZQ4UHD6} z!w+Z;^pBNkhM*YNWxTMdH0|?XRUP$Q{WP|wzn^$!gPv~X3U=<$9)kSa7Ydv}N6NLi zZJBVo`^?%lJGZL)_$aKtkDhfDabGw!K6qD8qEN_waTNU6MP$+lu!eW*iuzp|1n9f)dy$uRU(!Um--DlB|hZ6FM^U*!dh9 zm%Y-BjS&7mIX0P)?J(rsBY6AL>6DJk;tr7?+HPgSkEL(n`it6JwhdSNI0Ulmpxr~v z-2$A3?`N+R6BH|Z@;EMrmrv4Gqa0CE@9yr(-46?wI+Hx%J9+pPK@q7RIW^yu0c=9c zH|slD=d*8GPh6trt$EJvKSt@IM`sS9xaa{z#k-AqrKb4gQc>(C0mDt;2wz{1&ZiC| zcx-@aqs#Mt9zp7vM?j|L)mppL@iT!~+L{epDAHfzXTm~NLP^!wm2Q2kGCT)StF-Y* zT&S4c^|mBQJb0#m(+vsEM@Pd4WB9G36`AWB@f%Z#?9hlx$t*_(e3_8H_l|@0WD$Y4 zlEh#6v3`exo1Q(F4H`nvQapw9rVaL(#6~M`_eG}f1BbR6;y^2TC3XfpB zkI>G35SIS)_~R{UVnsY2z4T-tBlM3R<}dNIDx;#*>wBFBDGA#CJt6Ho3j7T`D^r>` z_mAZp#w3@`ta@-qE~ZomW(;vZ`EBKYY^)gA`I&4WHf98qe$)Tr1X3cfk)5@O->GFG zoWAOV9?vwqQ6e0?r8q%{4!{wOS~$Q&c<`GYHOpNTFi~`jmm*cWG{&i zzJ4&=5_yRiD##}zzq0Z}{dJxSXy$oEa^@BTy!_^rbFO>r75(ns>P1rABk5^z6ft~z zsU7(Jz*@6(e{Db`6*cS8D}7Yc!H1cDOGbxR=B;5*Lc(#WDK23HSzC^klOA4huLvxJ zP8b$@U}fjzzi=@eAgyy@J=Hh=l(G9!;d6~^9qrx2Etk#9q@=rWZE~@u!O7tb^!H6( z8-})fsBt!32|hn^fuz552LVm^!A}5c@HCQtZ)Ezf<3GURI^=GRS?&hdpGjwSv_RrgsGiaGx(Yp zbzNP!0Gzh+)7-KNKbs6mD@s{UFdk$#?!&Jxkw-0Q?|tw?-c zYg0NiHOc2Ex&$3i3g0Ni8NaCwl4r`fIJPYga^JZL5Zu&1EsZ}04%&}uH-G^@=;Xza z|8c(f6-D_@B05EFUvCGtgqSCR_3@luq3H&btQ=W*j*5&$l$%nmupvVgPsi7J^)*|X zW#N6Y3YyF4ab*G&G&$I%Yk)oH@Lf`VN$;_RQbS&!3g}IOmy3IuDzItip1zBQITlf# zsmBDF?<>X?zO(#T>n=v)rJNo}E~~#zvAFChz^7%4&dA6%V-e~N_;7A)U!a}WU_aG!az1>_Ew+ zqm{F<+lWunD{Kc~Bj6*V$D^32$6KZ}|Fm8C?CJZy*;!Sb{iT8*>R=(>ltIE%8M{(^ z<&9NH)J{`aeR+pQ%p)gY)F*a#@R(@{13sZibm}t8By6HtYj`4Khv}`V4E^3LOVhsr zpPauunQTP!uKjqaDa}9WXTfn~l{kjxquuXsd`@_)^Hy}TL5?5LO~NWhbj}jIYzNF< zfalh&*S)ZGx@`h=$>ek*c%wz;+ZBf00}g0gt`ZqaNnw2aU8DX#Sj(nV36`<|toFmGzjDJC@6-0Oy4?-Z;ov@K187~CeF zc_-)N(8ugG9A^7V`ao)Gs%DRQ#%iSErT15T+zKXapqJl14B{v6QVQ1~n8gQDL;LU! zW+@6cIa~8Z?m3yY89a-e2aU}%7M%xI|19?Opf7;&DcVVu>5axF@*rlZroS>)-$dVS z2W5DwATJ9aX<%t;)o}%RuS}=uYZT2YlFrw;3?dtvwty5&BunI@N~t%gF=iWHBrynJ zyx#Rlj}fo8^g1l5)Gu0ENz&4CjFFk8m(kTtrOnMwqr?Qe z?icJapZKE#omJX0897=XKgCsS5BQ@1epkNoB#zRQDb?ODn;Ay&6&Iy+9-ga3dXT7H zv|4b~$VGU2PKqa?Gh_08jM`W$zpzl%chv4^`-*j9?RjG`H)}gGFqU+)K>wkhDmS#2 z>gd~Ygvo}C6}pzR9=wWbT+|y5Uu&tAZkUGyaX5`zr~NWByGjsU|KcpRBmFrw291!-VINa(pC*-lEfp3 zq)A(s8ARd5|0|IphJ$ptA)`MZg9&J6bk>3x(*}Dx(Aoa>&zf&FIc_D%E??J;r|pwS zku;48RL;S_$l6!$Yo-$^?L>nBm^IO*~yrPNrC&Fi1?3m9J22%T#nX>aLKO5b(z@#EWMIPN7sY3B;-u{R-A5B&< zcj#&0dkkdG#cvt-C#zf=@HDg>TpV}(U}X1J)1-RVRjsU7QP1y7^VYOh3h2u1Cy}|- zN1G|`bm(Z7F&rZquZef*I^tB=7$h+#{E6s5yQ!?bt-n;-_Vuc^Zg4CuTo!-a)ALk7 zf~rb^W69#F5KqZ6L3gC%599~lJGCAb#{`1dRB(4AT9T72VW{DgR@s;IsdpTOfi2f3 zKq11mYq|;jT4xc+ohzxl43E_#93t;)t|;Bu$O|xg0fS+Z&2QG2#5U+3EpQ{F?CA`u zUrm*y6o{UPR1;tB$W2?(epe0$7PxzPyfnTT2oj)On5+f4X{PG`sogp(ShR-ee$OI0 zy`$Tyx8to+4#I-k6B46-DFaGoC4YSRL3**OKyEnJt73ds9sv=bCD+$Tln4hLWjA8T zG%Q4p%VJlIPVPV<-vQ^&Bf>BKcV_?RHfU2gTN08SzOnL|wp9ILzY<-ZHORJ6)V&pI zq%`f)c;p-9PhuPR6IadJ%UOuekN4{8<`F4%(jyjJ;u8kHQ$KMVD>jbh$=jBbojUM6N`2aH;wY?`B}C62YJJnY@> zWCi3BhXSi-SCA~v)(yHL84Sw6HzSI^L2Z_VBRI)0R$kq7NP|!mNZtE!*-l5QGwqcZ zkthDEIx(A@v~bd(k?B+q1<8lV562M^ktBGigGkfu4Rg#&Tmd)*OUQxcI5tnbs~4O8 zgH5N&NX@=+rXP$4LV9};0L#RtpT%g;=BhSe%NJkivssGk_Nz||G}?K^6Hgg}X zfzfm=9UBS2ba0TKi7s>dQg`z7g*5y+`@Y$uZ?W#f0A!hdA_@si4mQPnY|2QXVn z*Z0=2oVTd_>@`(v8NH#fZZPomu>4tOWYmHR`tJ({Vh+DTn1t|+?N}lkB^aIYo}}2- z!hOIiWD^}EIYTiBb7ZD%2=iyU?Ol%6+%dW%gLfts-%#2?uGohVqbSVfTm>-0tdX55 z&AZW@B_#cPtpfaRqkJ43BWUMfa<`A#`^!sz3!Eomb_IP&R=K5rPj1{Fk77dR&mD0| zCb2yeR7TGjXPIfF9W;JtSLt?1mB*7#Y-dsL(XLb4dCe%)O(g7fphl*JzjVWuBA;ZW zMRNFdFZ3|oMLe61ieqtLdcq*ym&~QRq7J1GR$54!;|~D9rRrn~Wy2yJsUK#>*@>Gm zut6r+@-FL&e2S$mYf(+odDxpRG-ir}UzJT`SsPFH^4{xBUW-*2R**T`^c>Bv z%1+KCYc_IG>pFG>eqmp!WfpU8W@saeWxOl@sI@Zlkmhu|t5M~VvR|AK#h0|SN_k+u zY8)9pmZr7%TLbGUhOp>r^u~NgG~h^2p|;Y|U!-^paxGJ#XXeEYV)1}@S(W#?%2Ydx zxzB$S|F8HT3Kh<%KMiYj-#&(}N!MsPZIH>{SjpXG=lvmo?@Yd;;d2sqen$W|X63|m z`kY5(k2o2357B8}4wE?q?(5Hj8lBEN@8Z_U}Mwz5f-bMS14 z3eFs*h$jh6ns%U1yzBxtRQa7_lA|?DKH3)Aq}K;KGU`eUTHD_EF9bmwf-PC+}5kWHq zkX4#4AL*vbdQ*Ss3I=96wzz<$_L(a4?mP-N9Qrl%n*nTQgB5awgoS$%QL0^H38`E> zwCn5`a%h0-gruT&EzKHAY~v-MBHYcYWH-f?R1Q-~Gu$Z=vopxLI(BS!(Q z(8yX1%+CP*GK3ukclZ4Z#yd&EtS7**hrzjU=1qo*Q~?9l9&F@5aPg%65QB&pLn`Og z85eYH1&Zpwzh|sMU^^TfJ)Fhh=I0Y|u?%h|)O0d#Zh5S4;?qX@m(2k-JM085@Zv z0izqich11JU&Zp|3|W4dzyp-ZvX2{gX?LA|c%x4_jd2W{u{n$Nknyi*k_H64vYdWp zNq)LW*y$*~U^ISPuSOrk?};xjnS26rN2xEx-2iJJe?{xMT1S7bbqf*>UUsi{205oO z<4#`$WX;;P)-U!7voIZIb}M0>sZQ@zp{*If1%a|YmLhK1rlePq;W5=gDBNqKaqSYm zUoYM-N!8=u)mPcj!16P<8xt6w5W4<&9Nx!B{_D7!`s$YiozRDi7DiQtzDV_0aOc<5 zWqWc00HdT5uJU#Z?masRLu?Mkjv7eaP$WLg8%lVeYs+(QW8(AVqIzn`&FZ1kYKE?? z1&|yA-I=R2CHuZqWb9SauV~+n!V&nar}&m8lFy=|!O%VXb?SzzdYe}6m1u(sPX}=6 z(v#`BQX}uyzm2!RZUyb3(MK#}-SPJHH210w_4;V!S~N@audXW7CQ&^PKdf8swX?{+ zxLH>lT13eLOIUSVn@#E~`g}z38R(wGziG3Uo}}#BYvhIzltY|%1i$aDZ_mp&BVm;g zcL4NBz}wFVyior@KsKs8rJoxF|X@i=L7R}!WB+09GjD}V-KXpzng;b9nva1D0h37Lq{+2 z>vu|nkBS~({#k4BYlN%+mc2_B z@;AAxLZwq?b<9E#@0mGgLFH^?)dU+=TNt<+;OwLR#+iVtLEkRv3?siN zqS;RJj2_)^XyW+2k}1_oi+&EFvR5HzylRHNc~7(iU75YVQiaOHD=~?l?n*Dbw!c(# z>bmdRHiqNLfZqvxuk;`iDEkgZrP|{m=czZ-hQOUD&|cv1!Iirg^%{Lb>_v0}D_+EU zAD^xDLk<+7lKPCgTE<&$xxt5aHUrrCB(Z^u?{1~`gn5T2ao>Y`eyxb7F}>3kZpuhfpRIbo7N2^V`|5Q`P@uY{K2OZcNLR;BmuYOJ1Q&zP zGz?A_qDh_iSP<%IvUfR$@0^z5-~|Xu*bd~IE8z1pww$G2Zu1&3+Se|t+;ymiS7o=v zn_HPp{*PRY-7g6yAt#x%ev@h_B`?wTQ7{=W0xlaMj4gRj@G;oWkO8*7aIUD`Pga6n zRzOJ3%lLt#X=(L_iyX){7b7JR&Zgi^4yyUDmbb=cXDhhIjn~RvO(Ob&luFHN*|&S} zFOP=`E_Co7--s~GcW7D-eJvM`mH9&eG6N5`={-p>hiGG+3cm)6oYp?D^p5FZh42lH zV1R>&nr%2Y(T+Nr+vSc|3od>^$G5z%w`E<%vepH@tt#@->}N)8xw$|NU2@OzP3tiZ z7!v_xK!^%~;I$hrdJ!cANcAA_LRy&zf%NpHqi&AfWQ0Ie!>RTyMVRYkAK$tbSU?TS z>Bz@(&2g;23$)Ao4bL%iag>{xpEK19jDV?3xGDEg;V(5iIqTdgyx>LAYW@<}lbWY7 za;e?!Oeg%ieg;oh#MlOY z!8CXYVsQLh?yFnKtY7|2rZ1Pc&cJ$}v zvnc~ji7#D`DJ{R{(w~tp-G}$l=GZ=BY)VDc9-53lq76B&U8RuW+!`)Sd2DD~6^C4G_y}1+XRA_~hxDI?;sP zUL&sl+-v~HaSDDgq^GXEEKh9T%v61AU-9-nUueqsl7*05)X=e7%DYY^Xn@yTK}qN5 zR@FV%TIg$dTM>_LFC7CjbkbPUgPQDqHBZF`jhS~v8qICZajR$*WctC221)Wq#5?eZ z4oN#cGt2aTW_lbMVU?0`2%F8RJP}?d4#$gYys8p>jdSaB_v&Ym%ydjL78B#(y!8XZ z^g|-gUKJs0hbMCT$mDYBg8&xY8l}>yWR;p5s1OPIYYnMQ#_wZMZueleuAkv7MLWg|dilO%z9(1S{e9&5 z_^8K;y^x%3roLOx2?-!toD8GVURCY9s-m+vPB#~S@;0{s=Btbwk#UUpLYKzAXx@%< zW-ht>?aek|;JqVl)f)M((T*<;5yEyZzFRY;6@r44v^{l)=vc zNTqjC7kDXgqskOzAjg09ULnHe_bQA_3j_CNBpb7p;aP#elH?6=yJ7)Y79z> zKlaCiWZl9F8_ov>M~ZT~hQk)hA5-_eILEfT6$^b7y*URTS>QV-$d!3LxVhVYDgjqSS(`jsP6~R%b(l!Cbe6yezT+eF>94iab}{i zBGFYcZ47c(l%>{US)0-YwA;+ft`do=7xu_Wv)JWFf$&cYX5UrK9!`u?-`1#H0(g?h zX4)u>{ZuKyq-fG&S}oP!)*1GQIreg}oMi&@Vk6a6l8s$x6o%UnbOp(H*&EPpqH|rC z;l*a&O=xi5tDj8#oTx5JlzTDaK8ymMRj%4C zW0ZaXnQ$%&Z^$s7tokB7^ZaSurD^`lYn!B`&WQ!JPvg|!g-lqKkTU`>c5E zQ*?W&(Q*sRv)UWaHQzq#{T{H#T<0a^iI^1ijM}5^Ov_cA^4j+=96Ks>wS=xBy~~0O zD%Xwub**czQ*Flc!;1iQ_fYf7hO+QI!>M)esN;$WzT<0Mf+0zwTQP&)fVqkSWoKgU zQnuTmy>s#C*6lA2xIOoJ;V`vZ1o+bec%>J)!P97K9W}yg*h1{ypOL5sX!{#4Pz9RVeMY7pBosu-|waL;H=CNr2j;^=_mXW*L${;v%{OMdis2aHsw81{{Ji(S1kC{8| zD47*m=T~<@!{?paPLMkk0)Ote1R?IYX9p-{cA>6+$)Xs~7Z2vT{w_TV(fJGa{6+B6RH3D0n&wWDgqGctKM zpOWkSH7qMscvvR24HnWL(QcL{v5@*}%Y17e;?tZZ(+w!xb-sdx55z@Bo-{TZ$ccUu z7<^*t5~BqLHkS^9LI%yJ<$iX17}5JMO5=fXBjSpJI)f4xVJ<#B0O7{hSzf<{$i$E2 zbn83lH5Qq#McGEtLA9Dqrc&`{)@hEnY=WL#6J+14gPfJ4N=+*}UQ-s&cb8Zq7pHfe zX76b#h7B)Cs=4Ks&XHSaUc& zJ1%;$dp>5eaPvKh4G}uLhfY)Jr$FGJc20#9P| z*xx$N-PPI^wk8uibln2P0PO;!{Fg^T*u6en$Xn;XFZ&nW9nc9FSNU|e%_c$-P2QY`PJD=(ApxeokW&G$l0A+nm07u7Z0 zE^Q|E;6qv$M1-lpqQVD4z$%H6x&u z#YJoob%LFP$HY@BoHdi+8=%J9ckaV*28q$gZV{EP%fZ|GW0t)MjdaRUFV)CrJr~c1 zb48A~10VN$z%`fb-)mYadc-~6Q20xyMmC~nhXH+!dFO%@q1sEeUO(z9Eh3zrc<|P0 znoE+k-hbbtI7mXB#m+jcXnQW&(BB-C)2hD?z2G&3(N+j{b{_h$3yJv~2f=WdbW>eo!qz-0*9UuUgZ(w~yvE`umWblDsGZ{-pCHxW~5 zY&t8EGFuBOh9Z;4~7s>AtM=$PD1gB5EL)XUGt|6$N5&Fm3Ld0Y6bMxl9qhG+%gJC&?8zsAeTKG=5mc=9y4q;hvw7{c6C6aEwr8mQd7%wK=n2~G%QKXJ(2sPR0x1z5kN8sT3L?cPg)eoi*J zCYHD1@){IxjOazeT{SVuT*95&FReH_&vFU9uvFRl6H?kY-!Vvwc`~#eVC9C!ZQJ`;uUnZ)1IJ*uI42LiJQxdU3z((Y ziYADp8?QqRfAcahk)J56?a?_#PGw;&oJI{Vc>nSlxR4MU-epS+lFYC_Inxn-Wvr^! zEvfIgWiiBJ4wsZyC%ySH{M&=seBJkBm?9uukQj!~Cb zK5=NNCW-NkFk-8IB}F0U!km9Ih-VUgP79~GD#0OV>dek>>bP;?r3QQ|#~oXnH3;Ay zITlM=ohYnzr_#?*qEMs5_e$g9`MV(e5z+x<=%@U);(xQ{O)0DA7{`egZVvT+DxT{PYXfd6S(#+Eaqz)-pV?=eDm$W9pn!I+^=Ne` z66U0YYFORWlGI}LQM?X@ zxX_g6Icr_-t7&qARnCx?u1sfUh(&X`)y9glA{H8-o4Ha_+dA0r;4!* zTao0k1_SVM^d?3$+YC#-bgY+0?AV`~fma>=WrE(8lc}CIJv<6GRODuE>ev17 zNxSMIVf7C`%PkPeW>%9Z?;>8pt@KBPiY?Pp*@O+ontvk6)i|eGUHPyZ&a%Yvnn+#L+r?s}jT795S6c{S=Kx5L7E)ApGCw7pW5STm=8Qb{;)#$1-XNGY+bZP1& ztzCDAbsoS>?;XWfxCWp~bKYu|AJVC?wbr(~m$UTlbEv_b-t|9GCo^(XlLKnhv5f2_ zdvx^ia7~i(OmH0wk8kNP&{ewg=&M+ch#r<>#61fnywY3Q_(*Ee@Abf9; zAC0RA(q*tE5B}`K-9cpn>?`e+L>~oj2%Ob+t7HJw)k`dXSzc9}Xh>hN#222cVN4ww zTZ5BN=;S*FLG>>hWg1*y&eg0GM6k6uq!E-9FXA1{a9nMwu1b;-gAJ&@EoJ`=Rq;U`e609Yf5SPgs zSMRqt==w^{}6Z#rP%X!|pmIVz6KZFjN z{%(V?(c~~06$Xh4lVYh z-Xo;EIN3fQ)EcoZ(mrNP?npJ%qwuOt*EFzFdF4`pos9RVFjUsxyfk|<33gP&gr@Lh zF;8YYwq`U&krzu?TF#Ht)R^ZxncSeK7JW0)o4wuMwq-AXlnk%$OsE@)9Q>+|0m53# zmlDD_)%1G)jA?ZD^Ne4p@&2^FxkfR`RM8-5^5sN>bwGAiy$Hy7-ve5e>`}Ap39ocJGhBW!4oC#5Me=*@yOe!U|ZLZESb?dSF;u16aTDp%83o=!& z@BW$ZjJ+Q>c3!J2bJcEY$$t`5@~zZna;v~gQYwM<*UbPtA+YMpu{Eu^=eiEV)P9>D zuY0{ro^7aikJP}9TefSj7tM#d4(mxG=liC=m>Yg#=^{hGvk17GC`$Z;@K%cZ&I6KSJFBU#4PG_hWTGe}aYT z%ho-R`|eZa(BM$jla$HcSX-}DipK%x1fK4)96Wp&eT7}kuvIlXnT9|J`B)6D9{(vy z69)SwZ=cSiOn{qzvEstn{`nKp&i(AFHlh3mq+c%{Toa0GA1ugwNa1_|G12nwZRzGk zfy?_8`;JY2uIQc_Pf1_c?lCJ|Sz+Awrfq8Q)qN9#a8mD@a1vgRR`E#|slRZbM2!ec zq+EPS3ea~?EY|uSSnBwEyvR9j7s~|%cRFj+_yF5qtol9d+W-?ynwUtLqH7eL z*f|9*Z3s3;H-cM;$>PS_;FlcnXuZFKw)ie3x@@a>1pog{_TiC)hJvTe@)fFyad@2c zvI_HZxgHsqFmsyG5@_b8BEkIo1)09D8D2L`#L)jt2P#o0y?{Tw24yw2;pOP$w?+8p z)n`?m0}+FZ@3SSAZD&|q+;sL~Z2rpls%<|B2sGQ4!Qy=QuPTx2J{(BP1&)H$bkXeY z0%hH^|2?z=EpOQokL4+iT>@Qcq(AlTs{7+V=7xadL4Avy|A%2&(_ zq%rl{TF#3LUcKu%RG7ii?wxgb=ki757y5sKMO+Q|!<=dcP=C;X{4Z6QWp+(q)!hpH zqId1;rtB9NGk<#FxI342^ut(ru!=3*$Y_AW3&4t@bmkMi>WrNAy@|Lo$@Tl&++1n@ zkh(l+f5*c8m&UquQI;O#U=j`-(2w9#g<=;X^6I?|gP*_!zO@R73(>S|RPr72*&rkh zYS2o~_J=nb&CzA>HZnrncL8CB5c8j#lnD4o1ykPi$*j*!Q2!_RR29V`#vxUcKLsX>V8E4fum6kF1t?;-Mw*lcbDMOxLbm|yG!GZJ2X6I-rRZj&VBQvzpthGoT^j1sMp^cS)}?s`w+K$)}f>gU|u$UzDe> zd1#!tK_X|n3iwaO+G^^>M!ut!=(X@>L(^zE zcbvCOA&1TAVU^yc{`jT&W!?u{b4(5A@Y`F}x(d~mwjeJZW-b5>lTie1vzeCvDp zzb2Q}9G7&di&=OBBD{t8q?lG?QD3T_>wdeO8`OAwg}Uuzx1l~50F!0E+BEl9`6v|b zaG2_8yxn}M^40vk(+hpeKWn2KaBShU0A9O7VbKZ=|IMa*{6NXMRc=3ciqyY$;*I)mRKdUa!Fp`bIP)&H@$dxpfh2|7LfiSP*g{94^ebaF@;mFxA#pU4%X+HRUPJq6sbDmB<$`3V`XumY zC1dM=5WUYeiZ+b>g86P;X~j4N(bz1^B4uR;+;=NKZre@Hg~FTO%_t9-lw!t3m>=a+^xqQx^weDnYZ?ctu)!hYa}29<-_lNN@rJe^w@1wSD{p* zK0H&?cRJ5PHti*ZdkNb2mmgfZZ!b}a-li~Zt>E`!{cNW*qBnBq`4kg=Wv@&F;Q~|8pJ2`}2^}4R7j_GOZ7c$?y_*}N+ zl%?Ex7yXW@$RoUv`f{I1CSQ0eaKK7>aaB@J$SjP=nV>E)@&@CR*PuDX|GIwwfFf-=YW!+^Z^Ocn2=3>0b37e*Q+x~x>+JEkJ z7nEDHd6nzbb2u!7ayPg8*njfRu!AYtUZuUP5eY$uAdxiTuI`yT0|-104IxvBAa5G50>Jh?_*5q|eo z7!*gjCBe(vCC-o$bIw|r7?)Y0Ih9XN1b=pM*yv^Lg9@^xQ8?R2cIkE=)5)9)qw4uZ zC0%wR#R_Rx%E$|Nm_1Z@Rcbs;sh*taLwNnY(j4;X_iPf*2Jptp=5Z8i);ux8i}V-} zkDED!MBmLN!4zj>qn~c zG7Id*ZmqhRy2Mbx_6#;Zct%%y2v|kS(gvTWy5z3 zNUg$Fz4RE{;VK1eE$NApXOO}6TJ&qQ4gi~^a<{OM%`Zy868&@mws{kPwpxzvy5j(Z z{l02tGCdLh6HdXwqYri$k`j=(S!;=MU4&6aet!qK^U_DBzWLRI74de^li*a$JwtPGo4=Z%n%1^3Iaf-#vSupMX=8TP{y*l%W}$UME)u1ss@&roT;gx9 zP9TTK;iP;*yhM@j6ecDxDZl+`qu^&np$j(#NPuB=tmsR&N9d|KhEWnug6TO@H=c>j zs z6xh?ITQDq0>KJ#Pf+Ulm_C&yNjeZ>QcyyV>!>dCl4?T9#a>O!|XC!xkrL)BGV!+UNiV(6}giaUC3q%C!rHGln}k=ablKq zaKpGBR#o{G-KZ%`dK!jO7%EDUC`(%~@k@G3@wOPyAgW1+<}u^3qiIRP_New#f5j}Kwyrg_ts@2!u} zz&=m_zlp6~R}^pJHS|#$FdmO+6dG=-v-Ocz7|07zYgVKoD zJztlg@r$Oz!!OR4pCpR9Ec%7vUMly6e~h+Ltq4T!Nv+ODz|@4=)ROG@9{uqL;siN# zd0Gt*Q0E(0(@X3kIBkw@a5x@vT2xF#YHZ$Vp0hAfoU?cFIAV_FYY$!EVl+AG%htX- z{om4H)#`nnx-pNxt0Vl>lZmP&tgPay(o|M7Guh49xHrBobMi6Z|GC$kS7ld>jaX=eTO=<3cu@YOiviYU0EtVu>Bcq|BTC#R+fwXzS z0V1yi6{LBOue`G|tJ^srki?Q6mhmVo(Q>XLKa2`DmD4Rhg|T*rkW54xq3NkCOhjn6 zM7`(DV9HfCJr!O-!xn78%G0?IrJL){sY_M^5gFuP6f0d!+j`br(8J?JoA=d}qy9O6 zps=!-t-VGZp+S7WnHVJU?jifx+G!axoYJ(t5u$|rQ4`>zOAqhyV+A|5YUbr9JtOd? zhSjNCbBwm^`mQxBSVHNSiIRKxv~-pbBm?q%i9ofQF*~9W8Yi7Chj9Ql`a-=wN{|d2 z8@q$}y|8Qk4*Na+xKK;(ILwX1Gr%V0ZkCxmftVFap|u(zJ>cP0x6paYB?z266|K~r;YQiq{ZI!Y2bS6kR^d? zm!+15pEvQ*8lGNEfBOA%wANNz4yStBL#4N7%l39Nn8ATo?KtnwdUcudH)kXqAYlaXs3gfxrt76pvB|6$R}q z8>(M3F<~tRSz?bXECgj52xUGF`cPtw6qDB#B%opgGX`=*(^OU5-=y<(HCRT?6HT?0 zRt?2w$!b3vkR2?t+VIw*s6WNl_$>w>4=2mma+nl(t~0Qs*2ueL^G zw5adwW8CvK@VkX0?A3Su0}t8^l?YBulNdWK>vtXUz$CgwJ7c%S9onMxdj@;i5oS`xGBUZI^*^7x-(@ zOH~wUvW$&SZ6qTP4aW)NTX=>Su43@%TQIo(bpE+6u49c8^U>8#@3>YcHEUPv(q1o{| zPOLSRs?N5!*^I7W3XNcX)!em)=qg-I)TvV8;&#y@bvhalbF=iBnGm$uPRYyN%Mfr> za%M_;hq>M2Mpe|NyQLXbFh^dhT4kYh9$F^kLx6xAHfxY(#2k5CDR{2o>q5aLQL{xG zHwHa^hKhlO)-Lw%-wl@>m6gl;;{TbF&w%r_wXDYv}E@mzwQm(P?ee+FMk&}hqPfH;`sDz(WYMfI~OLpOeMpkzBvc((%0P2)UL?(t+BCp zK_0GjAVhdhxpCLjpS@eRWaX2$$Xm#>(1vt%s7(f>oZJ7eGtNIgLzHABk(qICf3?`e^mwF zTTUkWBr{xW)0CV~M$F@d9=pVcyQHx-+#bb*vDo~k?*|b;LoqkHMWvAWNdXl7IQf_X5WX8TV^`7_;DNx|F5`T)+aZK^ zgSEq+*oIzMc)n02XSbn|=bs80-H-aU^B4AOQ#FH)nA}B&ZQ->ugBId zKG(&><~l6yjT4WkhC7+o=`UL`aV136IIbzN%AUqxh-2qL*RScF&=Tv*u^NMTot>(| zF$=7vumw}kcv_hI&jfCGAg27X-LC|roKmd!@hhtgQ&T|1h8jmrmLIHNnY5>$ zcc#T|xIA|`;Ha42LF2$$(r@hUh4@#;rbaB=C<|pzzk2l(txR_s>|NCzQ=?C^q!dmI z3$4FrQ$Zdn=iTYPG-@35=YEcE_?z^2(9&VX61fZ&d-9358ilx|tJ9h`dTs6uM0G3I zh+IXrL)&}BtJw*@uDIK8$R^n5O@G-;I|;+{^vGg1OS~BnKR(SYBD=rV{k0z5b(Ez9 zx8#RsK|k)@U}vH`MO*A>7MXH@!Rqay^Uo;zGQYZZvvz*I~2ONODe~BBr zyTT9k)wve3NQ*EvAensZSbL}^XX^k>f@k$ILkcOPP(v-D2dmZdEIzRDE3r1ZeZ#|G zMRf*qD76oz$dSs3>%tOf#{Dfx*;8d;A}B}+JM6MLu!VJUx8r*aTACM>=Q(2eGl`B~wUPRpms-pBlu3ACcG?%H#l}(v`rq5*o0h1f8KLYzZKVCa z#!0-@C>?xlOZZ-y6HWZUEvhPUTfhtx<<>??AdBPzS4#$dQr)C*G#!GC@cp7{wv$&# zliCj(HgZ~k^N!^Yv)KCwwr95=^t|^wh%S5VV$ED78mu4a0ZZIY$$HalPOUzo-L|`? zm^qPGWkFz#W$yQ;A z7OX7njkhn9=)GM3h^@Wrtv&UUf(5{y*t*cChuqtt%?(mRn_kmc#fd2y)=C6-R8B4|W;5L~uz0<}Q@GnnzfOc!u4Z&4I=g zvJFqQ7<3UZp>lqWQw+V~oklNCvdv%Cgd+RC2Ttv@i(6<;HB5Il-vUZ=rH|1hb@yn2 zF$4F);vp9LZWTGDbs|TT*cLYs#D$$G3MwZCv0mbpwuKMldcnx9Tu@kuFt&g-0U|dq zLP-ziTR)d>k$v~yJQm%g5k3X-m+LN?U3JnGo4++^H+J%U9Gqf8_zB5C=)Qa11mf*3 z3{fNib{`n3gNb_!O2O+J*A6~92-#P`hUZzt*iYbbi}K=D&r^8~BIRK2 zxvYNQfd|#=d)koI3a1=jY#+0zm?ZV(-%DDR7G9;(JSs?scGyRU=f(Fla8><)n$RaP zPV++Vfdd?O*}I%+s=nRY+>jPE%)2bt!^iO)B<=r>3BS7$dH+DKeXE~$jE@cq!;S=F zd#?+BJ`2ExCRZ%Dwi>zf4)>HLmvAuhuW}w?bH{9IYwxTzwlqA(=N5C^*Yd^Jh%;AT z;ENFBzTwO2>#Q-g788m()RE)V5gGkX$+TgFqz);vw7#?JoZZ19Xc>|~V(&|yCqN&a zr>EQ{h&m~8=c)JxV??m+Q4){Y?cRhGjjw|Et-Nx-3Cl(6=cLHe=ByHd!h2}~@u>SX zr`2yV7j}GXs~M&JhL$7n8EnENHRgh!&(Kh03oa?8+^s_PRx;TIZl(T6GMv*>GPbqa z<*D-noI}_g#q}DVt+gXFG(LW5Z|R$3i=rUy~iieY*+bNtXtw2 zdu1OSLiMu-))Ri&fRSzeG=ACLx6pUyTJ+E4BswBwr7n7WQl~RFOLLb?pE4J#8&8HH zy=jTiYRJ54_JPYTFR!nAqc0oI$`Xy`HiCu~Sh?}0%lLG#e8S+iJFG6Q2~W;~-oGb* zthPTl(CzpB5~%udZ6k})CmvM}FfL?bAn?;*Od0WORBW9mhsV<2@L)RwU3utemm~fK z!tU0^8u1lj{;>|&3Z6pXk+($H=v7ge35sOCuEl`KJ8gQ;!C(Ny_PR=Le*QR4Oi=yL zMDiR_sJCrOEu?pv>I0awRuH&tl3gdjcFmogTzIyJ-~RKG-{OF!;b{^6eB5kP`PZaS zG&{d3xErV*c+hFGu{`Zc_(kC@TtO4px<#OLg%>_mFFSupV9dMbhNqE-fR)MGQe3)2 zcd_RkERkp7TK2l{BF$WPWP|e4nB4x?n{+%;Q4|z>VIicsJ znhF*m%&XROQ&>D#+w(b&hkko26`a-az6ohMH{w%QpNDE!`DViRYg)}syq8rzq{YWG zHi-K5oQwkBCFxmg{)^Rq>GT55F|zCNAHc-=fwu(Q2_SA^UHer)K(Kb8>c!?4Xr4y- z!6$H`djjwAh+yh|dUSgDo&qc*7r~~4SZUMra7kvfHZ4Vd*oIKzi7N9ZF)!9Yq%$Vr zT3J7^vco|!Sd|TAoFX`IMl#-DnG#v;pJOmu|Nd*maIX>Yq#{w!I0(5QVan)Qz965h zb9MTd9H;&xM4_X%y5YpT8FnlX{NHh3-zE%Pgr z*{m+NL{;a{OJSt%h=|8$70u^8R;xJIW^6m!d}J4;w+aQ#w%ln~E0w~fA*{^E@aI?V zbCD9FV}6IXm`u%@gtX6k^fOm#78&mJVq6Q>O@wQ@Z5m3qHy!*j$$V+R*~?2&8oUg< z=rl_n=k0ZlFVXi)Jkb!d)ynIxnhm*d+0KN#fDIUW82N*k>8GWq69pWBln?$4Gv_X~ z#cR~euK7e!3YO$@*7%{a*RO5s{17^Mvga8kfRiS$Nx-;MAE#ipVViKJAv1Uq!&z)m z0tCT+))~NGZoxC}urkmsogX`hm;z?wm9MYnEivf;W_&AE5H0tUB~(+msjs`YbJ^sw zxlpx(l;#h5PCVbT3ujYrJ$j=SIV+OhVPIHo7qM7iTDabIPBb!X+33}oL>(`m!~qoX ze_&?*BdBE-;0IJ*s6i$?1$X1-mU6|dIWA^ZhB9rgu(%ghqxBg$N9To_P_#1}nahV9 zaPzum>oU{pm#ZeHRv(;X04nj+yY!UV zfwh#;@5Mr*MQRpk%mL;eX7uvd=$80=CJQSgmES6#)uO9bt~PckN-DIpVoEjj-5|Kl zX|hUxf;{2NHO%@LgNU3L1K2uFzGJ_ZFBFaBG|t(Yv~IxA_F&Ujme(1Zca_@|DVSLT zlull3bv4?JD>!6kbKKhP6X4sYjD)N?`jy31E9?I9aAgpCdUrDL4eM%TKSFn+rpdR!LGISb3a6lP zacC}K!B$zSaruOr!qj3nt4XtKwX&aPTAGE`oAZ47+DbBBMQ60%hCZhy*kWjW4lId z(=94^Vl2X?$bz!owK3mj_%xD3ai71=+G9Cp5MS3Ou~M|9Zor1Euu|uj<{(Fe*4-a# z;6yN!|7v80tt3&V28Iq%Y9o6^>*6y)*}~Z^S8sSe0*p99T6OSk`y zc9!Z3achrKdH!P9FZ0Z*F$;}91+3lHirCe)17+MdWsnyi-Cx;Q2U;7uPfcZ%K%dU| zgF9T?IV))*@*9W5!qO{s6O!|}+Cc~P5mb9!Dm(n6h1^e^o4gEIh`gy;&3q#Et#b}O ztL$AVb{qpHE~oU?w3%vS_Ldq=9v$oh2LVgfb3jyO_NRw;$Ew%nX~}J?nHWjoZL7H5 z`Fol|{;|`!S{;ICmHm!Q+slRGI%8T9W-~{YtMO}s%<>8WE1B}$?l?ULB?V?2`_Gai z`P1uT*O`TPTmOuOz4(IuwVS!Q{s(&R6TvbXKi@n_3_-W-E|CF+(`Js->Zdw-WF7e5 zkQjO@QAqwqSaIcV%3IOuH@h9p4fwJg2OqRLD?uz;_x6^ZVo7YeKeYseI8FfD z*fi-d zQ*MMEUl)Rn>%2~EFB=+x#=$V{XMu@@|e!|+NR?yB)@Mi2Kk*jn$;Tm z&Z7*PF8dTUQpv%2%zxCj;9VyRIaB$uKT?==c5+1@%u?%2?JuYvpADZF0-Oj|@dM1x zSgt%&-3_Sp-_0KLe!rDtuvmdgMcmXW&e@lnrzE^7#a?l><6X1Y2$j-`L3;c)>I20; zgLm;kTqNv?c1LS#XV;nX7M%Z#$#XYFXz|$@N9k_&Oe2wP6&=mB?;hgDc(0=|ly}7F zHv6JY&7A(*+95FnCG#Hqp0bTM+0IVUF(TUcLPj^pO7}1MOZdhuFZCP0OlQpGb=!Mh z0pX5=w9D3JKHZ%QL|QyUB&ZCJQOh5qZ2PsU^ypR^oBpi z{ntZ#(vbRzP^%0f|1PyLIayI(KFbbLCP!=w{>|Q)PpnKu%~oAmitCkdh$`j)TG7ke zr|+JgfN1HfgQsBTs@MJ;(=a45cn8fwCtW0DrQD^B+(`My1^i4oM`8n6r+W3GoyH)L zX=N=@K>wwDnxY#EEBWZCeiC}>LW5jsqMg>WO=eMuYf9 z>R~ZbJCRwb1nHJ0x?y9f7B;%v+;!7gbSf3A1MHNy0sWwrn1wB_QV`Faol>4 zV;;wc5ZT_W=bY^(NRY8kSxxY)2k!n(x^7@C@;w88LFZ|oT7oql$U>R-l4{`=seipa zVP0szf1#AZ_!n&KB&`3Za`T1yQa9DZo=A)g9QHlIOSMe(51$P*r2GsSGf`${SUtMC zXXMz9eYy-3(yAU*X|T%K?s$~$`<-zH=FLGUI;?-5>uTB2t7J8U$;w>}yE`BIcvU1R zXzJrCLnE~SzZsM@-ov!sl=t|zL3NOE!~zoO?lSH&2e9$|4x zvv_1=8gQ$7KWP%xeS|Boj^$u%-uA5KGjG7#xK`L@_u|>#6LsU9aSPqq9NMH19*bS6IcZc0CSh7=R=_WWlK&+rYaAeamT^U5TZg zW0TJfE!q{`LeIQ5R&rV1&r*F(fA%Qi&rO-%JXpcCf=X4nSQ_c*xgL@&6653bExi^3 zp1dv#b3Y#?-Rm-}@2Y)$atga+PK0~-dTl@pdiUv8B}1dZ{uBCi%YuCCt@O!DeYQan z2}T-dJ#(ZMXvGTZVnUjCek|!jndn&JCHtz%rtax75B*2SlSV={NU7Hr_ zclB)ex*HV*gZ>+1{Ej_vUx9z{-5JlI5%DY&;QOWXmfP9xA9>7sJ@BT4DkdsK5fK5U zqM$?=fK~X5Vj6R;G;S{JS5<~H`EWf&h7FrclVzdkbHed{c;72WM7s(G0R>w)?lo03 zuJv44MeSn2@0Ocg_XQ-` z-SDryb7ZaAEHy8s*p>pq= zz5Tr`A-BB*e=wEZ)|*|u=I2_sTt%~zT>&Vr#*t5-<^7;A^WFU(PuRW17WA+RCqFhoVT>Hs8V+wE58P`J2Zryaoah zm_g6vi`1I~P-}LY{`iO~u7^k^-}k$|c)ab`69>iwA6-3VE10t9;44X5OwM|Y-eY%`SJ_x{~KO-$B?bfZ=dx(b= zSY_E)f%-*euF;CGPOKPv@=EtNLa`UXE=!H|qm};)a_^cioJKI7(|H9Wtzu55>(!ch zw8f^&OJ*h3Hpf2(`hUmlze@2HBlmbyc;{fWfMxe0_1^8T;}L$fOFNF-m&+@G2;-HV zfW?%pyd;sq4cychqbP!z4ku2Tk0Wns9I!1}=hT!xH`E5ecL)z5`dxJVEDR@%OB(v| zqA=Cl8^aiUu-}t~Zi%1i_TNH{6NYI)o`W&Hv5AAEr9yK1;P#^8(_u_aH7lk=ox%1G zC*{LdZh3--oR7^{xl38Cc)=-BS8hcFl$3zavNZRUh(RyMGGnR1)_WvsYXky#vjd*A ztE||Rn=vjN&bb|S4QJ>bE6`BIq!=a!1r$_G8FTmTBLK%Lp}MaMA~!N=E!RYJk6N{J zjj7EeJQN~l0KaY>j2Cw6fPbEUOmlpHSQB}68MW~>Ngbv2vmJdkmWsN^ee|vC7416f z<}#RvO7=#o)x!T4ng5a=9RK$3f=7-jnPbl5j!zA*hjx3{?2v8jREQd@!lMs&n|?x|_%F z5tiy?W}EGQZJ+^zn`f=6%P#w$i}3$5ra6lDd+2a?i2ZL3SS$SO>YFA8sO?#x7FdSd zPZ&8pdV>z1b9<8D0@kgxtWFQSK+{zxM=BBXRK60Vi2xS2{dD}jYMsdY5n42C^w3th zfwlDJKMEYRg7o&C_~z$u4-c#ktJX39A|L0zA0NK=Bgd{ zPv@6wD$gL493L!)ZQY0sg%T_Kcf?%>eJzzX{QzQ^{~HmT4|3BH3L$O z^IKNbAEJz!)D@|rw-cY=RSdnzjmuG@iE)HjOF`K+)c^A_o1Z}0@C!b6Qyj$KZ8H!y zdVz1~w1J)5&SQbAF>$H^Xg6hPf{B_erf3e4xKu5w|;(yLl zGu2e_r=(}utUq$h{4Juws&>r&vYqjso95D~TUzSQL4f*Vp)eFE)fC!Px}j8fli$mH z!Wu3eQz^k^Nz8DYku~l6)EowTVNB{S^AS1sY3Y1rFFiJ%?IA=~r+Ay6duK`vGbIY4 z(i!*kQ?7mMEee{Jzx?ZF_ui!*ovmtw^_ERdh*^|I!bsAYo*eNzbb`OX3`lzn97C63 z+#(2S8SIc*ZF0l$20}C3W3D3CeU>wd@Q7RGjKN+3(&8k9BDu8te9sMwA_*Phd4%P> zE5_hV4#oREw_or?T5X5Xr{hI&HaeUB-xtppC>w6U<<5Ep2msp9 zU`FJ@$Jp2FnSQEPgn**e9@fJHE*|iLTgRYArkB~jyb&~)6Bx%z`LXsM7MGal*|z_c z$em>pDv=tRWdKF^OkC@txJWw}o15<&HeybWUrvZ$Xl;B%AkXDpKJx>?vWY`xO&UTN z3ByqWgO>h{e4msbv(|)JHqB2g*j8h7$;}d)dCiZw7@&=i%ACLgF!MxU@D;!Kp!QK; zUVhs1l5tvZbf5#V;A?1RoXI0>ao%>F#Q2ZBQ3%6iYLrYPQN12&aVEwOs{$$gn=3qH zGw{y=0h7~=D!MIhLho;PbJclEuo%W5i!&ZJO`RFun9r}~)`Out;)5Tc}d%yC;VPg61 zU81WKfJw8od~lE6RLCY};l7Qv;5@wim|<5tz8(JrRpU6(`{Ulld(x2pioF5+)cPx>Pex% z4N{HBHKdY8+jyp4E)Q7IN_q+Yth* z8{*64c^LeVShJNOGA`AQ>^s2N^e3|%-@3=boc^`Td|8~x4UHIu!Nw0MvlP8T@UG)N z#QSFNkB7D7P5w&G$#5mTRh2W7Lp6=v+x1_dgvJ1_U z*$2_|=cQzmUN^|8$zY4*-OhF+&rM#{LdNBDV_$0;+Zx{oZ5MkCPctn1$d&t5l-|eS z#O(8N`D5WT$}hv0@^ZAZ7Pt|j- zhs(j3Q9M2E{(6O+0$>bt^fJ#=i5rt+1v%$o8PfHk{b|l~-YkXHAJ-dA<$dRgS)qZy z;&FsFQI#We2M5gy0`KJ};AJ7NXe}We4z45v9qt7a2l~qe2omAP`xcxN2MiKg0xGM= z1OYP~#15Y$G*RqCfUJN4qnY34mA;fCtzC{c<3iuweou8h$e>v4(jTx#VO65%o!&}C zf|c8%985(9%&q;N|Lv6X=Z0?i=|aS5bD5yQ{G|Fb`p=zsiQ#4;Mh#6L8mm^D9lhgZ zODU(x9rYqqjb){x8=>ND$!I|6qIF^v+dVyHH*}Z84X`QpV2HP8}9YojMl3rlpJFf6`#GPUOHe~=~EU| zmZ$hy{=X@6Yp@^h-->()xJ_`XWO{;_P@;RQ`I&y8IL9!E#zcv(iCg{H>%qfwM%sAp zz;&q0XgZK##(#T%0ak#;NU?%bc8mID3F#hea>cRVzxw1|lONa-)1SvHYgKTCtQGaU zuR85MElYqp6U6UUV(LMBN%dmf%=D3a>Z|D8i*l=t-fDZcN-T_^nv)-d>3n#6^V>g> zQ_FS}TyPCWxhwww`A2%I53)hQg- z1u**=Wn7FG(nHByy`XfdxIS6AnYncW&jNpde)R&_-yVa#gB=+^$`t9oeh1tfhi_xl z+*yG64Qo!?J1>75JJBfZT~F?jy%|;xj;R*;&y|)*0E8Qf@B+OFHhW6RL5@YR9>FG8 zgwVA8n%0N}7~z$rf_>4rTdW~}6s9HIzv3AA_^e>}Nv*nKUK1bhDi65Fy^fGG>#V*K zAnRg=Uw}x+9DwN5l><-R**yuD6W|k099f=-1M=1Lpn4!FNbO+Q7#|!k-){XZ5hz{pNdpo4;bqr?%V|c*R!D+DyY7O z+r0Igy)I{W_hzi~bA<{I_>Rw8B7r!oLFWdkzcQ5YPh+!yz`p9>QBVh?{jDbjC3M&?E#1P3J^Cvei z@?$<@Xb&ou;xXPIE-hJ}C%uc#8rM=SdhFjj&7bjFn>MS)N7KEnBU>ykrxKWWH$#MW zZ{3oEl-||aXSE(Rrx5eCP_gwqP@P{BtOS*?ipU3|w_IHBmhp!BT2oIv?aY{$!}S#3 zF{rq%m*AOujr*l>Y?tt{=EMyfuX@PV15GtcMNafKptb(mg!tbTAlni@C+=17X}WhK zzyB!q9_aKBvc?d_Ce1WgdRNt$d7~!nt;MVhlIPyngDBA=YklP}=uXDlM4%oU?iR;7 zv`lFJ!Jr4jR?z|XLR?WCKXnSLYiUyE`Frz$P~^ajp)yzba7TLE?|6Q(K;KWZ-d11! z$N-qcUm6KPYW_L8pF%0e@K5Ly=SKO~sebm^Z6+LTIfO-?h2}^u7%ROYb$I>CeM0Pp z4{DYDm6DGX6QAcWOuG8DJ~n&6Sp>G6-?1BzwJBGoeTbhY_c3;^xcCICfe546rp15w zr1Hn(2pQKE#;_*Wc=NpO-)V^NAhHJ4_h$8Bnw#2tv#J4XlS>?vio&Gv%fjQMZZnen8vBfAC9g=#n+2gVSGUjU^= z#LIoah?IOX{Rbs+z~q;Hzd!1R+@Ua6Yv)V40W(SFkb7E4CSSXU6 zbaKCVH=$$A{2pfWTPma#<~1S0A0gtR^&gP{FT(%)+byYQakoX$)fJ*~1j8%|BKMc^ z_zs#$dPc*+GUU0t8yp4)tC#3zrIINPbz(JSp9cp0@=@1EG*=~SE`=Iyy43!AS7~J_ zGmPt^312z^>ku zYr!HtJPB{c*P`PUFQoJM8~JJ_yPzc_dtwIe+|Ptucn6=Jwq-Qv%#KVBdURjsS=@O~ zkbZkZcola~kY%}=HQ(Z!$3%UBLZ;%Gly=EPqMGhNXgmDC#5#G|Cnbozo&dmnnq=|9 zbOizMV={fsVoivW57UBE4<<6joBBLonb{7|3QG<$xPKtj0-k^|v*!Z*?v(tecNLzV zc{^HOmvWxG z#85TFPx^6WyC;~jR5k0Ga$QMPhOxH)1areIZycmDs-WAE7EV@)BNR|d!WyMW_f9ku ziipYx>?KoAD=)Vpi~c^DJC&t8#L(bD63!~I7{6OVdR79L8w8uModJxP)E*`Ln*SR9 z8TKXoIq)jtt~GwF-C_opuxr*PEoEnZ65^PERo?md<3za@I*6|WWfs-An%vdQyaDSh zC+=%5H{ErZ&yWwrgbBMV{SKUj;Q7yWqe*)1P-6}AL64I#R1hTD3^d!!^H)1CQF6N; z$3f9BzWNWJk{ZR9#T(3yiFS3Sg&^HNM3=vDQU3Cl%L7@m#xoj*nS7&(UP2(M3_b5A z2~Q(K%g@9zkfj7kG>ueiwvhzVa^5L%u3(s1os;W?U-aJUWtEF>)?K#XwOJVWm+1d< zu3>MHaW!joVBM(|!L0_wy@W~GD-LKS>*?9g_$Y}_($ezs*r|vHd+OI)1R7BGiH4MB zXN%iT2$>r!wAO{itnRN81XAQ#tX30?Oq(>LHy;EUGs1?1{N?3Gpv5lUVM|Z2+3X4^ zq8`}$4z`lfrJoH!t=S4xGbJb-w zRLpD>Uv3QiDc6Vn+SsoUaIN}+NIL^qcls`R^Pt8;rpWUz3S$(BWrzBp4@XpPrAhb* z>v@3io=Q}*6ud?!pj+u@_7Sqm^W z8Cvrx6}sBtVAi{TJ z6wunu4sIuu+63Lz9P+E6B zs#cby2mg?Od;o;O;dUnby>Dd+`dx#34`uAhUEmt0LS`61VwYbuN=T54Q=2VhKVi0Z zHxC7NF>y%UVe7o9-!_RGVV9g~NlCS&P^hF+_x@faz|(Z0ATX^6Ru5wUFfr#`UP+9* z`Db~0l0s@l3FiN|jDrNp3&}aAMQ9nH-u+RvkjUMO^Q}Nv^n5yodU09??XG~g7hk|s zmp6~H4zT~wKOdK8j<3BYc~iGHq(lHlHA=7kW4lk%H^dF-yz<|uc!)Gpn;Tm3vw=o;?M&Bb`EPuA;uELz!^c}Vbeb2k8%N(O!cxn`IfAb}F~vS%BS)@|hH>AYa|1Xr-FAhLcO;*&PVU zL_oTXsf7i5xQ^F%TU=7DYj4V@o^AOWmdAN~-WrHZEZ!J(CQMn4_k4cOjq~jk?M&yp zD3>jD=&f~+NLLpVQt8OLilzX&62-pF_nI)44zm>p4p-860S!khT^|pr@AK&pi8)qk zsV4tsCBwg0(mcAnI@RS2iE1RMQNBKA{c;~lOV4px-0z>+qG9ATfVvz2YDa6L!v3YO z-NQk#RLg)e%!TA_ZbI`=IlcrLP}e9O2ujS|@9EG4Q2Hkg7DlgggU{n&tgxLwVt+#k zJ+eeoWgMC<(I+n_5yL0BKY>ZROzd4EjohxxC1jZNuk&o~2<_2~fM|F~tW~hD7xIv; z2gIgcY+KT|90jH(bjA)__^k-Ze>43;^%prcY6cJe@TNE4^j&T>16Vkavu+U zSx;z$^AB7dB~#?sTRx2l5;sCyiaXlh;Mv9cpBs|-E))Y=Zd1wS^fuXxM=trO97buU z!>6~-=Q!6emQ;q##*ZUI575$#OUAhoI^JJUfI8Ki_v2@KsRsr_Cmy!*x{CvfQY%im!J#6)N#XMJK)Vf7(AEPSuL?5ZFF>L9?e)}Bu$_?;}_=<=F!+o)I)n-80{d%qpV4VfG z(X=QZ55x7{vyn!z4-#NTAlbt@{Jj}=Tt(`Ga2?^S@J;-yoiVtTD`uXor7^V?Ft&6Z+3d4_dR z+my#@KLLW}`6n_-T;HCl4wP1$zD913{dn)4HoSVml}>Y%%)5(rmFHV>-Tw5atWUYs zNbbDIeIgj&EVItwJO0igq1-MO`v6Lvi!gm35@C3FwO8sE1L&Xh#(^~eYq~L8Ar%xX zkBEO$Zni}8#^o-N6Z)0#>(*yQ0saOelA8u5#tP|Jld}C@0w}w-BoQd+i9htb6`?w1 z=u_Bg)uO|MI6Yn@_-fbP&R7f=IT#4ZT4^L1dL{x9#Wsys1WGl^-s?-6hr!`AX6eDR^JhdTqwv2T zLy0iZdvbjVpfj$rO%P3gVs>3W=oiLDSh=@jBxhIyb<5%6pgXo2+b!Wh=82*B7?!KG zSxKo_#pq4m%E`a%E5DPhq2gb1jcR=wd}c$A`G?X7g2$%OwUwd5H+(Ex8}`!q)t7qZ zRn~Pl=|7(+g|zF*Pf*$1fkSSUcz;LS!S|d+4gY{^g=UvokLPVFfCz~Kw~G z_}`y9< zbZino@9TpR$z@gTIE!mgQ`s^RnyX!@w9K7uw}ZFWRL23cZ2F| zSs&g6DN&=a_m9y)BzIOH2%a~^}P3Jb*KKD z8r1;uJh$xEc!+WHRK$0fdYL&a5pyHbzl^S4Es;?uZH9cr^T9t`2P&!wn>OyTAfs`a z92(1xk1Xs~GkMY3}dSxLRpk)TyIOQEpxy>di4VkmaHwdqik!a&j3s z)NmOg>X0LON%(Ik@>UGCc~yQP5B{wzafh#aDKs8It4^|~j?5v~kH0qDZsc0l8imD&Kau#m0mB{qfb>^$_a9}Q7Np?8zq~ol_%AnDtNVcsH9Q_&uKgFaa^fdA zf_%dnQs?P^yW#&gAJN%Jx8CXkP%SC3Z@nTJqOQ#OQGoG`?}f6;0Ko^&Z6SJk4}fn@ zJ)hbu+~JpTW4}}H3F3I3Y>H`vm4c%uo~Y#5<;(oi*~c*p<4WVO?g4K}KcD40&Y8!D zzZ}Z`y-L!W&MtRpLXWNNEU;LF#=Ajwo9J%GQ4oo+Ke=+|=i`hWZ5r#0eU#^)Q||Xz zW_^XQvD`2E+P7i^%6{eh3UZouRZms&HE@yF2s}G3br5x~k8c564vg*&42-nP>sA#X zMQM-;Cia(UI^1whRgy! zFR-8+ch>scV9Sm{?ee`}yXXe2KnLbNEc6pg#Ifji{YWI7U1bB;9LoC^dpI4i*yf5! z1ql9g@ts=vH{fPjL4R1|!0NsS1~4ZqH$5#kseKHF*a`v?F3Rp@Qi~>B*huP*^|Eri zFC(!=_r0%eEFHDekyx+-%GD5}`Y_@J?x5h{@!`P^VjSOAu8NOUcVsftJu#Yi3E;J9 zOq03#Wgawm+XtiMc-6`NdI7s83YH=ru~O{G5uUgE4RwqBL|Ms48)|P3E1jJ` zpXE?RUMepyc$)~41KGD}rWGtJh#f}a#949I6x5Z1k0W{Pr;JTpL55T5mvbx#k4KaQ z_C}(P3+|r= zc9{7594I&x2&!Neh)|i8gxh<@xoL7hTHCMCIaC-7+-|SoJ?IGM${IgLi2OXT_ zX=NXwkMCulEh4M99`E?(0 z351VxnLX@#-)&Mqbgb7jS2UnT=sY#A6dFl?w}>r;%J;Wuy$dN1J|lc|ssDAJ`sd`LoRI#la;s;W&pLYw7I}N7yjzP0n3Yv-sW`Xc0otCSGL!|&!qL^E&SB?(s&8IihTgjK%YwWfvpmMUT*At>IVp|NLj zjyMlEPWp8sP}YN&L}YYrY!1Mevu;*S>b~@R!G-r}QSV^XpRLBuiy~!b?0|4IbD@!edL=$g5E=WwHh8k1V@j6h1rhf&(`+ zJ(b@NV2x7;Q8PLGr0fCCGEh@kYaXn_F?m+5QWi7BkQiUq((9)X7ZoLFH)OvVW;YYN z20)fxA~RPJeuKsWk3zlDdJ-nsbvH8%FB9z8=^Yi%d+ZLCvcA}ic9DSfn6C-V%;+1OjU|k!6X06p#e4ei7+b(W5A_(NaW8DE30#ra>4|2 zuo%$K>+nqDWmsN=4u5PW+&E@!PhWrv!wNys(wB8BP>@qdBRao!>#U3bk{5eH^5O^} zueZ&c&$NfCgn6_+X*e305HIi~nq1%7EM`kmo!()b^IbyQV?Bs)mq1hDV?=-W;OJ0M zx41DnGg@49M8~CV)fd>A%r8E%#L%#W`mVnFadxb0Fi7cM|HU>ZmTfdP?uW4@aiX_} zY^lMEOAEGu(MUp&Ek>|mgU<<0AMI^VvB2IZn~VLQrm|gwUr@RRe2gh;lmfEHuLU%N zC0-It%{Y<2vfy=eA07*LvsvGuItWbESa_dJ^<-be-+RBQEkqE!X5GtjpSlG}hD@A0 z31)~xjSyxas&+FDl?wi?D6wJL7V-BsUg%~_JoVBBD1@ga@F+g;m^;b$H5v9-`4F1( zFQaFvPVf4MX82LXPXndzGEB`32U)q23_1$5bYG-D{6v^X4BVxE1(-G}&?iVFTu%_$ zcl+Ye+kKz+PCRA_eQaU8mKw9wDk@QltBJN6ZGT~2r_>5gn5FqD6v!P>_oWl{@Wtk3 za^58ws%gkq5ONq%uvt(~WylB0ks4On{s;4$=l&MlLg5h`I1Ks7Q<5|+GGGaLA8NE} zb-xSng11E&+KBhlX%{$(?Z^Fy^e?{P&9j+5dy0AL`w*dAh=&vvA>4a&$+%T0x~1M*f5uBDa;irxL#CBHM|MyDr-{r3u?=r60=f|Ij`j2IthRF_s*8LfR^Je zK2Bi0_n~pLpKS6|-~+DCT@(YAdUQhn2gfOtG*;;7Vp7fnpYG4}fE*`=UmoP|YYCMC z;|}u&s*#9vR@Z%HVd;xC6^PeVT(`R8t~TMe zl&o$yqaH6*7~|aQcd^iewYBF~*|oCISv)>vCgGh7yA{YzReUyRk*;L75p&I$#!q~j z=(eQ+Y|aGie%rTNzlSR7(h#@`lOIp-s4xj1Iy?Ya3<=I@iP5YCpoCX+q| zcsbGO0?rd8@#f%w`%zWzmi)JPF0xNMUBXX3UT4=PW3S3|aJmH;eX^;CHZtva$=C9f zZ&L{`uNkiFatiBYDhG}9@kkzvLpaEo_ zWp}-C6}~4f3n|q$g#gC5Bt(o82^4PR&++`ts%eL5hX~)CWF}(De^-MQ&cBeqeokmA z+vEChJrljWJH~Vzv(th$sZVJqx$>t z%}h;~gh-6kI8^JG+`FhZWb)z8!RW1g>$8YRg&_SW85&V!%}HWV6bWc^5uaSjGLYTs zc~OuVpHXw+vW_~U2<{2_jp+{2N~yUVk|L(y9hv#m8$P`gcPD==USV3Gv}}Dm#`+Ak zc5|p!{}zOocBJzXTl9K;Rma!49fRmGn1f@7F*h}z?nEK?X^cMhCb`!Wg%lL!l?YtD zB&PMl9|=tPUaJ!NVj&^I&POjVMX3j<-8CeuB4+sb(!CSqU$+W(O`Z|d?~cHaJ|2W4 zo7!&Wl(gh7%xm;UiMA`W!up5fSw-Ou)|S48GelXs z!*!$Kt_~~NP045Nh-m^~B#{yh0cxyb5GD2!0ua=-DG3q6>f$@k05J{+;slHB%<|3+ z@g!PFr8lQ>i3zS+HdLE|}vNb=eJ^6nDS%v>xgNn&d(QYtzF#U2qiZ!*^P$ zogT1HihA3-N$Nh!`K@eTo^Ej}l`-UO`ApjPeXB)9qmb@GQ`%wCM@?+kJ#KPazNTHM zX;uVS@8$;1K1IRc=7?5&7;qCFq_tXc**+#~44d0@ysz8k-m)r)3RSVR<=P%Fak88k z7t7p?tWCHV7U*-xuQ7{gSS2I| z-Vw(2)jjK$r-+%AE9jn@g>?oHa;q5Ww1a$IQZ@ySgC;WuOdLw(Q8mxmZNS;K^|AGE zczR<;0j_O_zRO?vTU-m*=O$KT@#Fo=c2#9#^64NDbX{go08Bs|(7J-%JqWMnWB^CQ z*n!y`)o33#oEV>ba)y`WgCMTYrt`d!O8Qa1(6NYOB^?Sk7xu&V0fJN-emA}8OI$Fm zc;Qd{pRq+0Bq|1RWnL$(33^X0QGzQ2{%vUtrD7)Pv>@)13VwN^m3zpO4u7xyDDvgq z7x%hrc@@LK;J~$1Y6hVLjwpLi1~*4l4^eJrUpdKO8je?xQ&1DrtQKsD8dg%)!~1Q# zt+kTM$@9tF>a9%Tr5Km0IvH3Td(&Mih2A={J6Mi&Y1h^fM-wDu>6n^bcF%Khlb*k* z?o0umSVvu!aGOhZo^-1%O0_9Mfn}v;t385<&U!=~X8z=N$?djFD1t^-#tAdUUHSDf znYHrdJM3%Udu(P^n@=0l4~(UqlP@)@r>+_heec=8u{G?@j+n19pNSp9CH2Y^_JBiV z%4yV{QLX|XFQWN{wuc|A;cGZGSdP8DVdFj^Yj}trN-(mx0!=8EJrAv?sBLr!? z8vjb61f67T$-eFA%^~nHzPF4QNbj?R*SyWwxk*k#q6GH>cDU4T%wwMv-HBB?Zn3B8 zGDTA=R#h#PN-KSC@PiSI(XEV?0^$@Y^sP9dT;*k1SJ`jBX4ix@doS0tArE#uK!_y} zRW4|B#QNC^5ilp2lGx3eCSO!|5X#K+ZEW3|x^`V?4?JEmO3I~o4x)*2x(~56Eyv^6 z(!CyxqxUiI8ylLnWBm*h5~+$%TN84{Y|`Z8J9iLL?(sJ&jdi%R+oj&MioGMv^unR> zd4SrbWYU0zlhuw3(H<{JNthEJ(W-@A)OnvV<}rLQWck&R$+F2PMnV&~6Xo818s4)F z8>(A7y0*8&fE@Q6q(q3wW0!fq0urzp>W|w{X&p;XLq^skgoN`fvlx*FrE=_VDMG9P z#$W1Dzji#1l)H$?Zeyw;-(9uXh-wGs*g$T7Q7=%Xux9AQ*vT<^AS=M13#Zduz@(bI z7ObS=ey2`~*EPO);Qm_}L8|dN7sQ{gZz0zI&Wn4%e4>qLHg=nIkJ)d3nhPd|pHt*b0%;NhyAtm#(lsB9iuHhy6+|_?&_t zRlL?to@@(FE^gTpH(0Iq)zY=$+G|qRnnS)c7l?)v9?6{1Opvj5cM}QHLF&6?!E{tL zPBFGoZ);>I=D5v%+A^Gce{lKuN%FlU2e~JVY{`@B*Pq`aqlqjP#VX%QVj=qhU-&1a zCdTFNVT1xStqF~2y&$NZP2?;LL;LPuu%oU}PP^{1qWTC0YbbS7B38%6{U)d9IFKJ$ zzM)XuXwPGC&Jdi{CB)Lshd{YeSJIQ@y+2%Cvj;382O?};ILVfz^*{?OlXJE2mh$G!(%wA@?n;rphiE!7b^iChr&4*_ueAV7AR=ZCGpmivxCw~38c z2?|+)Ew;u=SQrdCR?}`EaYG>p+%-b5_uL>}C*fFbJ!&5vCrr@#{s!L>8WC?FD8-Dp z5a6&A3Bg}O8CgsN?it*B_=%!AG__i}XPDhFi_yv($KE&Ps{$wa9`WSdpc| zDOA*eCzEkmFSAPi7X(uAzQxi);CMdhz)L=gNcj(8W+9PZL-`|6wCK%ScX)**IvlWyjAAxkt` zIul4nG(XUMED`}0+}qdIMQkL-{gV!XY`$K@?CLtUR!eiX~*~90)h#Y$>pm9`5%z! z=L+hQw&gRpS3&vzs2C$4?8(l;m|FNM4*cgGt?-P32dlxVuNmh5^HP5k3_ZV^6#qru z|MrdzZ9gzc0DG(OE9Co6$`xzvo44_!2qU|%Nz#8B1^|7fN8_(os`>xqY-OeV7Gq5G z*k7aTe{ONZJOla^pJ+9^?cm7zYWvp=l@?VL2W3_wiKy0ID_9E$MhF|Wi*QG$`klEBx`%(~$ zEe4-+X;$qtLBIf}$|*hLd@{u<*YY_AmtTkapr&z9O%ymbc`en8c;4|cZR$L3w5$uc z*�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ⅅ)}eNx*0o@T*YZ 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�-Xv-MhCBJR}lJJ>ihYBKghWG1nl2(DB2ylf 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 literal 0 HcmV?d00001 diff --git a/test/index.html b/test/index.html index 6090f40..4182187 100644 --- a/test/index.html +++ b/test/index.html @@ -1,63 +1,110 @@ + - - - + + + + -

Monaco Editor JSON test page

-
+

Monaco Editor YAML test page

+ +
- - - - + if (document.location.protocol === 'http:') { + // Add support for running local http server + let testIndex = document.location.pathname.indexOf('/test/'); + if (testIndex !== -1) { + let prefix = document.location.pathname.substr(0, testIndex); + paths['vs/language/yaml'] = prefix + '/release/dev'; + } + } + var require = { + paths: paths + }; + + + + - + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index a6046b1..1b557f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,43 +2,17 @@ # yarn lockfile v1 -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" +"@types/chai@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.4.tgz#5ca073b330d90b4066d6ce18f60d57f2084ce8ca" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - dependencies: - ansi-wrap "0.1.0" +"@types/mocha@^5.2.5": + version "5.2.5" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-wrap@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" +"@types/node@^10.9.3": + version "10.9.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.3.tgz#85f288502503ade0b3bfc049fe1777b05d0327d5" argparse@^1.0.7: version "1.0.10" @@ -46,512 +20,36 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - -array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - kind-of "^6.0.2" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - -deap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deap/-/deap-1.0.0.tgz#b148bf82430a27699b7483a03eb6b67585bfc888" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize@^1.0.0, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -event-stream@^3.3.2: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -event-stream@~3.0.20: - version "3.0.20" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.0.20.tgz#038bbb2ea9ea90385b26fbc1854d0b539f2abea3" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.0.3" - pause-stream "0.0.11" - split "0.2" - stream-combiner "~0.0.3" - through "~2.3.1" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fancy-log@^1.0.0, fancy-log@^1.1.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - time-stamp "^1.0.0" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -560,210 +58,6 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" - dependencies: - sparkles "^1.0.0" - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -gulp-requirejs@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/gulp-requirejs/-/gulp-requirejs-0.1.3.tgz#0cbfdc3e36ca20bf50332f710a4df7a36a34a3fc" - dependencies: - event-stream "~3.0.20" - gulp-util "~2.2.5" - requirejs "2.1.8" - -gulp-tsb@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gulp-tsb/-/gulp-tsb-2.0.5.tgz#7f7791f7f54ce41c406382360a21f5d8f1198d04" - dependencies: - gulp-util "^3.0.1" - through "^2.3.6" - vinyl "^0.4.3" - -gulp-uglify@^1.5.3: - version "1.5.4" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-1.5.4.tgz#524788d87666d09f9d0c21fb2177f90039a658c9" - dependencies: - deap "^1.0.0" - fancy-log "^1.0.0" - gulp-util "^3.0.0" - isobject "^2.0.0" - through2 "^2.0.0" - uglify-js "2.6.4" - uglify-save-license "^0.4.1" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@^3.0.0, gulp-util@^3.0.1: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@~2.2.5: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -771,508 +65,20 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@~2.0.1, inherits@~2.0.3: +inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -ini@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - dependencies: - is-unc-path "^1.0.0" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - dependencies: - unc-path-regex "^0.1.2" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -js-yaml@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: argparse "^1.0.7" esprima "^4.0.0" -jsonc-parser@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" - -jsonc-parser@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.1.tgz#7f8f296414e6e7c4a33b9e4914fc8c47e4421675" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-cache@^2.0.2: +jsonc-parser@^2.0.1, jsonc-parser@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" - -liftoff@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - dependencies: - extend "^3.0.0" - findup-sync "^2.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -make-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.0.tgz#57bef5dc85d23923ba23767324d8e8f8f3d9694b" - dependencies: - kind-of "^3.1.0" - -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-stream@~0.0.3: - version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -micromatch@^3.0.4: - version "3.1.9" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.2.tgz#42fcf56d70852a043fadafde51ddb4a85649978d" minimatch@^3.0.4: version "3.0.4" @@ -1280,133 +86,19 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" +monaco-editor-core@0.14.6: + version "0.14.6" + resolved "https://registry.yarnpkg.com/monaco-editor-core/-/monaco-editor-core-0.14.6.tgz#25fae6a2e7c7da6eb2a3bba653a283627dc624e4" + +monaco-languages@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/monaco-languages/-/monaco-languages-1.5.1.tgz#e0b754a3db9de2133859d88abbf3b2b376439b58" + +monaco-plugin-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/monaco-plugin-helpers/-/monaco-plugin-helpers-1.0.2.tgz#ee1af42503fe4669f3a8731112b661032e41c8a9" dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - -minimist@^1.1.0, minimist@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -monaco-editor-core@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/monaco-editor-core/-/monaco-editor-core-0.10.1.tgz#15121d9e28e51f094d9c556bf852dc9c13dc42a1" - -monaco-languages@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/monaco-languages/-/monaco-languages-0.9.0.tgz#03ea9c52031b79837e7a389d4fc6211da3f758fd" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natives@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.pick@^1.2.0, object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" + typescript "^2.7.2" once@^1.3.0: version "1.4.0" @@ -1414,674 +106,64 @@ once@^1.3.0: dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +requirejs@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.1, readable-stream@^2.1.5: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -requirejs@2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.1.8.tgz#f0dfa656d60d404947da796f9c661d92c1b0257a" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.1.6, resolve@^1.1.7: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.5.2: +rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"semver@2 || 3 || 4 || 5": - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^2.0.0" - -source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - dependencies: - atob "^2.0.0" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -split@0.2: - version "0.2.10" - resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" - dependencies: - through "2" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" +typescript@^2.7.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + +typescript@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" + +uglify-es@^3.3.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" + commander "~2.13.0" + source-map "~0.6.1" -stream-combiner@~0.0.3, stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" +vscode-json-languageservice@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.6.tgz#272e21eb9abcefe6c1ed38be141f0a76d5ddf0cd" dependencies: - duplexer "~0.1.1" + jsonc-parser "^2.0.1" + vscode-languageserver-types "^3.12.0" + vscode-nls "^3.2.4" + vscode-uri "^1.0.6" -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" +vscode-languageserver-types@3.12.0, vscode-languageserver-types@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.12.0.tgz#f96051381b6a050b7175b37d6cb5d2f2eb64b944" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +vscode-nls@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.5.tgz#25520c1955108036dec607c85e00a522f247f1a4" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -through2@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -typescript@^2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" - -uglify-js@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-save-license@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0, vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vscode-json-languageservice@^3.0.5: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.0.7.tgz#dc00117d51d4a7ac3bde9204afa701f962f00736" - dependencies: - jsonc-parser "^1.0.1" - vscode-languageserver-types "^3.6.0-next.1" - vscode-nls "^2.0.2" - vscode-uri "^1.0.1" - -vscode-languageserver-types@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374" - -vscode-languageserver-types@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0-next.1.tgz#98e488d3f87b666b4ee1a3d89f0023e246d358f3" - -vscode-nls@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-2.0.2.tgz#808522380844b8ad153499af5c3b03921aea02da" - -vscode-uri@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.1.tgz#11a86befeac3c4aa3ec08623651a3c81a6d0bbc8" - -which@^1.2.14: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +vscode-uri@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0"