From 54c8299e784a743e98a23880fa6eff45719d7742 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Tue, 4 Jun 2019 13:24:48 -0700 Subject: [PATCH 1/8] CHANGELOG: add missing entries (#4342) Add entries that are missing from the following PRs: - #4279 (cc @mrnugget) - #4263 (cc @tsenart) - #4283 (cc @keegancsmith) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9a71af4f09a5..234eb37e867dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ All notable changes to Sourcegraph are documented in this file. ### Fixed +- Improved performance of the /site-admin/repositories page significantly (prevents timeouts). #4063 +- Fixed an issue where Gitolite repositories would be inaccessible to non-admin users after upgrading to 3.3.0+ from an older version. #4263 +- Repository names are now treated as case-sensitive, fixing an issue where users saw `pq: duplicate key value violates unique constraint \"repo_name_unique\"` #4283 + ## 3.4.2 ### Added From 2445b59e854209f9401d58f5fd430f7032ebe61a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Tue, 4 Jun 2019 22:25:28 +0200 Subject: [PATCH 2/8] Update dependency webpack to ^4.33.0 (#4353) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f217614b41d30..eae01dbf2bc79 100644 --- a/package.json +++ b/package.json @@ -178,7 +178,7 @@ "typedoc": "^0.14.2", "typescript": "^3.5.1", "utc-version": "^2.0.0", - "webpack": "^4.32.2", + "webpack": "^4.33.0", "webpack-dev-server": "^3.3.1", "worker-loader": "^2.0.0", "yarn-deduplicate": "^1.1.1" diff --git a/yarn.lock b/yarn.lock index 7b75a90777eb8..b43b518ecac9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15352,10 +15352,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.29.0, webpack@^4.32.2: - version "4.32.2" - resolved "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" - integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== +webpack@^4.29.0, webpack@^4.33.0: + version "4.33.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.33.0.tgz#c30fc4307db432e5c5e3333aaa7c16a15a3b277e" + integrity sha512-ggWMb0B2QUuYso6FPZKUohOgfm+Z0sVFs8WwWuSH1IAvkWs428VDNmOlAxvHGTB9Dm/qOB/qtE5cRx5y01clxw== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" From 0f8631fbb79e33e476405c6d24e076160407ed04 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Tue, 4 Jun 2019 13:47:16 -0700 Subject: [PATCH 3/8] CHANGELOG: fix links and improve wording (#4354) --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 234eb37e867dd..32ad9cd38825b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,9 +35,9 @@ All notable changes to Sourcegraph are documented in this file. ### Fixed -- Improved performance of the /site-admin/repositories page significantly (prevents timeouts). #4063 -- Fixed an issue where Gitolite repositories would be inaccessible to non-admin users after upgrading to 3.3.0+ from an older version. #4263 -- Repository names are now treated as case-sensitive, fixing an issue where users saw `pq: duplicate key value violates unique constraint \"repo_name_unique\"` #4283 +- Improved performance of the /site-admin/repositories page significantly (prevents timeouts). [#4063](https://github.com/sourcegraph/sourcegraph/issues/4063) +- Fixed an issue where Gitolite repositories would be inaccessible to non-admin users after upgrading to 3.3.0+ from an older version. [#4263](https://github.com/sourcegraph/sourcegraph/issues/4263) +- Repository names are now treated as case-sensitive, fixing an issue where users saw `pq: duplicate key value violates unique constraint \"repo_name_unique\"` [#4283](https://github.com/sourcegraph/sourcegraph/issues/4283) ## 3.4.2 @@ -49,7 +49,7 @@ All notable changes to Sourcegraph are documented in this file. ### Fixed -- Fixed https://github.com/sourcegraph/sourcegraph/issues/4127 +- Fixed incorrect wording in site-admin onboarding. [#4127](https://github.com/sourcegraph/sourcegraph/issues/4127) ## 3.4.1 From 27f70027d3cf15e5275c39f039d6f142bbb48936 Mon Sep 17 00:00:00 2001 From: Keegan Carruthers-Smith Date: Wed, 5 Jun 2019 00:09:52 +0200 Subject: [PATCH 4/8] graphqlbackend: Do not return error on failing to resolve submodule (#4346) This was a regression introduced in 86bf1b7f654519512d93895c321326b7ef31d89b. It lead to any repository containing unresolvable submodules to fail to load in Sourcegraph. --- CHANGELOG.md | 1 + cmd/frontend/graphqlbackend/git_tree_entry.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32ad9cd38825b..76cd6f93d3677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ All notable changes to Sourcegraph are documented in this file. - Fixed repository search patterns which contain `.*`. Previously our optimizer would ignore `.*`, which in some cases would lead to our repository search excluding some repositories from the results. - Fixed an issue where the Phabricator native integration would be broken on recent Phabricator versions. This fix depends on v1.2 of the [Phabricator extension](https://github.com/sourcegraph/phabricator-extension). - Fixed an issue where the "Empty repository" banner would be shown on a repository page when starting to clone a repository. +- Repositories containing submodules not on Sourcegraph will now load without error (#2947) ## 3.4.3 (unreleased) diff --git a/cmd/frontend/graphqlbackend/git_tree_entry.go b/cmd/frontend/graphqlbackend/git_tree_entry.go index a2b20038d86d2..c049d1e4891cd 100644 --- a/cmd/frontend/graphqlbackend/git_tree_entry.go +++ b/cmd/frontend/graphqlbackend/git_tree_entry.go @@ -46,7 +46,7 @@ func (r *gitTreeEntryResolver) URL(ctx context.Context) (string, error) { repoName, err := cloneURLToRepoName(ctx, submodule.URL()) if err != nil { log15.Error("Failed to resolve submodule repository name from clone URL", "cloneURL", submodule.URL(), "err", err) - return "", fmt.Errorf("failed to resolve submodule repository name from clone url: %s", submodule.URL()) + return "", nil } return "/" + repoName + "@" + submodule.Commit(), nil } From ce98727379fdf963fdeb8efcc14f55271d63676e Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Wed, 5 Jun 2019 00:15:11 +0200 Subject: [PATCH 5/8] Show decorations on diff code views (#3288) --- .../__snapshots__/dom_functions.test.ts.snap | 58 +- .../src/libs/bitbucket/code_intelligence.tsx | 4 +- browser/src/libs/bitbucket/dom_functions.ts | 65 +- .../code_intelligence.test.tsx.snap | 254 +++++++ .../code_intelligence.test.tsx | 319 ++++++-- .../code_intelligence/code_intelligence.tsx | 63 +- .../code_intelligence_test_utils.ts | 28 +- .../libs/code_intelligence/code_views.test.ts | 1 + .../src/libs/code_intelligence/code_views.ts | 13 +- .../src/libs/code_intelligence/extensions.tsx | 87 ++- .../__snapshots__/dom_functions.test.ts.snap | 408 +++++++++- browser/src/libs/github/dom_functions.ts | 119 +-- .../__snapshots__/dom_functions.test.ts.snap | 70 +- browser/src/libs/gitlab/dom_functions.ts | 59 +- .../__snapshots__/dom_functions.test.ts.snap | 84 +++ browser/src/libs/phabricator/dom_functions.ts | 75 +- browser/src/shared/util/dom.tsx | 2 +- .../api/client/services/decoration.test.ts | 1 - shared/src/api/client/services/decoration.ts | 27 +- shared/src/api/extension/api/codeEditor.ts | 19 +- web/src/SourcegraphWebApp.tsx | 28 +- web/src/components/FilteredConnection.tsx | 2 +- web/src/repo/commit/RepositoryCommitPage.tsx | 9 +- web/src/repo/compare/DiffHunk.test.tsx | 114 +++ web/src/repo/compare/DiffHunk.tsx | 150 ++++ web/src/repo/compare/FileDiffConnection.tsx | 17 +- web/src/repo/compare/FileDiffHunks.tsx | 258 ++----- web/src/repo/compare/FileDiffNode.tsx | 6 +- .../repo/compare/RepositoryCompareArea.tsx | 5 +- .../compare/RepositoryCompareDiffPage.tsx | 10 +- .../compare/RepositoryCompareOverviewPage.tsx | 11 +- .../__snapshots__/DiffHunk.test.tsx.snap | 706 ++++++++++++++++++ web/src/repo/compare/dom-functions.ts | 59 ++ 33 files changed, 2610 insertions(+), 521 deletions(-) create mode 100644 browser/src/libs/code_intelligence/__snapshots__/code_intelligence.test.tsx.snap create mode 100644 web/src/repo/compare/DiffHunk.test.tsx create mode 100644 web/src/repo/compare/DiffHunk.tsx create mode 100644 web/src/repo/compare/__snapshots__/DiffHunk.test.tsx.snap create mode 100644 web/src/repo/compare/dom-functions.ts diff --git a/browser/src/libs/bitbucket/__snapshots__/dom_functions.test.ts.snap b/browser/src/libs/bitbucket/__snapshots__/dom_functions.test.ts.snap index 0b89a820f8197..ea21f5a58dd83 100644 --- a/browser/src/libs/bitbucket/__snapshots__/dom_functions.test.ts.snap +++ b/browser/src/libs/bitbucket/__snapshots__/dom_functions.test.ts.snap @@ -3,7 +3,14 @@ exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 54 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "routes []*Route", - "selector": false, + "selector": "DIV.diff-editor.side-by-side-diff-editor-to > DIV.CodeMirror.cm-s-stash-default > DIV.CodeMirror-scroll > DIV.CodeMirror-sizer > DIV > DIV.CodeMirror-lines > DIV > DIV.CodeMirror-code > DIV.context.line:nth-child(54) > PRE.CodeMirror-line > SPAN", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 54 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line.54  routes []*Route", + "selector": "DIV.diff-editor.side-by-side-diff-editor-to > DIV.CodeMirror.cm-s-stash-default > DIV.CodeMirror-scroll > DIV.CodeMirror-sizer > DIV > DIV.CodeMirror-lines > DIV > DIV.CodeMirror-code > DIV.context.line:nth-child(54)", } `; @@ -14,6 +21,13 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 60 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line.60+ namedRoutes2 map[string]*Route", + "selector": "DIV.added.modified.line.last-focus:nth-child(60)", +} +`; + exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 102 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "c.regexp.path = copyRouteRegexp(r.regexp.path)", @@ -21,6 +35,13 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 102 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line.102- c.regexp.path = copyRouteRegexp(r.regexp.path)", + "selector": "DIV.removed.modified.line:nth-child(102)", +} +`; + exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 54 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "routes []*Route", @@ -28,6 +49,13 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 54 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line.5454  routes []*Route", + "selector": "DIV.context.line:nth-child(6)", +} +`; + exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 60 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "namedRoutes2 map[string]*Route", @@ -35,6 +63,13 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 60 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line. 60+ namedRoutes2 map[string]*Route", + "selector": "DIV.added.modified.line:nth-child(12)", +} +`; + exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 102 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "c.regexp.path = copyRouteRegexp(r.regexp.path)", @@ -42,6 +77,13 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 102 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "This line has a comment.Add a comment on this line.102 - c.regexp.path = copyRouteRegexp(r.regexp.path)", + "selector": "DIV.removed.modified.line:nth-child(38)", +} +`; + exports[`Bitbucket DOM functions singleFileDOMFunctions line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// Copyright 2012 The Gorilla Authors. All rights reserved.", @@ -49,9 +91,23 @@ Object { } `; +exports[`Bitbucket DOM functions singleFileDOMFunctions line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "1// Copyright 2012 The Gorilla Authors. All rights reserved.", + "selector": "DIV.line:nth-child(1)", +} +`; + exports[`Bitbucket DOM functions singleFileDOMFunctions line number 18 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "return setVars(r, val)", "selector": "DIV.line:nth-child(18) > PRE.CodeMirror-line > SPAN", } `; + +exports[`Bitbucket DOM functions singleFileDOMFunctions line number 18 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "18 return setVars(r, val)", + "selector": "DIV.line:nth-child(18)", +} +`; diff --git a/browser/src/libs/bitbucket/code_intelligence.tsx b/browser/src/libs/bitbucket/code_intelligence.tsx index 531b24137180e..2a94b42aec7b4 100644 --- a/browser/src/libs/bitbucket/code_intelligence.tsx +++ b/browser/src/libs/bitbucket/code_intelligence.tsx @@ -1,11 +1,11 @@ -import { AdjustmentDirection, DOMFunctions, PositionAdjuster } from '@sourcegraph/codeintellify' +import { AdjustmentDirection, PositionAdjuster } from '@sourcegraph/codeintellify' import { of } from 'rxjs' import { Omit } from 'utility-types' import { PlatformContext } from '../../../../shared/src/platform/context' import { FileSpec, RepoSpec, ResolvedRevSpec, RevSpec } from '../../../../shared/src/util/url' import { querySelectorOrSelf } from '../../shared/util/dom' import { CodeHost, MountGetter } from '../code_intelligence' -import { CodeView } from '../code_intelligence/code_views' +import { CodeView, DOMFunctions } from '../code_intelligence/code_views' import { ViewResolver } from '../code_intelligence/views' import { getContext } from './context' import { diffDOMFunctions, singleFileDOMFunctions } from './dom_functions' diff --git a/browser/src/libs/bitbucket/dom_functions.ts b/browser/src/libs/bitbucket/dom_functions.ts index 2ff8fa538e2d4..8d0b063ea4cb4 100644 --- a/browser/src/libs/bitbucket/dom_functions.ts +++ b/browser/src/libs/bitbucket/dom_functions.ts @@ -1,4 +1,19 @@ -import { DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' +import { DOMFunctions } from '../code_intelligence/code_views' + +const getSingleFileLineElementFromLineNumber = (codeView: HTMLElement, line: number): HTMLElement => { + const lineNumElem = codeView.querySelector(`[data-line-number="${line}"`) + if (!lineNumElem) { + throw new Error(`Line ${line} not found in code view`) + } + + const lineElem = lineNumElem.closest('.line') as HTMLElement | null + if (!lineElem) { + throw new Error('Could not find line elem for line element') + } + + return lineElem +} export const singleFileDOMFunctions: DOMFunctions = { getCodeElementFromTarget: target => { @@ -24,19 +39,27 @@ export const singleFileDOMFunctions: DOMFunctions = { return lineNum }, - getCodeElementFromLineNumber: (codeView, line) => { - const lineNumElem = codeView.querySelector(`[data-line-number="${line}"`) - if (!lineNumElem) { - throw new Error(`Line ${line} not found in code view`) - } + getLineElementFromLineNumber: getSingleFileLineElementFromLineNumber, + getCodeElementFromLineNumber: (codeView, line) => + getSingleFileLineElementFromLineNumber(codeView, line).querySelector( + '.CodeMirror-line span[role="presentation"]' + ), +} - const lineElem = lineNumElem.closest('.line') as HTMLElement | null - if (!lineElem) { - throw new Error('Could not find line elem for line element') +const getDiffLineElementFromLineNumber = (codeView: HTMLElement, line: number, part?: DiffPart): HTMLElement => { + for (const lineNumElem of codeView.getElementsByClassName(`line-number-${part === 'head' ? 'to' : 'from'}`)) { + const lineNum = parseInt((lineNumElem.textContent || '').trim(), 10) + if (!isNaN(lineNum) && lineNum === line) { + const lineElem = lineNumElem.closest('.line') as HTMLElement | null + if (!lineElem) { + throw new Error('Could not find lineElem from lineNumElem') + } + + return lineElem } + } - return lineElem.querySelector('.CodeMirror-line span[role="presentation"]') - }, + throw new Error(`Could not locate line number element for line ${line}, part: ${part}`) } export const diffDOMFunctions: DOMFunctions = { @@ -65,21 +88,11 @@ export const diffDOMFunctions: DOMFunctions = { throw new Error('Could not find line number element for code element') }, - getCodeElementFromLineNumber: (codeView, line, part) => { - for (const lineNumElem of codeView.getElementsByClassName(`line-number-${part === 'head' ? 'to' : 'from'}`)) { - const lineNum = parseInt((lineNumElem.textContent || '').trim(), 10) - if (!isNaN(lineNum) && lineNum === line) { - const lineElem = lineNumElem.closest('.line') as HTMLElement | null - if (!lineElem) { - throw new Error('Could not find line elem for line element') - } - - return lineElem.querySelector('.CodeMirror-line span[role="presentation"]') - } - } - - throw new Error(`Could not locate line number element for line ${line}`) - }, + getLineElementFromLineNumber: getDiffLineElementFromLineNumber, + getCodeElementFromLineNumber: (codeView, line, part) => + getDiffLineElementFromLineNumber(codeView, line, part).querySelector( + '.CodeMirror-line span[role="presentation"]' + ), getDiffCodePart: codeElement => { if (!document.querySelector('.side-by-side-diff')) { return codeElement.closest('.line')!.classList.contains('removed') ? 'base' : 'head' diff --git a/browser/src/libs/code_intelligence/__snapshots__/code_intelligence.test.tsx.snap b/browser/src/libs/code_intelligence/__snapshots__/code_intelligence.test.tsx.snap new file mode 100644 index 0000000000000..75ff53d4b4aa0 --- /dev/null +++ b/browser/src/libs/code_intelligence/__snapshots__/code_intelligence.test.tsx.snap @@ -0,0 +1,254 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`code_intelligence handleCodeHost() Decorations decorates a diff code view 1`] = ` +
+
+ + + test decoration head line 1 + + +
+ + +
+ + + test decoration base line 2 + + +
+ + +
+ + + test decoration head line 2 + + +
+ + +
+ +
+ + +
+ + + test decoration base line 5 + + +
+ + +
+`; + +exports[`code_intelligence handleCodeHost() Decorations decorates a diff code view 2`] = ` +
+
+ + + test decoration head line 1 + + +
+ + +
+ +
+ + +
+ + + test decoration head line 2 + + +
+ + +
+ +
+ + +
+ + + test decoration base line 5 + + +
+ + +
+`; + +exports[`code_intelligence handleCodeHost() Decorations decorates a diff code view 3`] = ` +
+
+ + + test decoration head line 1 + + +
+ + +
+ +
+ + +
+ + + test decoration head line 2 changed + + +
+ + +
+ +
+ + +
+ + + test decoration base line 5 + + +
+ + +
+`; diff --git a/browser/src/libs/code_intelligence/code_intelligence.test.tsx b/browser/src/libs/code_intelligence/code_intelligence.test.tsx index f0daba38f1b83..ac06ed60863c0 100644 --- a/browser/src/libs/code_intelligence/code_intelligence.test.tsx +++ b/browser/src/libs/code_intelligence/code_intelligence.test.tsx @@ -1,3 +1,4 @@ +import { DiffPart } from '@sourcegraph/codeintellify' import { Range } from '@sourcegraph/extension-api-classes' import { uniqueId } from 'lodash' import renderer from 'react-test-renderer' @@ -101,7 +102,7 @@ const createMockPlatformContext = ( repository: { commit: { file: { - content: '', + content: 'Hello World', }, }, }, @@ -248,6 +249,7 @@ describe('code_intelligence', () => { dom: { getCodeElementFromTarget: jest.fn(), getCodeElementFromLineNumber: jest.fn(), + getLineElementFromLineNumber: jest.fn(), getLineNumberFromCodeElement: jest.fn(), }, resolveFileInfo: codeView => of(fileInfo), @@ -276,7 +278,7 @@ describe('code_intelligence', () => { resource: 'git://foo?1#/bar.ts', model: { uri: 'git://foo?1#/bar.ts', - text: '', + text: 'Hello World', languageId: 'typescript', }, selections: [], @@ -288,89 +290,249 @@ describe('code_intelligence', () => { expect(toolbar).not.toBeUndefined() }) - test('decorates a code view', async () => { - const { extensionAPI, services } = await integrationTestContext(undefined, { - roots: [], - editors: [], - }) - const codeView = createTestElement() - codeView.id = 'code' - const fileInfo: FileInfo = { - repoName: 'foo', - filePath: '/bar.ts', - commitID: '1', - } - const line = document.createElement('div') - codeView.appendChild(line) - subscriptions.add( - handleCodeHost({ - mutations: of([{ addedNodes: [document.body], removedNodes: [] }]), - codeHost: { - name: 'test', - check: () => true, - codeViewResolvers: [ - toCodeViewResolver('#code', { - dom: { - getCodeElementFromTarget: jest.fn(), - getCodeElementFromLineNumber: () => line, - getLineNumberFromCodeElement: jest.fn(), - }, - resolveFileInfo: codeView => of(fileInfo), - }), - ], - }, - extensionsController: createMockController(services), - showGlobalDebug: true, - platformContext: createMockPlatformContext(), - sourcegraphURL: DEFAULT_SOURCEGRAPH_URL, - telemetryService: NOOP_TELEMETRY_SERVICE, - render: RENDER, + describe('Decorations', () => { + it('decorates a code view', async () => { + const { extensionAPI, services } = await integrationTestContext(undefined, { + roots: [], + editors: [], }) - ) - const activeEditor = await from(extensionAPI.app.activeWindowChanges) - .pipe( - filter(isDefined), - switchMap(window => window.activeViewComponentChanges), - filter(isDefined), - take(1) + const codeView = createTestElement() + codeView.id = 'code' + const fileInfo: FileInfo = { + repoName: 'foo', + filePath: '/bar.ts', + commitID: '1', + } + // For this test, we pretend bar.ts only has one line of code + const line = document.createElement('div') + codeView.appendChild(line) + subscriptions.add( + handleCodeHost({ + mutations: of([{ addedNodes: [document.body], removedNodes: [] }]), + codeHost: { + name: 'test', + check: () => true, + codeViewResolvers: [ + toCodeViewResolver('#code', { + dom: { + getCodeElementFromTarget: () => line, + getCodeElementFromLineNumber: () => line, + getLineElementFromLineNumber: () => line, + getLineNumberFromCodeElement: () => 1, + }, + resolveFileInfo: codeView => of(fileInfo), + }), + ], + }, + extensionsController: createMockController(services), + showGlobalDebug: true, + platformContext: createMockPlatformContext(), + sourcegraphURL: DEFAULT_SOURCEGRAPH_URL, + telemetryService: NOOP_TELEMETRY_SERVICE, + render: RENDER, + }) ) - .toPromise() - const decorationType = extensionAPI.app.createDecorationType() - const decorated = () => - services.textDocumentDecoration - .getDecorations({ uri: 'git://foo?1#/bar.ts' }) + const activeEditor = await from(extensionAPI.app.activeWindowChanges) .pipe( - filter(decorations => Boolean(decorations && decorations.length > 0)), + filter(isDefined), + switchMap(window => window.activeViewComponentChanges), + filter(isDefined), take(1) ) .toPromise() + const decorationType = extensionAPI.app.createDecorationType() + const decorated = () => + services.textDocumentDecoration + .getDecorations({ uri: 'git://foo?1#/bar.ts' }) + .pipe( + filter(decorations => Boolean(decorations && decorations.length > 0)), + take(1) + ) + .toPromise() - // Set decorations and verify that a decoration attachment has been added - activeEditor.setDecorations(decorationType, [ - { - range: new Range(0, 0, 0, 0), - after: { - contentText: 'test decoration', + // Set decorations and verify that a decoration attachment has been added + activeEditor.setDecorations(decorationType, [ + { + range: new Range(0, 0, 0, 0), + after: { + contentText: 'test decoration', + }, }, - }, - ]) - await decorated() - expect(line.querySelectorAll('.line-decoration-attachment').length).toBe(1) - expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration') + ]) + await decorated() + expect(line.querySelectorAll('.line-decoration-attachment')).toHaveLength(1) + expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration') - // Decorate the code view again, and verify that previous decorations - // are cleaned up and replaced by the new decorations. - activeEditor.setDecorations(decorationType, [ - { - range: new Range(0, 0, 0, 0), - after: { - contentText: 'test decoration 2', + // Decorate the code view again, and verify that previous decorations + // are cleaned up and replaced by the new decorations. + activeEditor.setDecorations(decorationType, [ + { + range: new Range(0, 0, 0, 0), + after: { + contentText: 'test decoration 2', + }, }, - }, - ]) - await decorated() - expect(line.querySelectorAll('.line-decoration-attachment').length).toBe(1) - expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration 2') + ]) + await decorated() + expect(line.querySelectorAll('.line-decoration-attachment').length).toBe(1) + expect(line.querySelector('.line-decoration-attachment')!.textContent).toEqual('test decoration 2') + }) + + it('decorates a diff code view', async () => { + const { extensionAPI, services } = await integrationTestContext(undefined, { + roots: [], + editors: [], + }) + const codeView = createTestElement() + codeView.id = 'code' + const fileInfo: FileInfo = { + repoName: 'foo', + filePath: '/bar.ts', + commitID: '2', + baseRepoName: 'foo', + baseFilePath: '/bar.ts', + baseCommitID: '1', + } + codeView.innerHTML = + '
\n' + + '
\n' + + '
\n' + + '
\n' + + '
\n' + const dom = { + getCodeElementFromTarget: (target: HTMLElement) => target.closest('.code-element') as HTMLElement, + getCodeElementFromLineNumber: (codeView: HTMLElement, line: number, part?: DiffPart) => + codeView.querySelector(`[line="${line}"][part="${part}"] > .code-element`), + getLineElementFromLineNumber: (codeView: HTMLElement, line: number, part?: DiffPart) => + codeView.querySelector(`[line="${line}"][part="${part}"]`), + getLineNumberFromCodeElement: (codeElement: HTMLElement) => + parseInt(codeElement.parentElement!.getAttribute('line')!, 10), + } + subscriptions.add( + handleCodeHost({ + mutations: of([{ addedNodes: [document.body], removedNodes: [] }]), + codeHost: { + name: 'test', + check: () => true, + codeViewResolvers: [ + toCodeViewResolver('#code', { + dom, + resolveFileInfo: () => of(fileInfo), + }), + ], + }, + extensionsController: createMockController(services), + showGlobalDebug: true, + platformContext: createMockPlatformContext({}), + sourcegraphURL: DEFAULT_SOURCEGRAPH_URL, + telemetryService: NOOP_TELEMETRY_SERVICE, + render: RENDER, + }) + ) + await from(extensionAPI.app.activeWindowChanges) + .pipe( + filter(isDefined), + switchMap(window => window.activeViewComponentChanges), + filter(isDefined), + take(2) + ) + .toPromise() + const decorationType = extensionAPI.app.createDecorationType() + const decorated = (commit: string) => + services.textDocumentDecoration + .getDecorations({ uri: `git://foo?${commit}#/bar.ts` }) + .pipe( + skip(1), + take(1) + ) + .toPromise() + + // Set decorations and verify that a decoration attachment has been added + const editors = extensionAPI.app.activeWindow!.visibleViewComponents + expect(editors).toHaveLength(2) + + const baseEditor = editors.find(e => e.document.uri === 'git://foo?1#/bar.ts')! + const baseDecorations = [ + { + range: new Range(0, 0, 0, 0), + isWholeLine: true, + backgroundColor: 'red', + after: { + contentText: 'test decoration base line 1', + }, + }, + { + range: new Range(1, 0, 1, 0), + isWholeLine: true, + backgroundColor: 'red', + after: { + contentText: 'test decoration base line 2', + }, + }, + { + range: new Range(4, 0, 4, 0), + isWholeLine: true, + backgroundColor: 'red', + after: { + contentText: 'test decoration base line 5', + }, + }, + ] + baseEditor.setDecorations(decorationType, baseDecorations) + + const headEditor = editors.find(e => e.document.uri === 'git://foo?2#/bar.ts')! + const headDecorations = [ + { + range: new Range(0, 0, 0, 0), + isWholeLine: true, + after: { + contentText: 'test decoration head line 1', + }, + }, + { + range: new Range(1, 0, 1, 0), + isWholeLine: true, + backgroundColor: 'blue', + after: { + contentText: 'test decoration head line 2', + }, + }, + { + range: new Range(6, 0, 6, 0), + isWholeLine: true, + after: { + contentText: 'test decoration not visible', + }, + }, + ] + headEditor.setDecorations(decorationType, headDecorations) + + await Promise.all([decorated('1'), decorated('2')]) + + expect(codeView).toMatchSnapshot() + + // Decorate the code view again, and verify that previous decorations + // are cleaned up and replaced by the new decorations. + // Remove decoration in first and second line + baseEditor.setDecorations(decorationType, baseDecorations.slice(2)) + await decorated('1') + expect(codeView).toMatchSnapshot() + + // Change decoration in first line + headEditor.setDecorations(decorationType, [ + headDecorations[0], + { + ...headDecorations[1], + after: { + ...headDecorations[1].after, + contentText: 'test decoration head line 2 changed', + }, + }, + headDecorations[2], + ]) + await decorated('2') + expect(codeView).toMatchSnapshot() + }) }) test('removes code views and models', async () => { @@ -401,6 +563,7 @@ describe('code_intelligence', () => { dom: { getCodeElementFromTarget: jest.fn(), getCodeElementFromLineNumber: jest.fn(), + getLineElementFromLineNumber: jest.fn(), getLineNumberFromCodeElement: jest.fn(), }, resolveFileInfo: codeView => of(fileInfo), @@ -427,7 +590,7 @@ describe('code_intelligence', () => { isActive: true, model: { languageId: 'typescript', - text: '', + text: 'Hello World', uri: 'git://foo?1#/bar.ts', }, resource: 'git://foo?1#/bar.ts', @@ -439,7 +602,7 @@ describe('code_intelligence', () => { isActive: true, model: { languageId: 'typescript', - text: '', + text: 'Hello World', uri: 'git://foo?1#/bar.ts', }, resource: 'git://foo?1#/bar.ts', @@ -463,7 +626,7 @@ describe('code_intelligence', () => { isActive: true, model: { languageId: 'typescript', - text: '', + text: 'Hello World', uri: 'git://foo?1#/bar.ts', }, resource: 'git://foo?1#/bar.ts', diff --git a/browser/src/libs/code_intelligence/code_intelligence.tsx b/browser/src/libs/code_intelligence/code_intelligence.tsx index 2019164f3d248..95d37efa1a191 100644 --- a/browser/src/libs/code_intelligence/code_intelligence.tsx +++ b/browser/src/libs/code_intelligence/code_intelligence.tsx @@ -6,6 +6,7 @@ import { Hoverifier, HoverState, } from '@sourcegraph/codeintellify' +import { TextDocumentDecoration } from '@sourcegraph/extension-api-types' import * as H from 'history' import { uniqBy } from 'lodash' import * as React from 'react' @@ -16,6 +17,7 @@ import { concatAll, concatMap, filter, + finalize, map, mergeMap, observeOn, @@ -25,6 +27,7 @@ import { } from 'rxjs/operators' import { ActionItemAction } from '../../../../shared/src/actions/ActionItem' import { PartialCodeEditor } from '../../../../shared/src/api/client/context/context' +import { DecorationMapByLine } from '../../../../shared/src/api/client/services/decoration' import { CodeEditorData } from '../../../../shared/src/api/client/services/editorService' import { WorkspaceRootWithMetadata } from '../../../../shared/src/api/client/services/workspaceService' import { HoverMerged } from '../../../../shared/src/api/client/types/hover' @@ -64,13 +67,7 @@ import { gitlabCodeHost } from '../gitlab/code_intelligence' import { phabricatorCodeHost } from '../phabricator/code_intelligence' import { CodeView, fetchFileContents, trackCodeViews } from './code_views' import { ContentView, handleContentViews } from './content_views' -import { - applyDecorations, - DecorationMapByLine, - initializeExtensions, - renderCommandPalette, - renderGlobalDebug, -} from './extensions' +import { applyDecorations, initializeExtensions, renderCommandPalette, renderGlobalDebug } from './extensions' import { renderViewContextOnSourcegraph, ViewOnSourcegraphButtonClassProps } from './external_links' import { handleTextFields, TextField } from './text_fields' import { ViewResolver } from './views' @@ -582,22 +579,54 @@ export function handleCodeHost({ } // Apply decorations coming from extensions - let decorationsByLine: DecorationMapByLine = new Map() - if (!fileInfo.baseCommitID) { + { + let decorationsByLine: DecorationMapByLine = new Map() + const update = (decorations?: TextDocumentDecoration[] | null): void => { + decorationsByLine = applyDecorations( + domFunctions, + element, + decorations || [], + decorationsByLine, + fileInfo.baseCommitID ? 'head' : undefined + ) + } codeViewState.subscriptions.add( extensionsController.services.textDocumentDecoration .getDecorations(toTextDocumentIdentifier(fileInfo)) + // Make sure extensions get cleaned up un unsubscription + .pipe(finalize(update)) + // The nested subscribe cannot be replaced with a switchMap() + // We manage the subscription correctly. + // tslint:disable-next-line: rxjs-no-nested-subscribe + .subscribe(update) + ) + } + if (fileInfo.baseCommitID && fileInfo.baseFilePath) { + let decorationsByLine: DecorationMapByLine = new Map() + const update = (decorations?: TextDocumentDecoration[] | null): void => { + decorationsByLine = applyDecorations( + domFunctions, + element, + decorations || [], + decorationsByLine, + 'base' + ) + } + codeViewState.subscriptions.add( + extensionsController.services.textDocumentDecoration + .getDecorations( + toTextDocumentIdentifier({ + repoName: fileInfo.baseRepoName || fileInfo.repoName, // not sure if all code hosts set baseRepoName + commitID: fileInfo.baseCommitID, + filePath: fileInfo.baseFilePath, + }) + ) + // Make sure decorations get cleaned up on unsubscription + .pipe(finalize(update)) // The nested subscribe cannot be replaced with a switchMap() // We manage the subscription correctly. // tslint:disable-next-line: rxjs-no-nested-subscribe - .subscribe(decorations => { - decorationsByLine = applyDecorations( - domFunctions, - element, - decorations || [], - decorationsByLine - ) - }) + .subscribe(update) ) } diff --git a/browser/src/libs/code_intelligence/code_intelligence_test_utils.ts b/browser/src/libs/code_intelligence/code_intelligence_test_utils.ts index 21bb159d04474..d0b61a808bc75 100644 --- a/browser/src/libs/code_intelligence/code_intelligence_test_utils.ts +++ b/browser/src/libs/code_intelligence/code_intelligence_test_utils.ts @@ -1,10 +1,10 @@ -import { DiffPart, DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' import assert from 'assert' import { readFile } from 'mz/fs' -import Simmer from 'simmerjs' +import Simmer, { Options as SimmerOptions } from 'simmerjs' import { SetIntersection } from 'utility-types' import { CodeHost, MountGetter } from './code_intelligence' -import { CodeView } from './code_views' +import { CodeView, DOMFunctions } from './code_views' const mountGetterKeys = ['getCommandPaletteMount', 'getViewContextOnSourcegraphMount'] as const type MountGetterKey = (typeof mountGetterKeys)[number] @@ -156,14 +156,34 @@ export function testDOMFunctions( }) for (const { diffPart, lineNumber } of codeElements) { describe(`line number ${lineNumber}` + (diffPart !== undefined ? ` in ${diffPart} diff part` : ''), () => { + const simmerOptions: SimmerOptions = { + depth: 20, + specificityThreshold: 500, + selectorMaxLength: 1000, + } + + describe('getLineElementFromLineNumber()', () => { + it(`should return the right line element given the line number`, async () => { + const codeElement = domFunctions.getLineElementFromLineNumber(codeViewElement, lineNumber, diffPart) + expect(codeElement).toBeDefined() + expect(codeElement).not.toBeNull() + // Generate CSS selector for element + const simmer = new Simmer(codeViewElement, simmerOptions) + const selector = simmer(codeElement!) + expect(selector).toBeTruthy() + expect({ selector, content: codeElement!.textContent!.trim() }).toMatchSnapshot() + }) + }) + describe('getCodeElementFromLineNumber()', () => { it(`should return the right code element given the line number`, async () => { const codeElement = domFunctions.getCodeElementFromLineNumber(codeViewElement, lineNumber, diffPart) expect(codeElement).toBeDefined() expect(codeElement).not.toBeNull() // Generate CSS selector for element - const simmer = new Simmer(codeViewElement) + const simmer = new Simmer(codeViewElement, simmerOptions) const selector = simmer(codeElement!) + expect(selector).toBeTruthy() expect({ selector, content: codeElement!.textContent!.trim() }).toMatchSnapshot() }) }) diff --git a/browser/src/libs/code_intelligence/code_views.test.ts b/browser/src/libs/code_intelligence/code_views.test.ts index f4550e7702fb6..52d367cbda1a9 100644 --- a/browser/src/libs/code_intelligence/code_views.test.ts +++ b/browser/src/libs/code_intelligence/code_views.test.ts @@ -20,6 +20,7 @@ describe('code_views', () => { dom: { getCodeElementFromTarget: () => null, getCodeElementFromLineNumber: () => null, + getLineElementFromLineNumber: () => null, getLineNumberFromCodeElement: () => 1, }, resolveFileInfo: () => of(fileInfo), diff --git a/browser/src/libs/code_intelligence/code_views.ts b/browser/src/libs/code_intelligence/code_views.ts index d2e85d5925147..b2287df14a218 100644 --- a/browser/src/libs/code_intelligence/code_views.ts +++ b/browser/src/libs/code_intelligence/code_views.ts @@ -1,4 +1,4 @@ -import { DOMFunctions, PositionAdjuster } from '@sourcegraph/codeintellify' +import { DiffPart, DOMFunctions as CodeIntellifyDOMFuncions, PositionAdjuster } from '@sourcegraph/codeintellify' import { Selection } from '@sourcegraph/extension-api-types' import { Observable, of, zip } from 'rxjs' import { catchError, map, switchMap } from 'rxjs/operators' @@ -12,6 +12,17 @@ import { CodeHost, FileInfo } from './code_intelligence' import { ensureRevisionsAreCloned } from './util/file_info' import { trackViews, ViewResolver } from './views' +export interface DOMFunctions extends CodeIntellifyDOMFuncions { + /** + * Gets the element for the entire line. This element is used for whole-line + * background decorations. It should span the entire width of the line + * independent on how long the code on that line is. This may be a parent + * element of the code element, but keep in mind that even in split diff + * views it must only contain the line the given diff part. + */ + getLineElementFromLineNumber: (codeView: HTMLElement, line: number, part?: DiffPart) => HTMLElement | null +} + /** * Defines a code view that is present on a page. * Exposes operations for manipulating it, and CSS classes to be applied to injected UI elements. diff --git a/browser/src/libs/code_intelligence/extensions.tsx b/browser/src/libs/code_intelligence/extensions.tsx index d36fea1a6493a..9767bb7fb32a4 100644 --- a/browser/src/libs/code_intelligence/extensions.tsx +++ b/browser/src/libs/code_intelligence/extensions.tsx @@ -8,12 +8,14 @@ import { } from '../../../../shared/src/commandPalette/CommandList' import { Notifications } from '../../../../shared/src/notifications/Notifications' -import { DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' import * as H from 'history' import { isEqual } from 'lodash' import { decorationAttachmentStyleForTheme, + DecorationMapByLine, decorationStyleForTheme, + groupDecorationsByLine, } from '../../../../shared/src/api/client/services/decoration' import { createController as createExtensionsController, @@ -25,6 +27,7 @@ import { createPlatformContext } from '../../platform/context' import { GlobalDebug } from '../../shared/components/GlobalDebug' import { ShortcutProvider } from '../../shared/components/ShortcutProvider' import { CodeHost } from './code_intelligence' +import { DOMFunctions } from './code_views' /** * Initializes extensions for a page. It creates the {@link PlatformContext} and extensions controller. @@ -89,35 +92,17 @@ export const renderGlobalDebug = ({ const IS_LIGHT_THEME = true // assume all code hosts have a light theme (correct for now) -/** - * @returns Map from line number to non-empty array of TextDocumentDecoration for that line - */ -const groupByLine = (decorations: TextDocumentDecoration[]): Map => { - const grouped = new Map() - for (const d of decorations) { - const lineNumber = d.range.start.line + 1 - const decorationsForLine = grouped.get(lineNumber) - if (!decorationsForLine) { - grouped.set(lineNumber, [d]) - } else { - decorationsForLine.push(d) - } - } - return grouped -} - -/** - * Cleans up the line decorations in one line - */ -const cleanupDecorationsForLine = (codeElement: HTMLElement): void => { +const cleanupDecorationsForCodeElement = (codeElement: HTMLElement, part: DiffPart | undefined): void => { codeElement.style.backgroundColor = null - const previousAttachments = codeElement.querySelectorAll('.line-decoration-attachment') + const previousAttachments = codeElement.querySelectorAll(`.line-decoration-attachment[data-part=${part}]`) for (const attachment of previousAttachments) { attachment.remove() } } -export type DecorationMapByLine = Map +const cleanupDecorationsForLineElement = (lineElement: HTMLElement): void => { + lineElement.style.backgroundColor = null +} /** * Applies a decoration to a code view. This doesn't work with diff views yet. @@ -128,15 +113,20 @@ export const applyDecorations = ( dom: DOMFunctions, codeView: HTMLElement, decorations: TextDocumentDecoration[], - previousDecorations: DecorationMapByLine + previousDecorations: DecorationMapByLine, + part?: DiffPart ): DecorationMapByLine => { - const decorationsByLine = groupByLine(decorations) + const decorationsByLine = groupDecorationsByLine(decorations) // Clean up lines that now don't have decorations anymore for (const lineNumber of previousDecorations.keys()) { if (!decorationsByLine.has(lineNumber)) { - const codeElement = dom.getCodeElementFromLineNumber(codeView, lineNumber) + const codeElement = dom.getCodeElementFromLineNumber(codeView, lineNumber, part) if (codeElement) { - cleanupDecorationsForLine(codeElement) + cleanupDecorationsForCodeElement(codeElement, part) + } + const lineElement = dom.getLineElementFromLineNumber(codeView, lineNumber, part) + if (lineElement) { + cleanupDecorationsForLineElement(lineElement) } } } @@ -146,18 +136,41 @@ export const applyDecorations = ( // No change in this line continue } - const codeElement = dom.getCodeElementFromLineNumber(codeView, lineNumber) + + const codeElement = dom.getCodeElementFromLineNumber(codeView, lineNumber, part) if (!codeElement) { - throw new Error(`Unable to find code element for line ${lineNumber}`) + if (part === undefined) { + throw new Error(`Unable to find code element for line ${lineNumber}`) + } + // In diffs it's normal that many lines are not visible + continue } - // Clean up previous decorations if this line had some - if (previousDecorationsForLine) { - cleanupDecorationsForLine(codeElement) + const lineElement = dom.getLineElementFromLineNumber(codeView, lineNumber, part) + if (!lineElement) { + if (part === undefined) { + throw new Error(`Could not find line element for line ${lineNumber}`) + } + // In diffs it's normal that many lines are not visible + continue } + + // Clean up previous decorations + // Sometimes these can be there even if we cleaned them up if + // the code host snapshotted the DOM before removal of the code view + // (happens on GitHub when switching tabs on a PR) + cleanupDecorationsForCodeElement(codeElement, part) + cleanupDecorationsForLineElement(lineElement) + for (const decoration of decorationsForLine) { const style = decorationStyleForTheme(decoration, IS_LIGHT_THEME) if (style.backgroundColor) { - codeElement.style.backgroundColor = style.backgroundColor + let backgroundElement: HTMLElement + if (decoration.isWholeLine) { + backgroundElement = lineElement + } else { + backgroundElement = codeElement + } + backgroundElement.style.backgroundColor = style.backgroundColor } if (decoration.after) { @@ -180,11 +193,15 @@ export const applyDecorations = ( } const after = document.createElement('span') + after.style.color = style.color || null after.style.backgroundColor = style.backgroundColor || null after.textContent = decoration.after.contentText || null - after.title = decoration.after.hoverMessage || '' + if (decoration.after.hoverMessage) { + after.title = decoration.after.hoverMessage + } const annotation = decoration.after.linkURL ? linkTo(decoration.after.linkURL)(after) : after + annotation.dataset.part = String(part) annotation.className = 'sourcegraph-extension-element line-decoration-attachment' codeElement.appendChild(annotation) } diff --git a/browser/src/libs/github/__snapshots__/dom_functions.test.ts.snap b/browser/src/libs/github/__snapshots__/dom_functions.test.ts.snap index c98c7a562d458..e163d0b95f7f2 100644 --- a/browser/src/libs/github/__snapshots__/dom_functions.test.ts.snap +++ b/browser/src/libs/github/__snapshots__/dom_functions.test.ts.snap @@ -7,6 +7,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Split view line number 80 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// field of the match argument.", + "selector": "TR:nth-child(3) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Split view line number 82 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- fmt.Println(\\"hello world!\\")", @@ -14,6 +21,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Split view line number 82 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- fmt.Println(\\"hello world!\\")", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Split view line number 82 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ fmt.Println(\\"hello world!!\\")", @@ -21,6 +35,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Split view line number 82 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ fmt.Println(\\"hello world!!\\")", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 80 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// field of the match argument.", @@ -28,6 +49,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 80 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// field of the match argument.", + "selector": "TR:nth-child(3) > TD.blob-code.blob-code-context", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 82 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- fmt.Println(\\"hello world!\\")", @@ -35,6 +63,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 82 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- fmt.Println(\\"hello world!\\")", + "selector": "TD.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 82 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ fmt.Println(\\"hello world!!\\")", @@ -42,6 +77,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Refined Github Unified view line number 82 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ fmt.Println(\\"hello world!!\\")", + "selector": "TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 80 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// field of the match argument.", @@ -49,6 +91,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 80 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// field of the match argument.", + "selector": "TR:nth-child(3) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 82 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- fmt.Println(\\"hello world!\\")", @@ -56,6 +105,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 82 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- fmt.Println(\\"hello world!\\")", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 82 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ fmt.Println(\\"hello world!!\\")", @@ -63,6 +119,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Split view line number 82 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ fmt.Println(\\"hello world!!\\")", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 80 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// field of the match argument.", @@ -70,6 +133,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 80 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// field of the match argument.", + "selector": "TR:nth-child(3) > TD.blob-code.blob-code-context", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 82 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- fmt.Println(\\"hello world!\\")", @@ -77,6 +147,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 82 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- fmt.Println(\\"hello world!\\")", + "selector": "TD.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 82 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ fmt.Println(\\"hello world!!\\")", @@ -84,6 +161,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Commit page Vanilla Unified view line number 82 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ fmt.Println(\\"hello world!!\\")", + "selector": "TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request Discussion page Refined Github line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -91,6 +175,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request Discussion page Refined Github line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request Discussion page Vanilla line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -98,6 +189,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request Discussion page Vanilla line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Split view line number 63 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "KeepContext bool", @@ -105,6 +203,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Split view line number 63 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "KeepContext bool", + "selector": "TR:nth-child(4) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Split view line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -112,6 +217,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Split view line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TR:nth-child(5) > TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Unified view line number 63 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "KeepContext bool", @@ -119,6 +231,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Unified view line number 63 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "KeepContext bool", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-context", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Unified view line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -126,6 +245,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Refined Github Unified view line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TR:nth-child(5) > TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Split view line number 63 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "KeepContext bool", @@ -133,6 +259,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Split view line number 63 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "KeepContext bool", + "selector": "TR:nth-child(4) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Split view line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -140,6 +273,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Split view line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TR:nth-child(5) > TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Unified view line number 63 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "KeepContext bool", @@ -147,6 +287,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Unified view line number 63 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "KeepContext bool", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-context", +} +`; + exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Unified view line number 64 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "+ // Another field", @@ -154,6 +301,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions ghe-2.14.11 Pull Request page Vanilla Unified view line number 64 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "+ // Another field", + "selector": "TR:nth-child(5) > TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 41 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", @@ -161,6 +315,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 41 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", + "selector": "TR:nth-child(4) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 42 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", @@ -168,6 +329,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 42 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 42 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", @@ -175,6 +343,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Split view line number 42 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 41 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", @@ -182,6 +357,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 41 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 42 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", @@ -189,6 +371,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 42 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", + "selector": "TD.blob-code.blob-code-deletion:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 42 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", @@ -196,6 +385,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Refined Github Unified view line number 42 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", + "selector": "TD.blob-code.blob-code-addition:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 41 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", @@ -203,6 +399,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 41 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", + "selector": "TR:nth-child(4) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 42 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", @@ -210,6 +413,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 42 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 42 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", @@ -217,6 +427,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Split view line number 42 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 41 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", @@ -224,6 +441,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 41 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- You can find out who is on-call by typing \`/genie whoisoncall\` in Slack.", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 42 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", @@ -231,6 +455,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 42 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie with ops_team\`.", + "selector": "TD.blob-code.blob-code-deletion:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 42 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", @@ -238,6 +469,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Commit page Vanilla Unified view line number 42 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "- If you are not able to immediately get in contact with the on-call engineer, then manually create a new OpsGenie alert by typing \`/genie alert \\"description of incident and link to Slack thread\\" for ops_team\`.", + "selector": "TD.blob-code.blob-code-addition:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request Discussion page Refined Github line number 62 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "if len(parsedUrl.Opaque) > 0 {", @@ -245,6 +483,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request Discussion page Refined Github line number 62 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "if len(parsedUrl.Opaque) > 0 {", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request Discussion page Vanilla line number 62 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "if len(parsedUrl.Opaque) > 0 {", @@ -252,6 +497,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request Discussion page Vanilla line number 62 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "if len(parsedUrl.Opaque) > 0 {", + "selector": "TR:nth-child(4) > TD.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 570 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export interface CodeEditor {", @@ -259,6 +511,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 570 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export interface CodeEditor {", + "selector": "TR:nth-child(3) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 572 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "type: 'CodeEditor'", @@ -266,6 +525,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 572 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "type: 'CodeEditor'", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 572 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "readonly type: 'CodeEditor'", @@ -273,6 +539,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Split view line number 572 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "readonly type: 'CodeEditor'", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 570 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export interface CodeEditor {", @@ -280,6 +553,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 570 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export interface CodeEditor {", + "selector": "TR:nth-child(3) > TD.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 572 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "type: 'CodeEditor'", @@ -287,6 +567,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 572 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "type: 'CodeEditor'", + "selector": "TD.blob-code.blob-code-deletion:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 572 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "readonly type: 'CodeEditor'", @@ -294,6 +581,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Refined Github Unified view line number 572 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "readonly type: 'CodeEditor'", + "selector": "TD.blob-code.blob-code-addition:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 570 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export interface CodeEditor {", @@ -301,6 +595,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 570 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export interface CodeEditor {", + "selector": "TR:nth-child(3) > TD.code-review.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 572 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "type: 'CodeEditor'", @@ -308,6 +609,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 572 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "type: 'CodeEditor'", + "selector": "TD.code-review.blob-code.blob-code-deletion", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 572 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "readonly type: 'CodeEditor'", @@ -315,6 +623,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Split view line number 572 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "readonly type: 'CodeEditor'", + "selector": "TD.code-review.blob-code.blob-code-addition", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 570 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export interface CodeEditor {", @@ -322,6 +637,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 570 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export interface CodeEditor {", + "selector": "TR:nth-child(3) > TD.blob-code.blob-code-context:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 572 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "type: 'CodeEditor'", @@ -329,6 +651,13 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 572 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "type: 'CodeEditor'", + "selector": "TD.blob-code.blob-code-deletion:nth-child(4)", +} +`; + exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 572 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "readonly type: 'CodeEditor'", @@ -336,58 +665,121 @@ Object { } `; +exports[`GitHub DOM functions diffDomFunctions github.com Pull Request page Vanilla Unified view line number 572 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "readonly type: 'CodeEditor'", + "selector": "TD.blob-code.blob-code-addition:nth-child(4)", +} +`; + exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Refined Github line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// Copyright 2012 The Gorilla Authors. All rights reserved.", - "selector": "[id='LC1']", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Refined Github line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// Copyright 2012 The Gorilla Authors. All rights reserved.", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Refined Github line number 2 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// Use of this source code is governed by a BSD-style", - "selector": "[id='LC2']", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Refined Github line number 2 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// Use of this source code is governed by a BSD-style", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Vanilla line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// Copyright 2012 The Gorilla Authors. All rights reserved.", - "selector": "[id='LC1']", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Vanilla line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// Copyright 2012 The Gorilla Authors. All rights reserved.", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Vanilla line number 2 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "// Use of this source code is governed by a BSD-style", - "selector": "[id='LC2']", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions ghe-2.14.11 Vanilla line number 2 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "// Use of this source code is governed by a BSD-style", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions github.com Refined Github line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export const isURL = (value: any): value is URL =>", - "selector": "[id='LC1']", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions github.com Refined Github line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export const isURL = (value: any): value is URL =>", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions github.com Refined Github line number 2 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "!!value && typeof value.toString === 'function' && value.href === value.toString()", - "selector": "[id='LC2']", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions github.com Refined Github line number 2 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "!!value && typeof value.toString === 'function' && value.href === value.toString()", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions github.com Vanilla line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "export const isURL = (value: any): value is URL =>", - "selector": "[id='LC1']", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions github.com Vanilla line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "export const isURL = (value: any): value is URL =>", + "selector": "TR:nth-child(1) > TD.blob-code.blob-code-inner.js-file-line", } `; exports[`GitHub DOM functions singleFileDOMFunctions github.com Vanilla line number 2 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "!!value && typeof value.toString === 'function' && value.href === value.toString()", - "selector": "[id='LC2']", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", +} +`; + +exports[`GitHub DOM functions singleFileDOMFunctions github.com Vanilla line number 2 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "!!value && typeof value.toString === 'function' && value.href === value.toString()", + "selector": "TR:nth-child(2) > TD.blob-code.blob-code-inner.js-file-line", } `; diff --git a/browser/src/libs/github/dom_functions.ts b/browser/src/libs/github/dom_functions.ts index 1c20a5b593e03..37745cc67763c 100644 --- a/browser/src/libs/github/dom_functions.ts +++ b/browser/src/libs/github/dom_functions.ts @@ -1,4 +1,5 @@ -import { DiffPart, DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' +import { DOMFunctions } from '../code_intelligence/code_views' import { isDiffPageType, parseURL } from './util' const getDiffCodePart = (codeElement: HTMLElement): DiffPart => { @@ -65,6 +66,44 @@ const getCodeCellFromTarget = (target: HTMLElement): HTMLTableCellElement | null return cell } +/** + * Returns the `` containing the code (which may contain a `.blob-code-inner`) + */ +const getDiffCodeCellFromLineNumber = ( + codeView: HTMLElement, + line: number, + part?: DiffPart +): HTMLTableCellElement | null => { + const isSplitDiff = isDomSplitDiff(codeView) + const nthChild = getLineNumberElementIndex(part!, isSplitDiff) + 1 // nth-child() is 1-indexed + const lineNumberCell = codeView.querySelector( + `td:nth-child(${nthChild})[data-line-number="${line}"]` + ) + if (!lineNumberCell) { + return null + } + // In unified diff, the not-changed lines shall only be returned for the head. + // Without this check they would be returned for both head and base. + if ( + !isSplitDiff && + part === 'base' && + !lineNumberCell.classList.contains('blob-num-addition') && + !lineNumberCell.classList.contains('blob-num-deletion') + ) { + return null + } + let codeCell: HTMLTableCellElement + if (isSplitDiff) { + // In split diff view, the code cell is next to the line number cell + codeCell = lineNumberCell.nextElementSibling as HTMLTableCellElement + } else { + // In unified diff view, the code cell is the last cell + const row = lineNumberCell.parentElement as HTMLTableRowElement + codeCell = row.lastElementChild as HTMLTableCellElement + } + return codeCell +} + /** * Returns the `` element inside a cell. * The code element on diff pages is the `` element inside the cell, @@ -83,25 +122,10 @@ export const diffDomFunctions: DOMFunctions = { const codeCell = getCodeCellFromTarget(target) return codeCell && getBlobCodeInner(codeCell) }, + getLineElementFromLineNumber: getDiffCodeCellFromLineNumber, getCodeElementFromLineNumber: (codeView, line, part) => { - const isSplitDiff = isDomSplitDiff(codeView) - const nthChild = getLineNumberElementIndex(part!, isSplitDiff) + 1 // nth-child() is 1-indexed - const lineNumberCell = codeView.querySelector( - `td:nth-child(${nthChild})[data-line-number="${line}"]` - ) - if (!lineNumberCell) { - return null - } - let codeCell: HTMLTableCellElement - if (isSplitDiff) { - // In split diff view, the code cell is next to the line number cell - codeCell = lineNumberCell.nextElementSibling as HTMLTableCellElement - } else { - // In unified diff view, the code cell is the last cell - const row = lineNumberCell.parentElement! - codeCell = row.lastElementChild as HTMLTableCellElement - } - return getBlobCodeInner(codeCell) + const codeCell = getDiffCodeCellFromLineNumber(codeView, line, part!) + return codeCell && getBlobCodeInner(codeCell) }, getLineNumberFromCodeElement, getDiffCodePart, @@ -147,48 +171,47 @@ export const diffDomFunctions: DOMFunctions = { }, } +const getSingleFileCodeElementFromLineNumber = (codeView: HTMLElement, line: number): HTMLElement | null => { + const lineNumberCell = codeView.querySelector(`td[data-line-number="${line}"]`) + // In blob views, the `` is the code element + return lineNumberCell && (lineNumberCell.nextElementSibling as HTMLTableCellElement) +} + /** * Implementations of the DOM functions for GitHub blob code views */ export const singleFileDOMFunctions: DOMFunctions = { getCodeElementFromTarget: getCodeCellFromTarget, - getCodeElementFromLineNumber: (codeView, line) => { - const lineNumberCell = codeView.querySelector(`td[data-line-number="${line}"]`) - if (!lineNumberCell) { - return null - } - const codeCell = lineNumberCell.nextElementSibling as HTMLTableCellElement - // In blob views, the `` is the code element - return codeCell - }, + getCodeElementFromLineNumber: getSingleFileCodeElementFromLineNumber, + getLineElementFromLineNumber: getSingleFileCodeElementFromLineNumber, getLineNumberFromCodeElement, } -export const searchCodeSnippetDOMFunctions: DOMFunctions = { - getCodeElementFromTarget: getCodeCellFromTarget, - getCodeElementFromLineNumber: (codeView, line, part) => { - const lineNumberCells = codeView.querySelectorAll('td.blob-num') - let lineNumberCell: HTMLElement | null = null - - for (const cell of lineNumberCells) { - const a = cell.querySelector('a')! - if (a.href.match(new RegExp(`#L${line}$`))) { - lineNumberCell = cell as HTMLElement - break - } +const getSearchCodeSnippetLineNumberCellFromLineNumber = (codeView: HTMLElement, line: number): HTMLElement | null => { + const lineNumberCells = codeView.querySelectorAll('td.blob-num') + let lineNumberCell: HTMLTableCellElement | null = null + for (const cell of lineNumberCells) { + const a = cell.querySelector('a')! + if (a.href.endsWith(`#L${line}`)) { + lineNumberCell = cell as HTMLTableCellElement + break } + } + return lineNumberCell +} - if (!lineNumberCell) { - return null - } +const getSearchCodeSnippetCodeElementFromLineNumber = (codeView: HTMLElement, line: number): HTMLElement | null => { + const lineNumberCell = getSearchCodeSnippetLineNumberCellFromLineNumber(codeView, line) + // In search snippet views, the `` is the code element + return lineNumberCell && (lineNumberCell.nextElementSibling as HTMLTableCellElement) +} - const codeCell = lineNumberCell.nextElementSibling as HTMLTableCellElement - // In blob views, the `` is the code element - return codeCell - }, +export const searchCodeSnippetDOMFunctions: DOMFunctions = { + getCodeElementFromTarget: getCodeCellFromTarget, + getCodeElementFromLineNumber: getSearchCodeSnippetCodeElementFromLineNumber, + getLineElementFromLineNumber: getSearchCodeSnippetCodeElementFromLineNumber, getLineNumberFromCodeElement: (codeElement: HTMLElement): number => { const cell = codeElement.closest('td')!.previousElementSibling as HTMLTableCellElement - return parseInt(cell.firstElementChild!.textContent!, 10) }, } diff --git a/browser/src/libs/gitlab/__snapshots__/dom_functions.test.ts.snap b/browser/src/libs/gitlab/__snapshots__/dom_functions.test.ts.snap index 89e745bc35ff3..01c80ba27a4d5 100644 --- a/browser/src/libs/gitlab/__snapshots__/dom_functions.test.ts.snap +++ b/browser/src/libs/gitlab/__snapshots__/dom_functions.test.ts.snap @@ -7,51 +7,107 @@ Object { } `; +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 733 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "defer srv.Close()", + "selector": "TR.line_holder.parallel:nth-child(3) > TD.line_content.parallel.right-side", +} +`; + exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 735 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "u := url.URL{Scheme: \\"ws\\", Host: srv.Listener.Addr().String(), Path: build.Session.Endpoint + \\"/exec\\"}", - "selector": "[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_735_735'] > *", + "selector": "TD[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_735_735'].line_content.parallel.left-side.old > SPAN.line", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 735 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "u := url.URL{Scheme: \\"ws\\", Host: srv.Listener.Addr().String(), Path: build.Session.Endpoint + \\"/exec\\"}", + "selector": "TR.line_holder.parallel:nth-child(5) > TD.line_content.parallel.left-side.old", } `; exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 740 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "headers := http.Header{", - "selector": "[id='LC740']", + "selector": "TD[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_737_740'].line_content.parallel.right-side.new > SPAN.line", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Split view line number 740 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "headers := http.Header{", + "selector": "TR.line_holder.parallel:nth-child(10) > TD.line_content.parallel.right-side.new", } `; exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 733 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "defer srv.Close()", - "selector": "[id='LC733']", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_733_733'].line_holder:nth-child(3) > TD.line_content > SPAN.line", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 733 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "defer srv.Close()", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_733_733'].line_holder:nth-child(3) > TD.line_content", } `; exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 735 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "u := url.URL{Scheme: \\"ws\\", Host: srv.Listener.Addr().String(), Path: build.Session.Endpoint + \\"/exec\\"}", - "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_735_735'] > TD > SPAN", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_735_735'].line_holder.old:nth-child(5) > TD.line_content.old > SPAN.line", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 735 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "u := url.URL{Scheme: \\"ws\\", Host: srv.Listener.Addr().String(), Path: build.Session.Endpoint + \\"/exec\\"}", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_735_735'].line_holder.old:nth-child(5) > TD.line_content.old", } `; exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 740 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "headers := http.Header{", - "selector": "[id='LC740']", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_737_740'].line_holder.new:nth-child(12) > TD.line_content.new > SPAN.line", +} +`; + +exports[`Bitbucket DOM functions diffDOMFunctions Unified view line number 740 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "headers := http.Header{", + "selector": "TR[id='ca8e0332ce17b2ee630a2ee2c0b56d47a462dadf_737_740'].line_holder.new:nth-child(12) > TD.line_content.new", } `; exports[`Bitbucket DOM functions singleFileDOMFunctions line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "package shell", - "selector": "[id='LC1']", + "selector": "SPAN.line:nth-child(1)", +} +`; + +exports[`Bitbucket DOM functions singleFileDOMFunctions line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "package shell", + "selector": "SPAN.line:nth-child(1)", } `; exports[`Bitbucket DOM functions singleFileDOMFunctions line number 22 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "type executor struct {", - "selector": "[id='LC22']", + "selector": "SPAN.line:nth-child(22)", +} +`; + +exports[`Bitbucket DOM functions singleFileDOMFunctions line number 22 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "type executor struct {", + "selector": "SPAN.line:nth-child(22)", } `; diff --git a/browser/src/libs/gitlab/dom_functions.ts b/browser/src/libs/gitlab/dom_functions.ts index 659a6b02dbd1b..56cbc9062443a 100644 --- a/browser/src/libs/gitlab/dom_functions.ts +++ b/browser/src/libs/gitlab/dom_functions.ts @@ -1,12 +1,19 @@ -import { DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' +import { DOMFunctions } from '../code_intelligence/code_views' +const getSingleFileCodeElementFromLineNumber = ( + codeView: HTMLElement, + line: number, + part?: DiffPart +): HTMLElement | null => codeView.querySelector(`#LC${line}`) export const singleFileDOMFunctions: DOMFunctions = { getCodeElementFromTarget: target => target.closest('span.line') as HTMLElement | null, getLineNumberFromCodeElement: codeElement => { const line = codeElement.id.replace(/^LC/, '') return parseInt(line, 10) }, - getCodeElementFromLineNumber: (codeView, line) => codeView.querySelector(`#LC${line}`), + getCodeElementFromLineNumber: getSingleFileCodeElementFromLineNumber, + getLineElementFromLineNumber: getSingleFileCodeElementFromLineNumber, } const getDiffCodePart: DOMFunctions['getDiffCodePart'] = codeElement => { @@ -22,6 +29,29 @@ const getDiffCodePart: DOMFunctions['getDiffCodePart'] = codeElement => { return row.classList.contains(selector) ? 'base' : 'head' } +const getDiffCodeElementFromLineNumber = (codeView: HTMLElement, line: number, part?: DiffPart): HTMLElement | null => { + const lineNumberElement = codeView.querySelector( + `.${part === 'base' ? 'old_line' : 'new_line'} [data-linenumber="${line}"]` + ) + if (!lineNumberElement) { + return null + } + + const row = lineNumberElement.closest('tr') + if (!row) { + return null + } + + let selector = 'span.line' + + // Split diff + if (row.classList.contains('parallel')) { + selector = `.${part === 'base' ? 'left-side' : 'right-side'} ${selector}` + } + + return row.querySelector(selector) +} + export const diffDOMFunctions: DOMFunctions = { getCodeElementFromTarget: singleFileDOMFunctions.getCodeElementFromTarget, getLineNumberFromCodeElement: codeElement => { @@ -43,27 +73,10 @@ export const diffDOMFunctions: DOMFunctions = { throw new Error('Unable to determine line number for diff code element') }, - getCodeElementFromLineNumber: (codeView, line, part) => { - const lineNumberElement = codeView.querySelector( - `.${part === 'base' ? 'old_line' : 'new_line'} [data-linenumber="${line}"]` - ) - if (!lineNumberElement) { - return null - } - - const row = lineNumberElement.closest('tr') - if (!row) { - return null - } - - let selector = 'span.line' - - // Split diff - if (row.classList.contains('parallel')) { - selector = `.${part === 'base' ? 'left-side' : 'right-side'} ${selector}` - } - - return row.querySelector(selector) + getCodeElementFromLineNumber: getDiffCodeElementFromLineNumber, + getLineElementFromLineNumber: (codeView, line, part) => { + const codeElement = getDiffCodeElementFromLineNumber(codeView, line, part) + return codeElement && (codeElement.parentElement as HTMLTableCellElement) }, getDiffCodePart, } diff --git a/browser/src/libs/phabricator/__snapshots__/dom_functions.test.ts.snap b/browser/src/libs/phabricator/__snapshots__/dom_functions.test.ts.snap index 90e7ddab3c4b7..a2f0c5aa04e41 100644 --- a/browser/src/libs/phabricator/__snapshots__/dom_functions.test.ts.snap +++ b/browser/src/libs/phabricator/__snapshots__/dom_functions.test.ts.snap @@ -7,6 +7,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Split view line number 3 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​import (", + "selector": "TR:nth-child(3) > TD:nth-child(5)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Commit Page Split view line number 7 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "​func log() {", @@ -14,6 +21,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Split view line number 7 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​func log() {", + "selector": "TR:nth-child(7) > TD.new.new-full:nth-child(5)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Commit Page Split view line number 10 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "fmt.Println(\\"Debug\\")", @@ -21,6 +35,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Split view line number 10 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "fmt.Println(\\"Debug\\")", + "selector": "TR:nth-child(15) > TD.old:nth-child(2)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 3 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "import (", @@ -28,6 +49,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 3 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "import (", + "selector": "TR:nth-child(3) > TD.right:nth-child(4)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 7 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "func log() {", @@ -35,6 +63,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 7 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "func log() {", + "selector": "TR:nth-child(7) > TD.right.new:nth-child(4)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 10 in base diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "fmt.Println(\\"Debug\\")", @@ -42,6 +77,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Commit Page Unified view line number 10 in base diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "fmt.Println(\\"Debug\\")", + "selector": "TR:nth-child(15) > TD.left.old:nth-child(4)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Differential Page Split view line number 9 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "​ Println(\\"hello world\\")", @@ -49,6 +91,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Differential Page Split view line number 9 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​ Println(\\"hello world\\")", + "selector": "TR:nth-child(9) > TD:nth-child(5)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Differential Page Split view line number 10 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "​ fmt.Println(\\"Debug\\")", @@ -56,6 +105,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Differential Page Split view line number 10 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​ fmt.Println(\\"Debug\\")", + "selector": "TR:nth-child(10) > TD.new.new-full:nth-child(5)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Differential Page Unified view line number 9 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "Println(\\"hello world\\")", @@ -63,6 +119,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Differential Page Unified view line number 9 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "Println(\\"hello world\\")", + "selector": "TR:nth-child(9) > TD.right:nth-child(4)", +} +`; + exports[`Phabricator DOM functions diffDOMFunctions Differential Page Unified view line number 10 in head diff part getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "fmt.Println(\\"Debug\\")", @@ -70,6 +133,13 @@ Object { } `; +exports[`Phabricator DOM functions diffDOMFunctions Differential Page Unified view line number 10 in head diff part getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "fmt.Println(\\"Debug\\")", + "selector": "TR:nth-child(10) > TD.right.new:nth-child(4)", +} +`; + exports[`Phabricator DOM functions diffusionDOMFns line number 1 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "​package main", @@ -77,9 +147,23 @@ Object { } `; +exports[`Phabricator DOM functions diffusionDOMFns line number 1 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​package main", + "selector": "TR:nth-child(1) > TD", +} +`; + exports[`Phabricator DOM functions diffusionDOMFns line number 10 getCodeElementFromLineNumber() should return the right code element given the line number 1`] = ` Object { "content": "​}", "selector": "TR:nth-child(10) > TD", } `; + +exports[`Phabricator DOM functions diffusionDOMFns line number 10 getLineElementFromLineNumber() should return the right line element given the line number 1`] = ` +Object { + "content": "​}", + "selector": "TR:nth-child(10) > TD", +} +`; diff --git a/browser/src/libs/phabricator/dom_functions.ts b/browser/src/libs/phabricator/dom_functions.ts index 1e21692bf6c86..01bc7fbac86bc 100644 --- a/browser/src/libs/phabricator/dom_functions.ts +++ b/browser/src/libs/phabricator/dom_functions.ts @@ -1,6 +1,7 @@ -import { DOMFunctions } from '@sourcegraph/codeintellify' +import { DiffPart } from '@sourcegraph/codeintellify' +import { DOMFunctions } from '../code_intelligence/code_views' -const getLineNumberCell = (codeElement: HTMLElement) => { +const getLineNumberCellFromCodeElement = (codeElement: HTMLElement) => { let elem: HTMLElement | null = codeElement while ((elem && elem.tagName !== 'TH') || (elem && !elem.textContent)) { elem = elem.previousElementSibling as HTMLElement | null @@ -8,6 +9,31 @@ const getLineNumberCell = (codeElement: HTMLElement) => { return elem } +const getDiffLineNumberElementFromLineNumber = ( + codeView: HTMLElement, + line: number, + part?: DiffPart +): HTMLElement | null => { + const lineNumberCells = codeView.querySelectorAll( + `th:nth-of-type(${part === 'base' ? 1 : 2})` + ) + for (const lineNumberCell of lineNumberCells) { + if (lineNumberCell.textContent && parseInt(lineNumberCell.textContent, 10) === line) { + return lineNumberCell + } + } + return null +} + +const getDiffCodeElementFromLineNumber = (codeView: HTMLElement, line: number, part?: DiffPart): HTMLElement | null => { + const lineNumberCell = getDiffLineNumberElementFromLineNumber(codeView, line, part) + let codeElement: HTMLElement | null = lineNumberCell + while (codeElement && (codeElement.tagName !== 'TD' || codeElement.classList.contains('copy'))) { + codeElement = codeElement.nextElementSibling as HTMLElement | null + } + return codeElement +} + /** * Implementations of the DOM functions for diff code views on Phabricator */ @@ -20,30 +46,19 @@ export const diffDomFunctions: DOMFunctions = { const td = target.closest('td') if ( td && - (td.classList.contains('show-more') || td.classList.contains('show-context') || !getLineNumberCell(td)) + (td.classList.contains('show-more') || + td.classList.contains('show-context') || + !getLineNumberCellFromCodeElement(td)) ) { return null } return td }, - getCodeElementFromLineNumber: (codeView, line, part) => { - const lineNumberCells = codeView.querySelectorAll(`th:nth-of-type(${part === 'base' ? 1 : 2})`) - for (const lineNumberCell of lineNumberCells) { - if (lineNumberCell.textContent && parseInt(lineNumberCell.textContent, 10) === line) { - let codeElement = lineNumberCell as HTMLElement | null - while (codeElement && (codeElement.tagName !== 'TD' || codeElement.classList.contains('copy'))) { - codeElement = codeElement.nextElementSibling as HTMLElement | null - } - - return codeElement - } - } - - return null - }, + getCodeElementFromLineNumber: getDiffCodeElementFromLineNumber, + getLineElementFromLineNumber: getDiffCodeElementFromLineNumber, getLineNumberFromCodeElement: codeElement => { - const elem = getLineNumberCell(codeElement) + const elem = getLineNumberCellFromCodeElement(codeElement) if (elem === null) { throw new Error('could not find line number element from code element') @@ -90,16 +105,22 @@ export const diffDomFunctions: DOMFunctions = { }, } +const getDiffusionCodeElementFromLineNumber = ( + codeView: HTMLElement, + line: number, + part?: DiffPart +): HTMLElement | null => { + const row = codeView.querySelector(`tr:nth-of-type(${line})`) + if (!row) { + throw new Error(`unable to find row ${line} from code view`) + } + return row.querySelector('td') +} + export const diffusionDOMFns: DOMFunctions = { getCodeElementFromTarget: target => target.closest('td'), - getCodeElementFromLineNumber: (codeView, line) => { - const row = codeView.querySelector(`tr:nth-of-type(${line})`) - if (!row) { - throw new Error(`unable to find row ${line} from code view`) - } - - return row.querySelector('td') - }, + getCodeElementFromLineNumber: getDiffusionCodeElementFromLineNumber, + getLineElementFromLineNumber: getDiffusionCodeElementFromLineNumber, getLineNumberFromCodeElement: codeElement => { let lineCell = codeElement as HTMLElement | null while ( diff --git a/browser/src/shared/util/dom.tsx b/browser/src/shared/util/dom.tsx index 85a902363d4f3..b0ca396d5de8e 100644 --- a/browser/src/shared/util/dom.tsx +++ b/browser/src/shared/util/dom.tsx @@ -100,7 +100,7 @@ export function querySelectorAllOrSelf( element: Element, selectors: string ): ArrayLike & Iterable -export function querySelectorAllOrSelf(element: Element, selectors: string): ArrayLike & Iterable { +export function querySelectorAllOrSelf(element: Element, selectors: string): ArrayLike & Iterable { return element.matches(selectors) ? [element] : element.querySelectorAll(selectors) } diff --git a/shared/src/api/client/services/decoration.test.ts b/shared/src/api/client/services/decoration.test.ts index 2a1f5b678046a..c90d2888f8ea0 100644 --- a/shared/src/api/client/services/decoration.test.ts +++ b/shared/src/api/client/services/decoration.test.ts @@ -135,7 +135,6 @@ describe('decorationStyleForTheme', () => { test('supports no theme overrides', () => expect(decorationStyleForTheme({ range: FIXTURE_RANGE, backgroundColor: 'red' }, true)).toEqual({ - range: FIXTURE_RANGE, // it's not necessary that range is included, but it saves an object allocation backgroundColor: 'red', })) diff --git a/shared/src/api/client/services/decoration.ts b/shared/src/api/client/services/decoration.ts index 7aaaae0902710..f8d8acca927ff 100644 --- a/shared/src/api/client/services/decoration.ts +++ b/shared/src/api/client/services/decoration.ts @@ -48,9 +48,6 @@ export function decorationStyleForTheme( isLightTheme: boolean ): ThemableDecorationStyle { const overrides = isLightTheme ? attachment.light : attachment.dark - if (!overrides) { - return attachment - } // Discard non-ThemableDecorationStyle properties so they aren't included in result. const { range, isWholeLine, after, light, dark, ...base } = attachment return { ...base, ...overrides } @@ -64,10 +61,28 @@ export function decorationAttachmentStyleForTheme( isLightTheme: boolean ): ThemableDecorationAttachmentStyle { const overrides = isLightTheme ? attachment.light : attachment.dark - if (!overrides) { - return attachment - } // Discard non-ThemableDecorationAttachmentStyle properties so they aren't included in result. const { contentText, hoverMessage, linkURL, light, dark, ...base } = attachment return { ...base, ...overrides } } + +export type DecorationMapByLine = ReadonlyMap + +/** + * @returns Map from 1-based line number to non-empty array of TextDocumentDecoration for that line + * + * @todo this does not handle decorations that span multiple lines + */ +export const groupDecorationsByLine = (decorations: TextDocumentDecoration[] | null): DecorationMapByLine => { + const grouped = new Map() + for (const d of decorations || []) { + const lineNumber = d.range.start.line + 1 + const decorationsForLine = grouped.get(lineNumber) + if (!decorationsForLine) { + grouped.set(lineNumber, [d]) + } else { + decorationsForLine.push(d) + } + } + return grouped +} diff --git a/shared/src/api/extension/api/codeEditor.ts b/shared/src/api/extension/api/codeEditor.ts index 7a9cd29b75bbc..2b15975bf61ed 100644 --- a/shared/src/api/extension/api/codeEditor.ts +++ b/shared/src/api/extension/api/codeEditor.ts @@ -10,6 +10,19 @@ import { ExtDocuments } from './documents' const DEFAULT_DECORATION_TYPE = createDecorationType() +/** + * Returns true if all of the objects properties are empty null, undefined, empty strings or objects that are also empty. + */ +const isEmptyObjectDeep = (value: any): boolean => + Array.isArray(value) + ? value.every(isEmptyObjectDeep) + : typeof value === 'object' && value !== null + ? Object.values(value).every(isEmptyObjectDeep) + : !value + +const isDecorationEmpty = ({ range, isWholeLine, ...contents }: clientType.TextDocumentDecoration) => + isEmptyObjectDeep(contents) + /** @internal */ export class ExtCodeEditor implements sourcegraph.CodeEditor { /** The URI of this editor's document. */ @@ -48,7 +61,11 @@ export class ExtCodeEditor implements sourcegraph.CodeEditor { // may not supply a decorationType decorationType = decorationType || DEFAULT_DECORATION_TYPE // tslint:disable-next-line: no-floating-promises - this.proxy.$setDecorations(this.resource, decorationType.key, decorations.map(fromTextDocumentDecoration)) + this.proxy.$setDecorations( + this.resource, + decorationType.key, + decorations.map(fromTextDocumentDecoration).filter(decoration => !isDecorationEmpty(decoration)) + ) } public update(data: Pick): void { diff --git a/web/src/SourcegraphWebApp.tsx b/web/src/SourcegraphWebApp.tsx index abfd6384dc471..ef80506fb0f45 100644 --- a/web/src/SourcegraphWebApp.tsx +++ b/web/src/SourcegraphWebApp.tsx @@ -7,12 +7,12 @@ import { combineLatest, from, fromEventPattern, Subscription } from 'rxjs' import { startWith } from 'rxjs/operators' import { setLinkComponent } from '../../shared/src/components/Link' import { + Controller as ExtensionsController, createController as createExtensionsController, - ExtensionsControllerProps, } from '../../shared/src/extensions/controller' import * as GQL from '../../shared/src/graphql/schema' import { Notifications } from '../../shared/src/notifications/Notifications' -import { PlatformContextProps } from '../../shared/src/platform/context' +import { PlatformContext } from '../../shared/src/platform/context' import { EMPTY_SETTINGS_CASCADE, SettingsCascadeProps } from '../../shared/src/settings/settings' import { isErrorLike } from '../../shared/src/util/errors' import { authenticatedUser } from './auth' @@ -63,7 +63,7 @@ export interface SourcegraphWebAppProps extends KeybindingsProps { routes: ReadonlyArray } -interface SourcegraphWebAppState extends PlatformContextProps, SettingsCascadeProps, ExtensionsControllerProps { +interface SourcegraphWebAppState extends SettingsCascadeProps { error?: Error /** The currently authenticated user (or null if the viewer is anonymous). */ @@ -117,18 +117,18 @@ const LayoutWithActivation = window.context.sourcegraphDotComMode ? Layout : wit * The root component */ export class SourcegraphWebApp extends React.Component { - private subscriptions = new Subscription() - private darkThemeMediaList = window.matchMedia('(prefers-color-scheme: dark)') + private readonly subscriptions = new Subscription() + private readonly darkThemeMediaList = window.matchMedia('(prefers-color-scheme: dark)') + private readonly platformContext: PlatformContext = createPlatformContext() + private readonly extensionsController: ExtensionsController = createExtensionsController(this.platformContext) constructor(props: SourcegraphWebAppProps) { super(props) - const platformContext = createPlatformContext() + this.subscriptions.add(this.extensionsController) this.state = { themePreference: readStoredThemePreference(), systemIsLightTheme: !this.darkThemeMediaList.matches, navbarSearchQuery: '', - platformContext, - extensionsController: createExtensionsController(platformContext), settingsCascade: EMPTY_SETTINGS_CASCADE, viewerSubject: SITE_SUBJECT_NO_ADMIN, } @@ -153,7 +153,7 @@ export class SourcegraphWebApp extends React.Component { this.setState(() => { if (authenticatedUser) { @@ -168,10 +168,8 @@ export class SourcegraphWebApp extends React.Component this.setState({ settingsCascade })) + from(this.platformContext.settings).subscribe(settingsCascade => this.setState({ settingsCascade })) ) // React to OS theme change @@ -255,8 +253,8 @@ export class SourcegraphWebApp extends React.Component @@ -264,7 +262,7 @@ export class SourcegraphWebApp extends React.Component - + ) diff --git a/web/src/components/FilteredConnection.tsx b/web/src/components/FilteredConnection.tsx index 6d030cfd81af6..bdb7fde36fd7d 100644 --- a/web/src/components/FilteredConnection.tsx +++ b/web/src/components/FilteredConnection.tsx @@ -482,7 +482,7 @@ export class FilteredConnection = Connection let lastQuery: string | undefined let lastFilter: FilteredConnectionFilter | undefined this.subscriptions.add( - combineLatest(queryChanges, activeFilterChanges, refreshRequests.pipe(startWith(undefined))) + combineLatest([queryChanges, activeFilterChanges, refreshRequests.pipe(startWith(undefined))]) .pipe( tap(([query, filter]) => { if (this.props.shouldUpdateURLQuery) { diff --git a/web/src/repo/commit/RepositoryCommitPage.tsx b/web/src/repo/commit/RepositoryCommitPage.tsx index 465f1ac200827..300a13417b084 100644 --- a/web/src/repo/commit/RepositoryCommitPage.tsx +++ b/web/src/repo/commit/RepositoryCommitPage.tsx @@ -22,6 +22,7 @@ import { getHover } from '../../backend/features' import { queryGraphQL } from '../../backend/graphql' import { PageTitle } from '../../components/PageTitle' import { WebHoverOverlay } from '../../components/shared' +import { ThemeProps } from '../../theme' import { eventLogger, EventLoggerProps } from '../../tracking/eventLogger' import { GitCommitNode } from '../commits/GitCommitNode' import { gitCommitFragment } from '../commits/RepositoryCommitsPage' @@ -65,7 +66,8 @@ interface Props extends RouteComponentProps<{ revspec: string }>, EventLoggerProps, PlatformContextProps, - ExtensionsControllerProps { + ExtensionsControllerProps, + ThemeProps { repo: GQL.IRepository onDidUpdateExternalLinks: (externalLinks: GQL.IExternalLink[] | undefined) => void @@ -222,6 +224,7 @@ export class RepositoryCommitPage extends React.Component { queryConnection={this.queryDiffs} nodeComponent={FileDiffNode} nodeComponentProps={{ + ...this.props, base: { repoName: this.props.repo.name, repoID: this.props.repo.id, @@ -235,11 +238,7 @@ export class RepositoryCommitPage extends React.Component { commitID: this.state.commitOrError.oid, }, lineNumbers: true, - platformContext: this.props.platformContext, - location: this.props.location, - history: this.props.history, hoverifier: this.hoverifier, - extensionsController: this.props.extensionsController, }} updateOnChange={`${this.props.repo.id}:${this.state.commitOrError.oid}`} defaultFirst={25} diff --git a/web/src/repo/compare/DiffHunk.test.tsx b/web/src/repo/compare/DiffHunk.test.tsx new file mode 100644 index 0000000000000..7c7bf6eea4017 --- /dev/null +++ b/web/src/repo/compare/DiffHunk.test.tsx @@ -0,0 +1,114 @@ +import { Range } from '@sourcegraph/extension-api-classes' +import { TextDocumentDecoration } from '@sourcegraph/extension-api-types' +import * as H from 'history' +import React from 'react' +import renderer from 'react-test-renderer' +import * as GQL from '../../../../shared/src/graphql/schema' +import { DiffHunk } from './DiffHunk' + +describe('DiffHunk', () => { + const history = H.createMemoryHistory() + + // tslint:disable-next-line: no-object-literal-type-assertion + const hunk = { + oldRange: { startLine: 159, lines: 7 }, + oldNoNewlineAt: false, + newRange: { startLine: 159, lines: 7 }, + section: 'export async function register({', + body: + ' const subscriptions = new Subscription()\n const decorationType = sourcegraph.app.createDecorationType()\n const connection = await createConnection()\n- logger.log(`WebSocket connection to TypeScript backend opened`)\n+ logger.log(`WebSocket connection to language server opened`)\n subscriptions.add(\n connection.observeNotification(LogMessageNotification.type).subscribe(({ type, message }) =\u003e {\n const method = LSP_TO_LOG_LEVEL[type]\n', + } as GQL.IFileDiffHunk + + it('renders a unified diff view for the given diff hunk', () => { + expect( + renderer + .create( + + ) + .toJSON() + ).toMatchSnapshot() + }) + + const decorations = { + head: new Map([ + [ + 159, + [ + { + range: new Range(158, 0, 158, 0), + isWholeLine: true, + backgroundColor: 'red', + dark: { border: '1px blue solid' }, + after: { + contentText: 'head content', + hoverMessage: 'base hover msg', + backgroundColor: 'black', + }, + }, + ], + ], + ]), + base: new Map([ + [ + 162, + [ + { + range: new Range(161, 0, 161, 0), + isWholeLine: true, + backgroundColor: 'blue', + dark: { border: '1px blue solid' }, + after: { + contentText: 'base content', + hoverMessage: 'base hover msg', + backgroundColor: 'black', + }, + }, + ], + ], + ]), + } + + it('renders decorations if given', () => { + expect( + renderer + .create( + + ) + .toJSON() + ).toMatchSnapshot() + }) + + it('renders dark theme decorations if dark theme is active', () => { + expect( + renderer + .create( + + ) + .toJSON() + ).toMatchSnapshot() + }) +}) diff --git a/web/src/repo/compare/DiffHunk.tsx b/web/src/repo/compare/DiffHunk.tsx new file mode 100644 index 0000000000000..ff6522c8297a9 --- /dev/null +++ b/web/src/repo/compare/DiffHunk.tsx @@ -0,0 +1,150 @@ +import * as H from 'history' +import * as React from 'react' +import { + decorationAttachmentStyleForTheme, + DecorationMapByLine, + decorationStyleForTheme, +} from '../../../../shared/src/api/client/services/decoration' +import { LinkOrSpan } from '../../../../shared/src/components/LinkOrSpan' +import * as GQL from '../../../../shared/src/graphql/schema' +import { propertyIsDefined } from '../../../../shared/src/util/types' +import { ThemeProps } from '../../theme' + +const DiffBoundary: React.FunctionComponent<{ + /** The "lines" property is set for end boundaries (only for start boundaries and between hunks). */ + oldRange: { + startLine: number + lines?: number + } + newRange: { + startLine: number + lines?: number + } + section: string | null + lineNumberClassName: string + contentClassName: string + lineNumbers: boolean +}> = props => ( + + {props.lineNumbers && } + + {props.oldRange.lines !== undefined && props.newRange.lines !== undefined && ( + + @@ -{props.oldRange.startLine},{props.oldRange.lines} +{props.newRange.startLine}, + {props.newRange.lines} {props.section && `@@ ${props.section}`} + + )} + + +) +export const DiffHunk: React.FunctionComponent< + { + /** The anchor (URL hash link) of the file diff. The component creates sub-anchors with this prefix. */ + fileDiffAnchor: string + hunk: GQL.IFileDiffHunk + lineNumbers: boolean + decorations: Record<'head' | 'base', DecorationMapByLine> + location: H.Location + history: H.History + } & ThemeProps +> = ({ fileDiffAnchor, decorations, hunk, lineNumbers, location, history, isLightTheme }) => { + let oldLine = hunk.oldRange.startLine + let newLine = hunk.newRange.startLine + return ( + <> + + {hunk.body + .split('\n') + .slice(0, -1) + .map((line, i) => { + if (line[0] !== '+') { + oldLine++ + } + if (line[0] !== '-') { + newLine++ + } + const oldAnchor = `${fileDiffAnchor}L${oldLine - 1}` + const newAnchor = `${fileDiffAnchor}R${newLine - 1}` + const decorationsForLine = [ + // If the line was deleted, look for decorations in the base rev + ...((line[0] === '-' && decorations.base.get(oldLine - 1)) || []), + // If the line wasn't deleted, look for decorations in the head rev + ...((line[0] !== '-' && decorations.head.get(newLine - 1)) || []), + ] + const lineStyle = decorationsForLine + .filter(decoration => decoration.isWholeLine) + .map(decoration => decorationStyleForTheme(decoration, isLightTheme)) + .reduce((style, decoration) => ({ ...style, ...decoration }), {}) + return ( + + {lineNumbers && ( + <> + {line[0] !== '+' ? ( + history.push({ hash: oldAnchor })} + /> + ) : ( + + )} + + {line[0] !== '-' ? ( + history.push({ hash: newAnchor })} + /> + ) : ( + + )} + + )} + + {/* tslint:disable-next-line: jsx-ban-props Needed for decorations */} + + {line} + {decorationsForLine.filter(propertyIsDefined('after')).map((decoration, i) => { + const style = decorationAttachmentStyleForTheme(decoration.after, isLightTheme) + return ( + + {' '} + + {decoration.after.contentText} + + + ) + })} + + + ) + })} + + ) +} diff --git a/web/src/repo/compare/FileDiffConnection.tsx b/web/src/repo/compare/FileDiffConnection.tsx index 462b63b51362a..d15a870f281e5 100644 --- a/web/src/repo/compare/FileDiffConnection.tsx +++ b/web/src/repo/compare/FileDiffConnection.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { Omit } from 'utility-types' import { ExtensionsControllerProps } from '../../../../shared/src/extensions/controller' import * as GQL from '../../../../shared/src/graphql/schema' import { getModeFromPath } from '../../../../shared/src/languages' @@ -6,21 +7,7 @@ import { ErrorLike, isErrorLike } from '../../../../shared/src/util/errors' import { Connection, FilteredConnection } from '../../components/FilteredConnection' import { FileDiffNodeProps } from './FileDiffNode' -class FilteredFileDiffConnection extends FilteredConnection< - GQL.IFileDiff, - Pick< - FileDiffNodeProps, - | 'base' - | 'head' - | 'lineNumbers' - | 'className' - | 'platformContext' - | 'location' - | 'history' - | 'hoverifier' - | 'extensionsController' - > -> {} +class FilteredFileDiffConnection extends FilteredConnection> {} type Props = FilteredFileDiffConnection['props'] & ExtensionsControllerProps diff --git a/web/src/repo/compare/FileDiffHunks.tsx b/web/src/repo/compare/FileDiffHunks.tsx index 7c946c83067e1..185162c8db7b1 100644 --- a/web/src/repo/compare/FileDiffHunks.tsx +++ b/web/src/repo/compare/FileDiffHunks.tsx @@ -1,196 +1,43 @@ -import { DiffPart, DOMFunctions, findPositionsFromEvents, Hoverifier } from '@sourcegraph/codeintellify' +import { findPositionsFromEvents, Hoverifier } from '@sourcegraph/codeintellify' +import { TextDocumentDecoration } from '@sourcegraph/extension-api-types' import * as H from 'history' import { isEqual } from 'lodash' import * as React from 'react' -import { NEVER, Subject, Subscription } from 'rxjs' -import { filter } from 'rxjs/operators' +import { combineLatest, NEVER, Observable, of, Subject, Subscription } from 'rxjs' +import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators' import { ActionItemAction } from '../../../../shared/src/actions/ActionItem' +import { DecorationMapByLine, groupDecorationsByLine } from '../../../../shared/src/api/client/services/decoration' import { HoverMerged } from '../../../../shared/src/api/client/types/hover' +import { ExtensionsControllerProps } from '../../../../shared/src/extensions/controller' import * as GQL from '../../../../shared/src/graphql/schema' import { PlatformContextProps } from '../../../../shared/src/platform/context' import { isDefined } from '../../../../shared/src/util/types' -import { FileSpec, RepoSpec, ResolvedRevSpec, RevSpec } from '../../../../shared/src/util/url' +import { FileSpec, RepoSpec, ResolvedRevSpec, RevSpec, toURIWithPath } from '../../../../shared/src/util/url' +import { ThemeProps } from '../../theme' +import { DiffHunk } from './DiffHunk' +import { diffDomFunctions } from './dom-functions' -const DiffBoundary: React.FunctionComponent<{ - /** The "lines" property is set for end boundaries (only for start boundaries and between hunks). */ - oldRange: { startLine: number; lines?: number } - newRange: { startLine: number; lines?: number } - - section: string | null - - lineNumberClassName: string - contentClassName: string - - lineNumbers: boolean -}> = props => ( - - {props.lineNumbers && } - - {props.oldRange.lines !== undefined && props.newRange.lines !== undefined && ( - - @@ -{props.oldRange.startLine},{props.oldRange.lines} +{props.newRange.startLine}, - {props.newRange.lines} {props.section && `@@ ${props.section}`} - - )} - - -) - -const DiffHunk: React.FunctionComponent<{ - /** The anchor (URL hash link) of the file diff. The component creates sub-anchors with this prefix. */ - fileDiffAnchor: string - - hunk: GQL.IFileDiffHunk - lineNumbers: boolean - - location: H.Location - history: H.History -}> = ({ fileDiffAnchor, hunk, lineNumbers, location, history }) => { - let oldLine = hunk.oldRange.startLine - let newLine = hunk.newRange.startLine - return ( - <> - - {hunk.body - .split('\n') - .slice(0, -1) - .map((line, i) => { - if (line[0] !== '+') { - oldLine++ - } - if (line[0] !== '-') { - newLine++ - } - const oldAnchor = `${fileDiffAnchor}L${oldLine - 1}` - const newAnchor = `${fileDiffAnchor}R${newLine - 1}` - return ( - - {lineNumbers && ( - <> - {line[0] !== '+' ? ( - history.push({ hash: oldAnchor })} - /> - ) : ( - - )} - {line[0] !== '-' ? ( - history.push({ hash: newAnchor })} - /> - ) : ( - - )} - - )} - {line} - - ) - })} - - ) -} - -const diffDomFunctions: DOMFunctions = { - getCodeElementFromTarget: (target: HTMLElement): HTMLTableCellElement | null => { - const row = target.closest('tr') - if (!row) { - return null - } - return row.cells[2] - }, - - getCodeElementFromLineNumber: ( - codeView: HTMLElement, - line: number, - part?: DiffPart - ): HTMLTableCellElement | null => { - // For unchanged lines, prefer line number in head - const lineNumberCell = codeView.querySelector(`[data-line="${line}"][data-part="${part || 'head'}"]`) - if (!lineNumberCell) { - return null - } - const row = lineNumberCell.parentElement as HTMLTableRowElement - const codeCell = row.cells[2] - return codeCell - }, - - getLineNumberFromCodeElement: (codeCell: HTMLElement): number => { - const row = codeCell.closest('tr') - if (!row) { - throw new Error('Could not find closest row for codeCell') - } - const [baseLineNumberCell, headLineNumberCell] = row.cells - // For unchanged lines, prefer line number in head - if (headLineNumberCell.dataset.line) { - return +headLineNumberCell.dataset.line - } - if (baseLineNumberCell.dataset.line) { - return +baseLineNumberCell.dataset.line - } - throw new Error('Neither head or base line number cell have data-line set') - }, - - getDiffCodePart: (codeCell: HTMLElement): DiffPart => { - const row = codeCell.parentElement as HTMLTableRowElement - const [baseLineNumberCell, headLineNumberCell] = row.cells - if (baseLineNumberCell.dataset.part && headLineNumberCell.dataset.part) { - return null - } - if (baseLineNumberCell.dataset.part) { - return 'base' - } - if (headLineNumberCell.dataset.part) { - return 'head' - } - throw new Error('Could not figure out diff part for code element') - }, - - isFirstCharacterDiffIndicator: (codeElement: HTMLElement) => true, -} - -interface Part { +interface PartFileInfo { repoName: string repoID: GQL.ID rev: string commitID: string + + /** + * `null` if the file does not exist in this diff part. + */ filePath: string | null } -interface Props extends PlatformContextProps { +interface FileHunksProps extends PlatformContextProps, ExtensionsControllerProps, ThemeProps { /** The anchor (URL hash link) of the file diff. The component creates sub-anchors with this prefix. */ fileDiffAnchor: string /** The base repository, revision, and file. */ - base: Part + base: PartFileInfo /** The head repository, revision, and file. */ - head: Part + head: PartFileInfo /** The file's hunks. */ hunks: GQL.IFileDiffHunk[] @@ -204,10 +51,15 @@ interface Props extends PlatformContextProps { hoverifier: Hoverifier } -interface State {} +interface FileDiffHunksState { + /** + * Decorations for the file at the two revisions of the diff + */ + decorations: Record<'head' | 'base', DecorationMapByLine> +} /** Displays hunks in a unified file diff. */ -export class FileDiffHunks extends React.Component { +export class FileDiffHunks extends React.Component { /** Emits whenever the ref callback for the code element is called */ private codeElements = new Subject() private nextCodeElement = (element: HTMLElement | null) => this.codeElements.next(element) @@ -232,17 +84,15 @@ export class FileDiffHunks extends React.Component { } /** Emits with the latest Props on every componentDidUpdate and on componentDidMount */ - private componentUpdates = new Subject() + private componentUpdates = new Subject() /** Subscriptions to be disposed on unmout */ private subscriptions = new Subscription() - constructor(props: Props) { + constructor(props: FileHunksProps) { super(props) this.state = { - hoverOverlayIsFixed: false, - clickedGoToDefinition: false, - mouseIsMoving: false, + decorations: { head: new Map(), base: new Map() }, } this.subscriptions.add( @@ -261,13 +111,55 @@ export class FileDiffHunks extends React.Component { }, }) ) + + // Listen to decorations from extensions and group them by line + this.subscriptions.add( + this.componentUpdates + .pipe( + map(({ head, base, extensionsController }) => ({ head, base, extensionsController })), + distinctUntilChanged( + (a, b) => + isEqual(a.head, b.head) && + isEqual(a.base, b.base) && + a.extensionsController !== b.extensionsController + ), + switchMap(({ head, base, extensionsController }) => { + const getDecorationsForPart = ({ + repoName, + commitID, + filePath, + }: PartFileInfo): Observable => + filePath !== null + ? extensionsController.services.textDocumentDecoration.getDecorations({ + uri: toURIWithPath({ repoName, commitID, filePath }), + }) + : of(null) + return combineLatest([getDecorationsForPart(head), getDecorationsForPart(base)]) + }) + ) + .subscribe(([headDecorations, baseDecorations]) => { + this.setState({ + decorations: { + head: groupDecorationsByLine(headDecorations), + base: groupDecorationsByLine(baseDecorations), + }, + }) + }) + ) + } + + public componentDidMount(): void { + this.componentUpdates.next(this.props) } public componentDidUpdate(): void { - this.componentUpdates.next() + this.componentUpdates.next(this.props) } - public shouldComponentUpdate(nextProps: Readonly, nextState: Readonly): boolean { + public shouldComponentUpdate( + nextProps: Readonly, + nextState: Readonly + ): boolean { return !isEqual(this.props, nextProps) || !isEqual(this.state, nextState) } @@ -299,12 +191,10 @@ export class FileDiffHunks extends React.Component { {this.props.hunks.map((hunk, i) => ( ))} diff --git a/web/src/repo/compare/FileDiffNode.tsx b/web/src/repo/compare/FileDiffNode.tsx index 8912a39b4f926..01766786397b0 100644 --- a/web/src/repo/compare/FileDiffNode.tsx +++ b/web/src/repo/compare/FileDiffNode.tsx @@ -10,10 +10,11 @@ import { ExtensionsControllerProps } from '../../../../shared/src/extensions/con import * as GQL from '../../../../shared/src/graphql/schema' import { PlatformContextProps } from '../../../../shared/src/platform/context' import { FileSpec, RepoSpec, ResolvedRevSpec, RevSpec } from '../../../../shared/src/util/url' +import { ThemeProps } from '../../theme' import { DiffStat } from './DiffStat' import { FileDiffHunks } from './FileDiffHunks' -export interface FileDiffNodeProps extends PlatformContextProps, ExtensionsControllerProps { +export interface FileDiffNodeProps extends PlatformContextProps, ExtensionsControllerProps, ThemeProps { node: GQL.IFileDiff /** The base repository and revision. */ @@ -93,6 +94,7 @@ export class FileDiffNode extends React.PureComponent {this.state.expanded && ( hunks={node.hunks} lineNumbers={this.props.lineNumbers} platformContext={this.props.platformContext} - history={this.props.history} - location={this.props.location} hoverifier={this.props.hoverifier} /> )} diff --git a/web/src/repo/compare/RepositoryCompareArea.tsx b/web/src/repo/compare/RepositoryCompareArea.tsx index f7c5bef9452fc..095efd8142669 100644 --- a/web/src/repo/compare/RepositoryCompareArea.tsx +++ b/web/src/repo/compare/RepositoryCompareArea.tsx @@ -27,6 +27,7 @@ import { import { getHover } from '../../backend/features' import { HeroPage } from '../../components/HeroPage' import { WebHoverOverlay } from '../../components/shared' +import { ThemeProps } from '../../theme' import { EventLoggerProps } from '../../tracking/eventLogger' import { RepoHeaderContributionsLifecycleProps } from '../RepoHeader' import { RepoHeaderBreadcrumbNavItem } from '../RepoHeaderBreadcrumbNavItem' @@ -47,7 +48,8 @@ interface RepositoryCompareAreaProps RepoHeaderContributionsLifecycleProps, PlatformContextProps, EventLoggerProps, - ExtensionsControllerProps { + ExtensionsControllerProps, + ThemeProps { repo: GQL.IRepository } @@ -197,6 +199,7 @@ export class RepositoryCompareArea extends React.Component )} diff --git a/web/src/repo/compare/RepositoryCompareDiffPage.tsx b/web/src/repo/compare/RepositoryCompareDiffPage.tsx index a9cd0be6a4840..1d343b05b53bc 100644 --- a/web/src/repo/compare/RepositoryCompareDiffPage.tsx +++ b/web/src/repo/compare/RepositoryCompareDiffPage.tsx @@ -12,6 +12,7 @@ import { PlatformContextProps } from '../../../../shared/src/platform/context' import { createAggregateError } from '../../../../shared/src/util/errors' import { FileSpec, RepoSpec, ResolvedRevSpec, RevSpec } from '../../../../shared/src/util/url' import { queryGraphQL } from '../../backend/graphql' +import { ThemeProps } from '../../theme' import { FileDiffConnection } from './FileDiffConnection' import { FileDiffNode } from './FileDiffNode' import { RepositoryCompareAreaPageProps } from './RepositoryCompareArea' @@ -98,7 +99,8 @@ interface RepositoryCompareDiffPageProps extends RepositoryCompareAreaPageProps, RouteComponentProps<{}>, PlatformContextProps, - ExtensionsControllerProps { + ExtensionsControllerProps, + ThemeProps { /** The base of the comparison. */ base: { repoName: string; repoID: GQL.ID; rev: string | null; commitID: string } @@ -119,14 +121,10 @@ export class RepositoryCompareDiffPage extends React.PureComponent, PlatformContextProps, - ExtensionsControllerProps { + ExtensionsControllerProps, + ThemeProps { /** The base of the comparison. */ base: { repoName: string; repoID: GQL.ID; rev?: string | null } @@ -108,7 +110,6 @@ export class RepositoryCompareOverviewPage extends React.PureComponent a.repo.id === b.repo.id && a.base.rev === b.base.rev && a.head.rev === b.head.rev ), switchMap(({ repo, base, head }) => { - type PartialStateUpdate = Pick if (!base.rev && !head.rev) { return of({ rangeOrError: null }) } @@ -119,8 +120,8 @@ export class RepositoryCompareOverviewPage extends React.PureComponent [error]), - map(c => ({ rangeOrError: c } as PartialStateUpdate)) + catchError(error => [asError(error)]), + map((rangeOrError): Pick => ({ rangeOrError })) ) ) }) diff --git a/web/src/repo/compare/__snapshots__/DiffHunk.test.tsx.snap b/web/src/repo/compare/__snapshots__/DiffHunk.test.tsx.snap new file mode 100644 index 0000000000000..845bc9f181fe6 --- /dev/null +++ b/web/src/repo/compare/__snapshots__/DiffHunk.test.tsx.snap @@ -0,0 +1,706 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DiffHunk renders a unified diff view for the given diff hunk 1`] = ` +Array [ + + + + + @@ - + 159 + , + 7 + + + 159 + , + 7 + + @@ export async function register({ + + + , + + + + + const subscriptions = new Subscription() + + , + + + + + const decorationType = sourcegraph.app.createDecorationType() + + , + + + + + const connection = await createConnection() + + , + + + + + - logger.log(\`WebSocket connection to TypeScript backend opened\`) + + , + + + + + + logger.log(\`WebSocket connection to language server opened\`) + + , + + + + + subscriptions.add( + + , + + + + + connection.observeNotification(LogMessageNotification.type).subscribe(({ type, message }) => { + + , + + + + + const method = LSP_TO_LOG_LEVEL[type] + + , +] +`; + +exports[`DiffHunk renders dark theme decorations if dark theme is active 1`] = ` +Array [ + + + + + @@ - + 159 + , + 7 + + + 159 + , + 7 + + @@ export async function register({ + + + , + + + + + const subscriptions = new Subscription() + + + head content + + + , + + + + + const decorationType = sourcegraph.app.createDecorationType() + + , + + + + + const connection = await createConnection() + + , + + + + + - logger.log(\`WebSocket connection to TypeScript backend opened\`) + + + base content + + + , + + + + + + logger.log(\`WebSocket connection to language server opened\`) + + , + + + + + subscriptions.add( + + , + + + + + connection.observeNotification(LogMessageNotification.type).subscribe(({ type, message }) => { + + , + + + + + const method = LSP_TO_LOG_LEVEL[type] + + , +] +`; + +exports[`DiffHunk renders decorations if given 1`] = ` +Array [ + + + + + @@ - + 159 + , + 7 + + + 159 + , + 7 + + @@ export async function register({ + + + , + + + + + const subscriptions = new Subscription() + + + head content + + + , + + + + + const decorationType = sourcegraph.app.createDecorationType() + + , + + + + + const connection = await createConnection() + + , + + + + + - logger.log(\`WebSocket connection to TypeScript backend opened\`) + + + base content + + + , + + + + + + logger.log(\`WebSocket connection to language server opened\`) + + , + + + + + subscriptions.add( + + , + + + + + connection.observeNotification(LogMessageNotification.type).subscribe(({ type, message }) => { + + , + + + + + const method = LSP_TO_LOG_LEVEL[type] + + , +] +`; diff --git a/web/src/repo/compare/dom-functions.ts b/web/src/repo/compare/dom-functions.ts new file mode 100644 index 0000000000000..1c42600a71e6c --- /dev/null +++ b/web/src/repo/compare/dom-functions.ts @@ -0,0 +1,59 @@ +import { DiffPart, DOMFunctions } from '@sourcegraph/codeintellify' + +export const diffDomFunctions: DOMFunctions = { + getCodeElementFromTarget: (target: HTMLElement): HTMLTableCellElement | null => { + const row = target.closest('tr') + if (!row) { + return null + } + return row.cells[2] + }, + + getCodeElementFromLineNumber: ( + codeView: HTMLElement, + line: number, + part?: DiffPart + ): HTMLTableCellElement | null => { + // For unchanged lines, prefer line number in head + const lineNumberCell = codeView.querySelector(`[data-line="${line}"][data-part="${part || 'head'}"]`) + if (!lineNumberCell) { + return null + } + const row = lineNumberCell.parentElement as HTMLTableRowElement + const codeCell = row.cells[2] + return codeCell + }, + + getLineNumberFromCodeElement: (codeCell: HTMLElement): number => { + const row = codeCell.closest('tr') + if (!row) { + throw new Error('Could not find closest row for codeCell') + } + const [baseLineNumberCell, headLineNumberCell] = row.cells + // For unchanged lines, prefer line number in head + if (headLineNumberCell.dataset.line) { + return +headLineNumberCell.dataset.line + } + if (baseLineNumberCell.dataset.line) { + return +baseLineNumberCell.dataset.line + } + throw new Error('Neither head or base line number cell have data-line set') + }, + + getDiffCodePart: (codeCell: HTMLElement): DiffPart => { + const row = codeCell.parentElement as HTMLTableRowElement + const [baseLineNumberCell, headLineNumberCell] = row.cells + if (baseLineNumberCell.dataset.part && headLineNumberCell.dataset.part) { + return null + } + if (baseLineNumberCell.dataset.part) { + return 'base' + } + if (headLineNumberCell.dataset.part) { + return 'head' + } + throw new Error('Could not figure out diff part for code element') + }, + + isFirstCharacterDiffIndicator: (codeElement: HTMLElement) => true, +} From 74b3dfd37653c38035b271a816049d4a56db7350 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Wed, 5 Jun 2019 01:39:46 +0200 Subject: [PATCH 6/8] Update dependency parcel-bundler to ^1.12.3 (#3717) --- cmd/management-console/web/package.json | 2 +- cmd/management-console/web/yarn.lock | 1434 +++++++++++------------ 2 files changed, 680 insertions(+), 756 deletions(-) diff --git a/cmd/management-console/web/package.json b/cmd/management-console/web/package.json index b17eae94163d1..b88e05c71bc13 100644 --- a/cmd/management-console/web/package.json +++ b/cmd/management-console/web/package.json @@ -12,7 +12,7 @@ "devDependencies": { "monaco-editor": "^0.17.0", "node-sass": "^4.12.0", - "parcel-bundler": "^1.11.0", + "parcel-bundler": "^1.12.3", "typescript": "^3.5.1" } } diff --git a/cmd/management-console/web/yarn.lock b/cmd/management-console/web/yarn.lock index 1fe15724091b8..7958a8d334868 100644 --- a/cmd/management-console/web/yarn.lock +++ b/cmd/management-console/web/yarn.lock @@ -2,41 +2,52 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0 <7.4.0": version "7.0.0" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0": - version "7.2.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" - integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== +"@babel/core@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" + "@babel/generator" "^7.3.4" "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.2" + "@babel/parser" "^7.3.4" "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.2.2" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.10" + lodash "^4.17.11" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.2.2": - version "7.2.2" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" - integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== +"@babel/generator@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== dependencies: - "@babel/types" "^7.2.2" + "@babel/types" "^7.3.4" jsesc "^2.5.1" - lodash "^4.17.10" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.3.4", "@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" source-map "^0.5.0" trim-right "^1.0.1" @@ -55,12 +66,12 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-builder-react-jsx@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" - integrity sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw== +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.3.0" esutils "^2.0.0" "@babel/helper-call-delegate@^7.1.0": @@ -72,14 +83,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@babel/types" "^7.4.4" + lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" @@ -105,12 +116,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== +"@babel/helper-hoist-variables@^7.0.0", "@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.4" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" @@ -168,15 +179,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0": - version "7.2.3" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" - integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.2.3" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -186,12 +197,12 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.4" "@babel/helper-wrap-function@^7.1.0": version "7.2.0" @@ -221,10 +232,15 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": - version "7.2.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" - integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== +"@babel/parser@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== + +"@babel/parser@^7.2.2", "@babel/parser@^7.3.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -243,10 +259,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" - integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== +"@babel/plugin-proposal-object-rest-spread@^7.3.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -317,10 +333,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" - integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== +"@babel/plugin-transform-async-to-generator@^7.3.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -333,26 +349,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" - integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== +"@babel/plugin-transform-block-scoping@^7.3.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/plugin-transform-classes@^7.2.0": - version "7.2.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" - integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== +"@babel/plugin-transform-classes@^7.3.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" + "@babel/helper-define-map" "^7.4.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -393,10 +409,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.2.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz#e3ac2a594948454e7431c7db33e1d02d51b5cd69" - integrity sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ== +"@babel/plugin-transform-flow-strip-types@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz#00156236defb7dedddc2d3c9477dcc01a4494327" + integrity sha512-PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.2.0" @@ -431,7 +447,7 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": +"@babel/plugin-transform-modules-commonjs@^7.0.0 <7.4.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": version "7.2.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== @@ -440,12 +456,12 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.2.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" - integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== +"@babel/plugin-transform-modules-systemjs@^7.3.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-umd@^7.2.0": @@ -456,6 +472,13 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + dependencies: + regexp-tree "^0.1.6" + "@babel/plugin-transform-new-target@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" @@ -480,21 +503,21 @@ "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz#ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f" - integrity sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q== +"@babel/plugin-transform-react-jsx@^7.0.0 <7.4.0": + version "7.3.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== dependencies: - "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-builder-react-jsx" "^7.3.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== +"@babel/plugin-transform-regenerator@^7.3.4": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== dependencies: - regenerator-transform "^0.13.3" + regenerator-transform "^0.14.0" "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" @@ -542,26 +565,27 @@ "@babel/helper-regex" "^7.0.0" regexpu-core "^4.1.3" -"@babel/preset-env@^7.0.0": - version "7.2.3" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" - integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== +"@babel/preset-env@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1" + integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.4" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.3.4" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.3.4" + "@babel/plugin-transform-classes" "^7.3.4" "@babel/plugin-transform-computed-properties" "^7.2.0" "@babel/plugin-transform-destructuring" "^7.2.0" "@babel/plugin-transform-dotall-regex" "^7.2.0" @@ -572,12 +596,13 @@ "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.2.0" "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.3.4" "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" "@babel/plugin-transform-new-target" "^7.0.0" "@babel/plugin-transform-object-super" "^7.2.0" "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.3.4" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" "@babel/plugin-transform-sticky-regex" "^7.2.0" @@ -589,14 +614,14 @@ js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/runtime@^7.0.0": - version "7.2.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" - integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== +"@babel/runtime@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== dependencies: regenerator-runtime "^0.12.0" -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": +"@babel/template@^7.0.0 <7.4.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== @@ -605,28 +630,52 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": - version "7.2.3" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" - integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== +"@babel/traverse@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" + "@babel/generator" "^7.3.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.2.3" - "@babel/types" "^7.2.2" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": - version "7.2.2" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" - integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.4": + version "7.4.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== dependencies: esutils "^2.0.2" - lodash "^4.17.10" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0 <7.4.0": + version "7.3.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" to-fast-properties "^2.0.0" "@iarna/toml@^2.2.0": @@ -672,10 +721,10 @@ resolved "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz#539e08fff8af3b26eca11302be80b522674b51ea" integrity sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ== -"@parcel/watcher@^1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.11.0.tgz#a05ee752d47bf3627b77a64a6089404683edc255" - integrity sha512-1ySF0sH06jyhpaErW1UWC7BNgkAl6PJyBjuu2cLTW1o71J2iQqgGt95cbuqmfmjI3l0xYN+nauDFqHERaj7Z8A== +"@parcel/watcher@^1.12.0": + version "1.12.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.0.tgz#769024b2a810b0c3b38c310f297d104c77df3660" + integrity sha512-yijGiAqG7Tjf5WnFwOkiNWwerfZQDNABldiiqRDtr7vDWLO+F/DIncyB7tTcaD5Loevrr5mzzGo8Ntf3d2GIPg== dependencies: "@parcel/utils" "^1.11.0" chokidar "^2.0.3" @@ -703,16 +752,39 @@ resolved "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn@^5.0.0: +acorn-globals@^4.1.0: + version "4.3.2" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.0.0, acorn@^5.5.3: version "5.7.3" resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^6.0.1: + version "6.1.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + ajv@^6.5.5: version "6.10.0" resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" @@ -723,7 +795,7 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: +alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= @@ -805,6 +877,11 @@ arr-union@^3.1.0: resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -873,18 +950,6 @@ atob@^2.1.1: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -922,11 +987,6 @@ babylon-walk@^1.0.2: babel-types "^6.15.0" lodash.clone "^4.5.0" -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1023,6 +1083,11 @@ brorand@^1.0.1: resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1082,14 +1147,6 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.3.4: version "4.3.6" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz#0f9d9081afc66b36f477c6bdf3813f784f42396a" @@ -1185,16 +1242,6 @@ camelcase@^3.0.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -1205,11 +1252,6 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000923" - resolved "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000923.tgz#0724b5fbd7f9fe424060b788b11e6b8d77102deb" - integrity sha512-PlFnZSgXcf/Z1kuNhTRq9vV4FnzizSDHpcgs5b/EY9sN60F3aBpkJwvEsHNeACHZi56/L8Cm3VsONdY1bOus/g== - caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000921: version "1.0.30000923" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz#148f9bda508024b5ce957b463ae2e8302b451bb2" @@ -1231,10 +1273,10 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1273,13 +1315,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1326,13 +1361,6 @@ clones@^1.1.0: resolved "https://registry.npmjs.org/clones/-/clones-1.1.0.tgz#87e904132d6140c5c0b72006c08c0d05bd7b63b3" integrity sha1-h+kEEy1hQMXAtyAGwIwNBb17Y7M= -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= - dependencies: - q "^1.1.2" - coa@~2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -1355,7 +1383,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1367,13 +1395,6 @@ color-name@1.1.3, color-name@^1.0.0: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= - dependencies: - color-name "^1.0.0" - color-string@^1.5.2: version "1.5.3" resolved "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" @@ -1382,15 +1403,6 @@ color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^0.11.0: - version "0.11.4" - resolved "https://registry.npmjs.org/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - color@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" @@ -1399,15 +1411,6 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - colors@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1425,15 +1428,10 @@ command-exists@^1.2.6: resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== -commander@^2.11.0, commander@^2.19.0: - version "2.19.0" - resolved "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.11.0, commander@^2.19.0, commander@^2.9.0: + version "2.20.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== component-emitter@^1.2.1: version "1.2.1" @@ -1592,6 +1590,18 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + css-select-base-adapter@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -1607,6 +1617,15 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" +css-selector-tokenizer@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" + integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + css-tree@1.0.0-alpha.28: version "1.0.0-alpha.28" resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" @@ -1638,45 +1657,50 @@ css-what@^2.1.2: resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= + cssesc@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== -cssnano-preset-default@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.5.tgz#d1756c0259d98ad311e601ba76e95c60f6771ac1" - integrity sha512-f1uhya0ZAjPYtDD58QkBB0R+uYdzHPei7cDxJyQQIHt5acdhyGXaSXl2nDLzWHLwGFbZcHxQtkJS8mmNwnxTvw== +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" postcss "^7.0.0" - postcss-calc "^7.0.0" - postcss-colormin "^4.0.2" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.1" + postcss-discard-comments "^4.0.2" postcss-discard-duplicates "^4.0.2" postcss-discard-empty "^4.0.1" postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.9" - postcss-merge-rules "^4.0.2" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.1" - postcss-minify-params "^4.0.1" - postcss-minify-selectors "^4.0.1" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.1" - postcss-normalize-positions "^4.0.1" - postcss-normalize-repeat-style "^4.0.1" - postcss-normalize-string "^4.0.1" - postcss-normalize-timing-functions "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" postcss-normalize-unicode "^4.0.1" postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.1" - postcss-ordered-values "^4.1.1" - postcss-reduce-initial "^4.0.2" - postcss-reduce-transforms "^4.0.1" - postcss-svgo "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -1701,51 +1725,13 @@ cssnano-util-same-parent@^4.0.0: resolved "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== -cssnano@^3.4.0: - version "3.10.0" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -cssnano@^4.0.0: - version "4.1.7" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.7.tgz#0bf112294bec103ab5f68d3f805732c8325a0b1b" - integrity sha512-AiXL90l+MDuQmRNyypG2P7ux7K4XklxYzNNUd5HXZCNcH8/N9bHPcpN97v8tXgRVeFL/Ed8iP8mVmAAu0ZpT7A== +cssnano@^4.0.0, cssnano@^4.1.9: + version "4.1.10" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.5" + cssnano-preset-default "^4.0.7" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -1756,13 +1742,17 @@ csso@^3.5.0: dependencies: css-tree "1.0.0-alpha.29" -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== dependencies: - clap "^1.0.9" - source-map "^0.5.3" + cssom "0.3.x" currently-unhandled@^0.4.1: version "0.4.1" @@ -1778,6 +1768,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -1861,11 +1860,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1931,6 +1925,13 @@ domelementtype@~1.1.1: resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domhandler@^2.3.0: version "2.4.2" resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" @@ -1995,7 +1996,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.92: +electron-to-chromium@^1.3.92: version "1.3.96" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz#25770ec99b8b07706dedf3a5f43fa50cb54c4f9a" integrity sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q== @@ -2060,7 +2061,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.8.1, escodegen@~1.9.0: +escodegen@^1.8.1, escodegen@^1.9.1, escodegen@~1.9.0: version "1.9.1" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== @@ -2072,11 +2073,6 @@ escodegen@^1.8.1, escodegen@~1.9.0: optionalDependencies: source-map "~0.6.1" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2204,6 +2200,11 @@ fast-levenshtein@~2.0.4: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + filesize@^3.6.0: version "3.6.1" resolved "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -2227,11 +2228,6 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= - for-in@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2531,17 +2527,31 @@ html-comment-regex@^1.1.0: resolved "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -htmlnano@^0.1.9: - version "0.1.10" - resolved "https://registry.npmjs.org/htmlnano/-/htmlnano-0.1.10.tgz#a0a548eb4c76ae2cf2423ec7a25c881734d3dea6" - integrity sha512-eTEUzz8VdWYp+w/KUdb99kwao4reR64epUySyZkQeepcyzPQ2n2EPWzibf6QDxmkGy10Kr+CKxYqI3izSbmhJQ== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-tags@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98" + integrity sha1-x43mW1Zjqll5id0rerSSANfk25g= + +htmlnano@^0.2.2: + version "0.2.3" + resolved "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.3.tgz#ff654a641e8006c893bdd9ad4988ee4ab664449a" + integrity sha512-iS6T3J5gk2wInodbtMUyAU8sLYJOhuWDnIEd8lFRoHTypVGgawPHFEx2ZIK/XTErtDfwHBsrXeCwHAP8bdoSWw== dependencies: - cssnano "^3.4.0" + cssnano "^4.1.9" + normalize-html-whitespace "^0.2.0" object-assign "^4.0.1" posthtml "^0.11.3" posthtml-render "^1.1.4" svgo "^1.0.5" - terser "^3.8.1" + terser "^3.16.1" + uncss "^0.16.2" htmlparser2@^3.9.2: version "3.10.0" @@ -2579,13 +2589,18 @@ https-browserify@^1.0.0: resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -2808,6 +2823,13 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-html@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" + integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ= + dependencies: + html-tags "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2820,11 +2842,6 @@ is-obj@^1.0.0: resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - 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.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -2844,13 +2861,6 @@ is-resolvable@^1.0.0: resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= - dependencies: - html-comment-regex "^1.1.0" - is-svg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -2922,7 +2932,7 @@ isstream@~0.1.2: resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -js-base64@^2.1.8, js-base64@^2.1.9: +js-base64@^2.1.8: version "2.5.1" resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== @@ -2956,19 +2966,43 @@ js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.9.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.3.0: + version "11.12.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -3054,6 +3088,11 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + levn@~0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3088,12 +3127,17 @@ lodash.memoize@^4.1.2: resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@~4.17.10: version "4.17.11" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -3152,11 +3196,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -3474,6 +3513,11 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-html-whitespace@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz#101722f6423551c75cdb8f9d104ff850daf1e10e" + integrity sha1-EBci9kI1Ucdc24+dEE/4UNrx4Q4= + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -3491,21 +3535,6 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" @@ -3541,16 +3570,16 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -3704,28 +3733,28 @@ pako@~1.0.5: resolved "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== -parcel-bundler@^1.11.0: - version "1.11.0" - resolved "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.11.0.tgz#7e821a5246d7503aebf3c1bc279b59cbb8a3d4e3" - integrity sha512-H0w/Obx76vWiG+UtofznfcHZJBmd6JA5iCn7zrGBINyVAh+Nt/JLD6QDROghHLXfJkO4XyczsB+fO+nPbXlFfA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/runtime" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" +parcel-bundler@^1.12.3: + version "1.12.3" + resolved "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz#2bbf70bfa2d06097f071653285040bd125684d09" + integrity sha512-8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A== + dependencies: + "@babel/code-frame" "^7.0.0 <7.4.0" + "@babel/core" "^7.0.0 <7.4.0" + "@babel/generator" "^7.0.0 <7.4.0" + "@babel/parser" "^7.0.0 <7.4.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0 <7.4.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0 <7.4.0" + "@babel/plugin-transform-react-jsx" "^7.0.0 <7.4.0" + "@babel/preset-env" "^7.0.0 <7.4.0" + "@babel/runtime" "^7.0.0 <7.4.0" + "@babel/template" "^7.0.0 <7.4.0" + "@babel/traverse" "^7.0.0 <7.4.0" + "@babel/types" "^7.0.0 <7.4.0" "@iarna/toml" "^2.2.0" "@parcel/fs" "^1.11.0" "@parcel/logger" "^1.11.0" "@parcel/utils" "^1.11.0" - "@parcel/watcher" "^1.11.0" + "@parcel/watcher" "^1.12.0" "@parcel/workers" "^1.11.0" ansi-to-html "^0.6.4" babylon-walk "^1.0.2" @@ -3735,6 +3764,7 @@ parcel-bundler@^1.11.0: command-exists "^1.2.6" commander "^2.11.0" cross-spawn "^6.0.4" + css-modules-loader-core "^1.1.0" cssnano "^4.0.0" deasync "^0.1.14" dotenv "^5.0.0" @@ -3742,7 +3772,7 @@ parcel-bundler@^1.11.0: fast-glob "^2.2.2" filesize "^3.6.0" get-port "^3.2.0" - htmlnano "^0.1.9" + htmlnano "^0.2.2" is-glob "^4.0.0" is-url "^1.2.2" js-yaml "^3.10.0" @@ -3752,7 +3782,7 @@ parcel-bundler@^1.11.0: node-forge "^0.7.1" node-libs-browser "^2.0.0" opn "^5.1.0" - postcss "^7.0.5" + postcss "^7.0.11" postcss-value-parser "^3.3.1" posthtml "^0.11.2" posthtml-parser "^0.4.0" @@ -3792,6 +3822,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -3881,21 +3916,17 @@ pinkie@^2.0.0: resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-calc@^7.0.0: +postcss-calc@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== @@ -3905,19 +3936,10 @@ postcss-calc@^7.0.0: postcss-selector-parser "^5.0.0-rc.4" postcss-value-parser "^3.3.1" -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-colormin@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.2.tgz#93cd1fa11280008696887db1a528048b18e7ed99" - integrity sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw== +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== dependencies: browserslist "^4.0.0" color "^3.0.0" @@ -3925,14 +3947,6 @@ postcss-colormin@^4.0.2: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - postcss-convert-values@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" @@ -3941,27 +3955,13 @@ postcss-convert-values@^4.0.1: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= - dependencies: - postcss "^5.0.14" - -postcss-discard-comments@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz#30697735b0c476852a7a11050eb84387a67ef55d" - integrity sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ== +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== dependencies: postcss "^7.0.0" -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= - dependencies: - postcss "^5.0.4" - postcss-discard-duplicates@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" @@ -3969,13 +3969,6 @@ postcss-discard-duplicates@^4.0.2: dependencies: postcss "^7.0.0" -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= - dependencies: - postcss "^5.0.14" - postcss-discard-empty@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" @@ -3983,13 +3976,6 @@ postcss-discard-empty@^4.0.1: dependencies: postcss "^7.0.0" -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= - dependencies: - postcss "^5.0.16" - postcss-discard-overridden@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" @@ -3997,62 +3983,20 @@ postcss-discard-overridden@^4.0.1: dependencies: postcss "^7.0.0" -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= - dependencies: - postcss "^5.0.4" - -postcss-merge-longhand@^4.0.9: - version "4.0.9" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.9.tgz#c2428b994833ffb2a072f290ca642e75ceabcd6f" - integrity sha512-UVMXrXF5K/kIwUbK/crPFCytpWbNX2Q3dZSc8+nQUgfOHrCT4+MHncpdxVphUlQeZxlLXUJbDyXc5NBhTnS2tA== +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== dependencies: css-color-names "0.0.4" postcss "^7.0.0" postcss-value-parser "^3.0.0" stylehacks "^4.0.0" -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-merge-rules@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz#2be44401bf19856f27f32b8b12c0df5af1b88e74" - integrity sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag== +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" @@ -4061,20 +4005,6 @@ postcss-merge-rules@^4.0.2: postcss-selector-parser "^3.0.0" vendors "^1.0.0" -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - postcss-minify-font-values@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" @@ -4083,38 +4013,20 @@ postcss-minify-font-values@^4.0.2: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-gradients@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz#6da95c6e92a809f956bb76bf0c04494953e1a7dd" - integrity sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA== +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== dependencies: cssnano-util-get-arguments "^4.0.0" is-color-stop "^1.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-params@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz#5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2" - integrity sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg== +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== dependencies: alphanum-sort "^1.0.0" browserslist "^4.0.0" @@ -4123,32 +4035,46 @@ postcss-minify-params@^4.0.1: postcss-value-parser "^3.0.0" uniqs "^2.0.0" -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-minify-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz#a891c197977cc37abf60b3ea06b84248b1c1e9cd" - integrity sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg== +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== dependencies: alphanum-sort "^1.0.0" has "^1.0.0" postcss "^7.0.0" postcss-selector-parser "^3.0.0" -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= dependencies: - postcss "^5.0.5" + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" postcss-normalize-charset@^4.0.1: version "4.0.1" @@ -4157,48 +4083,48 @@ postcss-normalize-charset@^4.0.1: dependencies: postcss "^7.0.0" -postcss-normalize-display-values@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#d9a83d47c716e8a980f22f632c8b0458cfb48a4c" - integrity sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg== +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-positions@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz#ee2d4b67818c961964c6be09d179894b94fd6ba1" - integrity sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA== +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== dependencies: cssnano-util-get-arguments "^4.0.0" has "^1.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-repeat-style@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz#5293f234b94d7669a9f805495d35b82a581c50e5" - integrity sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA== +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== dependencies: cssnano-util-get-arguments "^4.0.0" cssnano-util-get-match "^4.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-string@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz#23c5030c2cc24175f66c914fa5199e2e3c10fef3" - integrity sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ== +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== dependencies: has "^1.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-timing-functions@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz#8be83e0b9cb3ff2d1abddee032a49108f05f95d7" - integrity sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w== +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" @@ -4213,16 +4139,6 @@ postcss-normalize-unicode@^4.0.1: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - postcss-normalize-url@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" @@ -4233,85 +4149,44 @@ postcss-normalize-url@^4.0.1: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-whitespace@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz#d14cb639b61238418ac8bc8d3b7bdd65fc86575e" - integrity sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw== +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== dependencies: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-ordered-values@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz#2e3b432ef3e489b18333aeca1f1295eb89be9fc2" - integrity sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q== +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: cssnano-util-get-arguments "^4.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" - -postcss-reduce-initial@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz#bac8e325d67510ee01fa460676dc8ea9e3b40f15" - integrity sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug== +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" has "^1.0.0" postcss "^7.0.0" -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-reduce-transforms@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz#8600d5553bdd3ad640f43bff81eb52f8760d4561" - integrity sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA== +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== dependencies: cssnano-util-get-match "^4.0.0" has "^1.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^3.0.0: +postcss-selector-parser@3.1.1, postcss-selector-parser@^3.0.0: version "3.1.1" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= @@ -4329,35 +4204,16 @@ postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-svgo@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.1.tgz#5628cdb38f015de6b588ce6d0bf0724b492b581d" - integrity sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw== +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== dependencies: is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" @@ -4367,38 +4223,37 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= dependencies: chalk "^1.1.3" - js-base64 "^2.1.9" source-map "^0.5.6" supports-color "^3.2.3" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: - version "7.0.7" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.7.tgz#2754d073f77acb4ef08f1235c36c5721a7201614" - integrity sha512-HThWSJEPkupqew2fnuQMEI2YcTj/8gMV3n80cMdJsKxfIh5tHf7nM5JigNX6LxVMqo6zkgQNAI88hyFvBk41Pg== +postcss@^6.0.1, postcss@^6.0.14: + version "6.0.23" + resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== dependencies: chalk "^2.4.1" source-map "^0.6.1" - supports-color "^5.5.0" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.5: + version "7.0.16" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz#48f64f1b4b558cb8b52c88987724359acb010da2" + integrity sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" posthtml-parser@^0.3.3: version "0.3.3" @@ -4436,11 +4291,6 @@ prelude-ls@~1.1.2: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - private@^0.1.6: version "0.1.8" resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -4516,14 +4366,6 @@ qs@~6.5.2: resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -4639,22 +4481,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= - dependencies: - balanced-match "^0.4.2" - regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" @@ -4662,7 +4488,7 @@ regenerate-unicode-properties@^7.0.0: dependencies: regenerate "^1.4.0" -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -4677,10 +4503,10 @@ regenerator-runtime@^0.12.0: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: private "^0.1.6" @@ -4692,6 +4518,20 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.6: + version "0.1.10" + resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" + integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.1.3, regexpu-core@^4.2.0: version "4.4.0" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" @@ -4704,11 +4544,23 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + regjsgen@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -4738,7 +4590,23 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.87.0, request@^2.88.0: +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.72.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.npmjs.org/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -4870,7 +4738,7 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -5045,13 +4913,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" @@ -5063,10 +4924,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@~0.5.6: - version "0.5.9" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== +source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -5198,6 +5059,11 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -5217,11 +5083,6 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - string-width@^1.0.1, string-width@^1.0.2, "string-width@^1.0.2 || 2": version "1.0.2" resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5292,25 +5153,19 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" + has-flag "^3.0.0" svgo@^1.0.0, svgo@^1.0.5: version "1.1.1" @@ -5332,6 +5187,11 @@ svgo@^1.0.0, svgo@^1.0.5: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + tar@^2.0.0: version "2.2.2" resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" @@ -5354,14 +5214,14 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -terser@^3.7.3, terser@^3.8.1: - version "3.13.1" - resolved "https://registry.npmjs.org/terser/-/terser-3.13.1.tgz#a02e8827fb9705fe7b609c31093d010b28cea8eb" - integrity sha512-ogyZye4DFqOtMzT92Y3Nxxw8OvXmL39HOALro4fc+EUYFFF9G/kk0znkvwMz6PPYgBtdKAodh3FPR70eugdaQA== +terser@^3.16.1, terser@^3.7.3: + version "3.17.0" + resolved "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== dependencies: - commander "~2.17.1" + commander "^2.19.0" source-map "~0.6.1" - source-map-support "~0.5.6" + source-map-support "~0.5.10" through2@^2.0.0, through2@~2.0.3: version "2.0.5" @@ -5428,7 +5288,7 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@~2.4.3: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -5436,6 +5296,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -5492,6 +5359,21 @@ typescript@^3.5.1: resolved "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz#ba72a6a600b2158139c5dd8850f700e231464202" integrity sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw== +uncss@^0.16.2: + version "0.16.2" + resolved "https://registry.npmjs.org/uncss/-/uncss-0.16.2.tgz#3b2269c59012da7c66cbe98fbedddeef94f0649c" + integrity sha1-OyJpxZAS2nxmy+mPvt3e75TwZJw= + dependencies: + commander "^2.9.0" + glob "^7.0.3" + is-absolute-url "^2.0.0" + is-html "^1.0.0" + jsdom "^11.3.0" + lodash "^4.13.1" + postcss "^6.0.14" + postcss-selector-parser "3.1.1" + request "^2.72.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -5650,6 +5532,13 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -5657,10 +5546,40 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" which-module@^1.0.0: version "1.0.0" @@ -5699,13 +5618,18 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^5.1.1: +ws@^5.1.1, ws@^5.2.0: version "5.2.2" resolved "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" From f80a746a49a6fbba31b12eab39ca87e74d953f4f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Wed, 5 Jun 2019 01:40:26 +0200 Subject: [PATCH 7/8] Update dependency browserslist to ^4.6.1 (#4299) --- package.json | 2 +- yarn.lock | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index eae01dbf2bc79..7b021e0f5e375 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "autoprefixer": "^9.5.1", "babel-loader": "^8.0.6", "babel-plugin-lodash": "^3.3.4", - "browserslist": "^4.5.6", + "browserslist": "^4.6.1", "bundlesize": "^0.17.2", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", diff --git a/yarn.lock b/yarn.lock index b43b518ecac9e..eeee381559a93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4122,14 +4122,14 @@ browserslist@4.4.1: electron-to-chromium "^1.3.103" node-releases "^1.1.3" -browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.2, browserslist@^4.5.4, browserslist@^4.5.6: - version "4.5.6" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" - integrity sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg== +browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.2, browserslist@^4.5.4, browserslist@^4.6.1: + version "4.6.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz#ee5059b1aec18cbec9d055d6cb5e24ae50343a9b" + integrity sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ== dependencies: - caniuse-lite "^1.0.30000963" - electron-to-chromium "^1.3.127" - node-releases "^1.1.17" + caniuse-lite "^1.0.30000971" + electron-to-chromium "^1.3.137" + node-releases "^1.1.21" bs-logger@0.x: version "0.2.6" @@ -4357,10 +4357,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000963: - version "1.0.30000966" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000966.tgz#f3c6fefacfbfbfb981df6dfa68f2aae7bff41b64" - integrity sha512-qqLQ/uYrpZmFhPY96VuBkMEo8NhVFBZ9y/Bh+KnvGzGJ5I8hvpIaWlF2pw5gqe4PLAL+ZjsPgMOvoXSpX21Keg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000971: + version "1.0.30000971" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz#d1000e4546486a6977756547352bc96a4cfd2b13" + integrity sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g== capture-exit@^2.0.0: version "2.0.0" @@ -6066,10 +6066,10 @@ ejs@^2.6.1: resolved "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== -electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.127: - version "1.3.131" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.131.tgz#205a0b7a276b3f56bc056f19178909243054252a" - integrity sha512-NSO4jLeyGLWrT4mzzfYX8vt1MYCoMI5LxSYAjt0H9+LF/14JyiKJSyyjA6AJTxflZlEM5v3QU33F0ohbPMCAPg== +electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.137: + version "1.3.144" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.144.tgz#d742d2c451090798303a4a5eea4f33f5e60f5d94" + integrity sha512-jNRFJpfNrYm5uJ4x0q9oYMOfbL0JPOlkNli8GS/5zEmCjnE5jAtoCo4BYajHiqSPqEeAjtTdItL4p7EZw+jSfg== elliptic@^6.0.0: version "6.4.1" @@ -10387,10 +10387,10 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.17, node-releases@^1.1.3: - version "1.1.17" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a" - integrity sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q== +node-releases@^1.1.21, node-releases@^1.1.3: + version "1.1.22" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.22.tgz#d90cd5adc59ab9b0f377d4f532b09656399c88bf" + integrity sha512-O6XpteBuntW1j86mw6LlovBIwTe+sO2+7vi9avQffNeIW4upgnaCVm6xrBWH+KATz7mNNRNNeEpuWB7dT6Cr3w== dependencies: semver "^5.3.0" From 77b64100adc188f1fe1fae685c22875c0f24f8bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Wed, 5 Jun 2019 01:41:00 +0200 Subject: [PATCH 8/8] Update dependency jsdom to ^15.1.1 (#4304) --- package.json | 2 +- yarn.lock | 99 ++++++++++++++++++++++++++-------------------------- 2 files changed, 51 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 7b021e0f5e375..38bbe6a49e2e2 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "gulp": "^4.0.1", "identity-obj-proxy": "^3.0.0", "jest": "^24.8.0", - "jsdom": "^15.0.0", + "jsdom": "^15.1.1", "json-schema-ref-parser": "^6.0.2", "json-schema-to-typescript": "^6.1.0", "message-port-polyfill": "^0.1.0", diff --git a/yarn.lock b/yarn.lock index eeee381559a93..18c0affb5f714 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2910,10 +2910,10 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" - integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== +acorn-globals@^4.1.0, acorn-globals@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -2928,7 +2928,7 @@ acorn@^5.5.3: resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5: +acorn@^6.0.1, acorn@^6.0.5, acorn@^6.1.1: version "6.1.1" resolved "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== @@ -3363,7 +3363,7 @@ async-foreach@^0.1.3: resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= -async-limiter@~1.0.0: +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== @@ -5438,12 +5438,12 @@ csso@^3.5.0: dependencies: css-tree "1.0.0-alpha.29" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.6: version "0.3.6" resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== -cssstyle@^1.0.0, cssstyle@^1.1.1: +cssstyle@^1.0.0, cssstyle@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== @@ -6296,7 +6296,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.0, escodegen@^1.9.1: +escodegen@^1.11.1, escodegen@^1.9.1: version "1.11.1" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== @@ -9015,36 +9015,36 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^15.0.0: - version "15.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-15.0.0.tgz#60cf177d79c7fa1a498453c9e2534f57e65d151f" - integrity sha512-rJnHm7CHyIj4tDyz9VaCt0f0P0nEh/wEmMfwp9mMixy+L/r8OW/BNcgmIlfZuBBnVQS3eRBpvd/qM3R7vr7e3A== +jsdom@^15.1.1: + version "15.1.1" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz#21ed01f81d95ef4327f3e564662aef5e65881252" + integrity sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ== dependencies: abab "^2.0.0" - acorn "^6.0.4" - acorn-globals "^4.3.0" + acorn "^6.1.1" + acorn-globals "^4.3.2" array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" + cssom "^0.3.6" + cssstyle "^1.2.2" data-urls "^1.1.0" domexception "^1.0.1" - escodegen "^1.11.0" + escodegen "^1.11.1" html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.3" + nwsapi "^2.1.4" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" - request-promise-native "^1.0.5" + request-promise-native "^1.0.7" saxes "^3.1.9" symbol-tree "^3.2.2" - tough-cookie "^2.5.0" + tough-cookie "^3.0.1" w3c-hr-time "^1.0.1" w3c-xmlserializer "^1.1.2" webidl-conversions "^4.0.2" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^7.0.0" - ws "^6.1.2" + ws "^7.0.0" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -9549,7 +9549,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: +lodash@4.17.11, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: version "4.17.11" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -10549,7 +10549,7 @@ number-is-nan@^1.0.0: resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.0.7, nwsapi@^2.1.3: +nwsapi@^2.0.7, nwsapi@^2.1.4: version "2.1.4" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== @@ -12803,13 +12803,6 @@ replace-homedir@^1.0.0: is-absolute "^1.0.0" remove-trailing-separator "^1.1.0" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= - dependencies: - lodash "^4.13.1" - request-promise-core@1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" @@ -12817,14 +12810,14 @@ request-promise-core@1.1.2: dependencies: lodash "^4.17.11" -request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= +request-promise-native@^1.0.5, request-promise-native@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" request-promise@^4.2.2: version "4.2.4" @@ -13776,7 +13769,7 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stealthy-require@^1.1.0, stealthy-require@^1.1.1: +stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= @@ -14515,15 +14508,7 @@ touch@^2.0.1: dependencies: nopt "~1.0.10" -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -14531,6 +14516,15 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -15548,13 +15542,20 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.1.0, ws@^6.1.2, ws@~6.1.0: +ws@^6.1.0, ws@~6.1.0: version "6.1.2" resolved "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== dependencies: async-limiter "~1.0.0" +ws@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz#79351cbc3f784b3c20d0821baf4b4ff809ffbf51" + integrity sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg== + dependencies: + async-limiter "^1.0.0" + x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"