diff --git a/.github/workflows/codacy-analysis.yaml b/.github/workflows/codacy-analysis.yaml new file mode 100644 index 000000000..be8f3b3e4 --- /dev/null +++ b/.github/workflows/codacy-analysis.yaml @@ -0,0 +1,32 @@ +name: Codacy Security Scan + +on: + push: + branches: ["master", "main"] + pull_request: + branches: ["master", "main"] + +jobs: + codacy-security-scan: + name: Codacy Security Scan + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@master + + - name: Run Codacy Analysis CLI + uses: codacy/codacy-analysis-cli-action@master + with: + output: results.sarif + format: sarif + # Adjust severity of non-security issues + gh-code-scanning-compat: true + # Force 0 exit code to allow SARIF file generation + # This will handover control about PR rejection to the GitHub side + max-allowed-issues: 2147483647 + + # Upload the SARIF file generated in the previous step + - name: Upload SARIF results file + uses: github/codeql-action/upload-sarif@main + with: + sarif_file: results.sarif \ No newline at end of file diff --git a/.github/workflows/test-wtih-vscode-build.yml b/.github/workflows/test-wtih-vscode-build.yml new file mode 100644 index 000000000..8fa811d6b --- /dev/null +++ b/.github/workflows/test-wtih-vscode-build.yml @@ -0,0 +1,42 @@ +name: Build & Test with VS Code build + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build: + strategy: + matrix: + os: [ubuntu-20.04] + node-version: [14.x, 15.x] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - uses: actions/cache@v2 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn-${{ matrix.node-version }} + + - run: yarn --frozen-lockfile + - run: yarn build:vscode + - run: yarn yalc && yarn build + - uses: microsoft/playwright-github-action@v1 + - run: yarn test:ci diff --git a/README.md b/README.md index 42aca6c96..788e3cf93 100644 --- a/README.md +++ b/README.md @@ -59,15 +59,35 @@ You can start an online development environment with [Gitpod](https://www.gitpod ### Local development -You need [these prerequisites (the same ones as for VS Code)](https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites) for development. +```bash +git clone git@github.com:conwnet/github1s.git +cd github1s +yarn +yarn watch +yarn serve # in another shell +# Then visit http://localhost:5000 or http://localhost:5000/conwnet/github1s once the build is completed. +``` + +#### Local development with full VS Code build + +You need [these prerequisites (the same ones as for VS Code)](https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites) for development with full VS Code build. +Please make sure you could build VS Code locally before the watch mode. + +To verify the build: + +```bash +cd github1s +yarn build:vscode +``` + +After the inital successful build, you could use the watch mode: ```bash -$ git clone git@github.com:conwnet/github1s.git -$ cd github1s -$ yarn -$ yarn watch -$ yarn serve # in another shell -$ # Then visit http://localhost:5000 or http://localhost:5000/conwnet/github1s once the build is completed. +cd github1s +yarn +yarn watch-with-vscode +yarn serve # in another shell +# Then visit http://localhost:5000 or http://localhost:5000/conwnet/github1s once the build is completed. ``` ### ... or ... VS Code + Docker Development @@ -84,10 +104,10 @@ You can use the VS Code plugin [Remote-Containers](https://marketplace.visualstu 5. Open a new VS Code Terminal, then you can run the `yarn` commands listed above. ```bash -$ yarn -$ yarn watch -$ yarn serve # in another shell -$ # Then visit http://localhost:5000 or http://localhost:5000/conwnet/github1s once the build is completed. +yarn +yarn watch +yarn serve # in another shell +# Then visit http://localhost:5000 or http://localhost:5000/conwnet/github1s once the build is completed. ``` ### Format all codes @@ -101,8 +121,8 @@ It uses `prettier` to format all possible codes. ## Build ```bash -$ yarn -$ yarn build +yarn +yarn build ``` ## Feedback diff --git a/docs/guide.md b/docs/guide.md index 505eac4fc..ee9db7027 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -41,15 +41,15 @@ Now you can visit http://localhost:5000 in the browser. If you get a 404 error f ## Watch Mode -What happens after you run `yarn watch`? +What happens after you run `yarn watch-with-vscode`? 1. Copy some necessary resources (`index.html`, extensions config, libraries, etc.) to the `dist` directory. -2. Go to `lib/vscode` and run `yarn gulp compile-web` to build the necessary extensions, then copy it to the `dist/extensions` directory. +2. Go to `vscode-web-github1s/lib/vscode` and run `yarn gulp compile-web` to build the necessary extensions, then copy it to the `dist/extensions` directory. -3. Go to `lib/vscode` and run `yarn watch` (the native watch of vscode), it will trigger a new build if something in it has been changed. +3. Go to `vscode-web-github1s/lib/vscode` and run `yarn watch` (the native watch of vscode), it will trigger a new build if something in it has been changed. -4. Watch the `src` directory, merge it in to `lib/vscode/src` if something in it has been changed. (When a new file is merged into `lib/vscode/src`, it will trigger the watcher that is described in Step 3) +4. Watch the `vscode-web-github1s/src` directory, merge it in to `vscode-web-github1s/lib/vscode/src` if something in it has been changed. (When a new file is merged into `lib/vscode/src`, it will trigger the watcher that is described in Step 3) 5. Go to `extensions/github1s` and run `yarn watch`, it will trigger a new build if something has been changed. @@ -59,6 +59,10 @@ Note that since we have modified the source code of VS Code, it may get into tro It is a little laborious to complete the watch process, but I didn't think of a better solution. +What happens after you run `yarn watch`? + +It's the same procedure as `yarn watch-with-vscode` without the step 2, 3, and 4. Instead of the local VS Code, it uses the prebuilt [@github1s/vscode-web](https://www.npmjs.com/package/@github1s/vscode-web) version. + ## Build mode Put simply, we build the necessary code and do a minify. The minify script is modified from [Code Server](https://github.com/cdr/code-server). diff --git a/extensions/github1s/package.json b/extensions/github1s/package.json index 210c7e8f7..f4ee8fb86 100644 --- a/extensions/github1s/package.json +++ b/extensions/github1s/package.json @@ -128,6 +128,12 @@ "category": "GitHub1s", "icon": "$(globe)" }, + { + "command": "github1s.editor-view-open-changes", + "title": "Open Changes", + "category": "GitHub1s", + "icon": "$(compare-changes)" + }, { "command": "github1s.diff-view-open-left-file", "title": "Open Left File", @@ -135,7 +141,8 @@ "icon": { "dark": "assets/icons/dark/open-left-file.svg", "light": "assets/icons/light/open-left-file.svg" - } + }, + "enablement": "isInDiffEditor && resourceScheme =~ /^github1s/ && resource =~ /^(?![^?]*\\?[^#]*(%26|\\b)base(=|%3D|%3d)github1s-empty-file)/" }, { "command": "github1s.diff-view-open-right-file", @@ -144,7 +151,22 @@ "icon": { "dark": "assets/icons/dark/open-right-file.svg", "light": "assets/icons/light/open-right-file.svg" - } + }, + "enablement": "isInDiffEditor && resourceScheme =~ /^github1s/ && resource =~ /^(?![^?]*\\?[^#]*(%26|\\b)head(=|%3D|%3d)github1s-empty-file)/" + }, + { + "command": "github1s.editor-view-open-prev-revision", + "title": "Open Previous Revision", + "category": "GitHub1s", + "icon": "$(arrow-left)", + "enablement": "resourceScheme =~ /^github1s$/ && resource =~ /^(?![^?]*\\?[^#]*(%26|\\b)base(=|%3D|%3d)github1s-empty-file)/" + }, + { + "command": "github1s.editor-view-open-next-revision", + "title": "Open Next Revision", + "category": "GitHub1s", + "icon": "$(arrow-right)", + "enablement": "resource =~ /^[^?]*\\?[^#]*(%26|\\b)hasNextRevision(=|%3D|%3d)true/" } ], "colors": [ @@ -220,6 +242,10 @@ "command": "github1s.commit-view-item-open-on-github", "when": "false" }, + { + "command": "github1s.editor-view-open-changes", + "when": "false" + }, { "command": "github1s.diff-view-open-left-file", "when": "false" @@ -227,6 +253,14 @@ { "command": "github1s.diff-view-open-right-file", "when": "false" + }, + { + "command": "github1s.editor-view-open-prev-revision", + "when": "false" + }, + { + "command": "github1s.editor-view-open-next-revision", + "when": "false" } ], "view/title": [ @@ -275,14 +309,29 @@ ], "editor/title": [ { - "command": "github1s.diff-view-open-left-file", - "when": "isInDiffEditor && resourceScheme =~ /^github1s/ && resource =~ /^[^?]*\\?[^#]*status(=|%3D|%3d)(?!added)/", + "command": "github1s.editor-view-open-changes", + "when": "!isInDiffEditor && github1s.context.showOpenChangesInEditorTitle", "group": "navigation@1" }, { - "command": "github1s.diff-view-open-right-file", - "when": "isInDiffEditor && resourceScheme =~ /^github1s/ && resource =~ /^[^?]*\\?[^#]*status(=|%3D|%3d)(?!removed)/", + "command": "github1s.diff-view-open-left-file", + "when": "isInDiffEditor", "group": "navigation@2" + }, + { + "command": "github1s.diff-view-open-right-file", + "when": "isInDiffEditor", + "group": "navigation@3" + }, + { + "command": "github1s.editor-view-open-prev-revision", + "when": "resourceScheme =~ /^github1s/", + "group": "navigation@98" + }, + { + "command": "github1s.editor-view-open-next-revision", + "when": "resourceScheme =~ /^github1s/", + "group": "navigation@99" } ] } diff --git a/extensions/github1s/src/commands/editor.ts b/extensions/github1s/src/commands/editor.ts index 32d70394d..d4ac2dc50 100644 --- a/extensions/github1s/src/commands/editor.ts +++ b/extensions/github1s/src/commands/editor.ts @@ -6,7 +6,42 @@ import * as vscode from 'vscode'; import * as queryString from 'query-string'; import router from '@/router'; +import repository from '@/repository'; +import { emptyFileUri } from '@/providers'; import { basename } from '@/helpers/util'; +import { + ChangedFile, + getChangedFiles, + getChangedFileCommand, + getChangedFileDiffTitle, +} from '@/source-control/changes'; +import { FileChangeType } from '@/repository/types'; + +export const getChangedFileFromSourceControl = async ( + fileUri: vscode.Uri +): Promise => { + // the file should belong to current workspace + if (fileUri.authority) { + return; + } + + return (await getChangedFiles()).find((changedFile) => { + return changedFile.headFileUri.path === fileUri.path; + }); +}; + +// open the diff editor of a file, such as click it in source-control-panel, +// only work when we can found the corresponding file in source-control-panel +export const commandEditorViewOpenChanges = async (fileUri: vscode.Uri) => { + const changedFile = await getChangedFileFromSourceControl(fileUri); + + if (!changedFile) { + return; + } + + const command = await getChangedFileCommand(changedFile); + vscode.commands.executeCommand(command.command, ...command.arguments); +}; const openFileToEditor = async (fileUri) => { const isCurrentAuthority = @@ -51,3 +86,121 @@ export const commandDiffViewOpenRightFile = async (fileUri: vscode.Uri) => { } return openFileToEditor(vscode.Uri.parse(query.head as string)); }; + +// get the file uri with the latest commit, the `ref` in +// `fileUri.authority` maybe newer but not related this file +const getLatestFileUri = async (fileUri: vscode.Uri) => { + // the `fileUri.authority` maybe empty, fallback + // to router.getAuthority() in this case + const fileAuthority = fileUri.authority || (await router.getAuthority()); + const [owner, repo, ref] = fileAuthority.split('+').filter(Boolean); + const latestCommitSha = await repository.getFileCommitSha(fileUri.path, ref); + + return fileUri.with({ + authority: `${owner}+${repo}+${latestCommitSha}`, + }); +}; + +// show the file's diff between current commit and previous commit +export const commandEditorViewOpenPrevRevision = async ( + fileUri: vscode.Uri +) => { + const queryBaseUriStr = queryString.parse(fileUri.query).base; + const rightFileUri = await getLatestFileUri( + // if the `queryBaseUriStr` is empty, which means this command + // is called from a normal file editor (not a diff editor), + // just use `fileUri` in this case + queryBaseUriStr ? vscode.Uri.parse(queryBaseUriStr as string) : fileUri + ); + + const [owner, repo, rightCommitSha] = rightFileUri.authority + .split('+') + .filter(Boolean); + const leftCommitSha = await repository.getFilePrevCommitSha( + rightFileUri.path, + rightCommitSha + ); + + // if we can't find prevCommitSha, use the the `emptyFileUri` as the leftFileUri + const leftFileUri = leftCommitSha + ? rightFileUri.with({ authority: `${owner}+${repo}+${leftCommitSha}` }) + : emptyFileUri; + + const changedStatus = leftCommitSha + ? FileChangeType.MODIFIED + : FileChangeType.ADDED; + + const hasNextRevision = !!(await repository.getFileNextCommitSha( + rightFileUri.path, + rightCommitSha + )); + + const query = queryString.stringify({ + base: leftFileUri.with({ query: '' }).toString(), + head: rightFileUri.with({ query: '' }).toString(), + status: changedStatus, + // if we can't find a newer commit for this file, + // the `Show Next Commit` Button would be disabled. + hasNextRevision, + }); + const title = getChangedFileDiffTitle( + leftFileUri, + rightFileUri, + changedStatus + ); + + return vscode.commands.executeCommand( + 'vscode.diff', + leftFileUri.with({ query }), + rightFileUri.with({ query }), + title + ); +}; + +// show the file's diff between current commit and next commit +export const commandEditorViewOpenNextRevision = async ( + fileUri: vscode.Uri +) => { + const leftFileUri = await getLatestFileUri(fileUri); + + const [owner, repo, leftCommitSha] = leftFileUri.authority + .split('+') + .filter(Boolean); + const rightCommitSha = await repository.getFileNextCommitSha( + leftFileUri.path, + leftCommitSha + ); + + if (!rightCommitSha) { + return vscode.window.showInformationMessage( + 'There is no next commit found.' + ); + } + + const rightFileUri = leftFileUri.with({ + authority: `${owner}+${repo}+${rightCommitSha}`, + }); + + const hasNextRevision = !!(await repository.getFileNextCommitSha( + rightFileUri.path, + rightCommitSha + )); + const query = queryString.stringify({ + base: leftFileUri.with({ query: '' }).toString(), + head: rightFileUri.with({ query: '' }).toString(), + status: FileChangeType.MODIFIED, + hasNextRevision, + }); + const title = getChangedFileDiffTitle( + leftFileUri, + rightFileUri, + FileChangeType.MODIFIED + ); + + return vscode.commands.executeCommand( + 'vscode.diff', + leftFileUri.with({ query }), + rightFileUri.with({ query }), + title + ); +}; diff --git a/extensions/github1s/src/commands/index.ts b/extensions/github1s/src/commands/index.ts index dfe2d4c17..a52c66e59 100644 --- a/extensions/github1s/src/commands/index.ts +++ b/extensions/github1s/src/commands/index.ts @@ -24,8 +24,11 @@ import { } from './commit'; import { commandOpenGitpod } from './gitpod'; import { + commandEditorViewOpenChanges, commandDiffViewOpenLeftFile, commandDiffViewOpenRightFile, + commandEditorViewOpenNextRevision, + commandEditorViewOpenPrevRevision, } from './editor'; const commands: { id: string; callback: (...args: any[]) => any }[] = [ @@ -62,10 +65,16 @@ const commands: { id: string; callback: (...args: any[]) => any }[] = [ // open current repository on gitpod { id: 'github1s.open-gitpod', callback: commandOpenGitpod }, + // open the changes of a file + { id: 'github1s.editor-view-open-changes', callback: commandEditorViewOpenChanges }, // prettier-ignore // open the left file in diff editor { id: 'github1s.diff-view-open-left-file', callback: commandDiffViewOpenLeftFile }, // prettier-ignore // open the right file in diff editor { id: 'github1s.diff-view-open-right-file', callback: commandDiffViewOpenRightFile }, // prettier-ignore + // open the previous revision of a file + { id: 'github1s.editor-view-open-prev-revision', callback: commandEditorViewOpenPrevRevision }, // prettier-ignore + // open the next revision of a file + { id: 'github1s.editor-view-open-next-revision', callback: commandEditorViewOpenNextRevision }, // prettier-ignore ]; export const registerGitHub1sCommands = () => { diff --git a/extensions/github1s/src/interfaces/github-api-rest.ts b/extensions/github1s/src/interfaces/github-api-rest.ts index abf7fd9a0..1ec4572b7 100644 --- a/extensions/github1s/src/interfaces/github-api-rest.ts +++ b/extensions/github1s/src/interfaces/github-api-rest.ts @@ -188,6 +188,19 @@ export const getGitHubCommits = ( ).catch(handleRequestError); }; +export const getGitHubFileCommits = ( + owner: string, + repo: string, + filePath: string, + sha: string, + options?: ResponseInit +) => { + return fetch( + `https://api.github.com/repos/${owner}/${repo}/commits?path=${filePath.slice(1)}&sha=${sha}&per_page=100`, // prettier-ignore + options + ).catch(handleRequestError); +}; + export const getGitHubCommitDetail = ( owner: string, repo: string, diff --git a/extensions/github1s/src/listeners/vscode.ts b/extensions/github1s/src/listeners/vscode.ts index 1f12bdaad..64acaafbe 100644 --- a/extensions/github1s/src/listeners/vscode.ts +++ b/extensions/github1s/src/listeners/vscode.ts @@ -6,37 +6,58 @@ import * as vscode from 'vscode'; import router from '@/router'; import { PageType } from '@/router/types'; +import { getChangedFileFromSourceControl } from '@/commands/editor'; import { GitHub1sFileSystemProvider } from '@/providers/fileSystemProvider'; -export const registerVSCodeEventListeners = () => { +const handleRouterOnActiveEditorChange = async ( + editor: vscode.TextEditor | undefined +) => { // replace current url when user change active editor - vscode.window.onDidChangeActiveTextEditor(async (editor) => { - const { owner, repo, ref, pageType } = await router.getState(); - const activeFileUri = editor?.document.uri; - - // if no file opened and the branch is HEAD current, - // only retain `owner` and `repo` (and `ref` if need) in url - if (!activeFileUri) { - const browserPath = - ref.toUpperCase() === 'HEAD' - ? `/${owner}/${repo}` - : `/${owner}/${repo}/tree/${ref}`; - router.history.replace(browserPath); - return; - } - - if ( - // only `tree/blob` page will replace url with the active editor change - ![PageType.TREE, PageType.BLOB].includes(pageType) || - // only the file in explorer will change the router, - // the file in explorer will have a empty authority - activeFileUri?.authority || - activeFileUri?.scheme !== GitHub1sFileSystemProvider.scheme - ) { - return; - } - - const browserPath = `/${owner}/${repo}/blob/${ref}${activeFileUri.path}`; + const { owner, repo, ref, pageType } = await router.getState(); + const activeFileUri = editor?.document.uri; + + // only `tree/blob` page will replace url with the active editor change + if (![PageType.TREE, PageType.BLOB].includes(pageType)) { + return; + } + + // if the file which not belong to current workspace is opened, or no file + // is opened, only retain `owner` and `repo` (and `ref` if need) in browser url + if ( + !activeFileUri || + activeFileUri?.authority || + activeFileUri?.scheme !== GitHub1sFileSystemProvider.scheme + ) { + const browserPath = + ref.toUpperCase() === 'HEAD' + ? `/${owner}/${repo}` + : `/${owner}/${repo}/tree/${ref}`; router.history.replace(browserPath); + return; + } + + const browserPath = `/${owner}/${repo}/blob/${ref}${activeFileUri.path}`; + router.history.replace(browserPath); +}; + +// if the `Open Changes` Button should show in editor title +const handleOpenChangesContextOnActiveEditorChange = async ( + editor: vscode.TextEditor | undefined +) => { + const changedFile = editor?.document.uri + ? await getChangedFileFromSourceControl(editor.document.uri) + : undefined; + + return vscode.commands.executeCommand( + 'setContext', + 'github1s.context.showOpenChangesInEditorTitle', + !!changedFile + ); +}; + +export const registerVSCodeEventListeners = () => { + vscode.window.onDidChangeActiveTextEditor(async (editor) => { + handleRouterOnActiveEditorChange(editor); + handleOpenChangesContextOnActiveEditorChange(editor); }); }; diff --git a/extensions/github1s/src/providers/changedFileDecorationProvider.ts b/extensions/github1s/src/providers/changedFileDecorationProvider.ts index d5eda6ed0..c53549d82 100644 --- a/extensions/github1s/src/providers/changedFileDecorationProvider.ts +++ b/extensions/github1s/src/providers/changedFileDecorationProvider.ts @@ -15,10 +15,8 @@ import { ThemeColor, } from 'vscode'; import router from '@/router'; -import repository, { - FileChangeType, - RepositoryChangedFile, -} from '@/repository'; +import repository from '@/repository'; +import { FileChangeType, RepositoryChangedFile } from '@/repository/types'; import { PageType } from '@/router/types'; import { GitHub1sFileSystemProvider } from './fileSystemProvider'; diff --git a/extensions/github1s/src/providers/index.ts b/extensions/github1s/src/providers/index.ts index cc644adbf..38f265062 100644 --- a/extensions/github1s/src/providers/index.ts +++ b/extensions/github1s/src/providers/index.ts @@ -24,6 +24,9 @@ export const changedFileDecorationProvider = new GitHub1sChangedFileDecorationPr export const sourceControlDecorationProvider = new GitHub1sSourceControlDecorationProvider(); export const EMPTY_FILE_SCHEME = 'github1s-empty-file'; +export const emptyFileUri = vscode.Uri.parse('').with({ + scheme: EMPTY_FILE_SCHEME, +}); export const registerVSCodeProviders = () => { const context = getExtensionContext(); diff --git a/extensions/github1s/src/repository.ts b/extensions/github1s/src/repository.ts deleted file mode 100644 index 711c0aba8..000000000 --- a/extensions/github1s/src/repository.ts +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @file Current GitHub Repository - * @author netcon - */ - -import { reuseable } from '@/helpers/func'; -import router from '@/router'; -import { - getGitHubBranchRefs, - getGitHubPullDetail, - getGitHubTagRefs, - getGitHubPullFiles, - getGitHubPulls, - getGitHubCommitDetail, - getGitHubCommits, -} from '@/interfaces/github-api-rest'; -import { getFetchOptions } from './helpers/fetch'; - -export interface RepositoryRef { - name: string; - ref: string; - node_id: string; - url: string; - object: { - sha: string; - type: string; - url: string; - }; -} - -export interface RepositoryPull { - number: number; - title: string; - state: string; - created_at: string; - closed_at: string; - merged_at: string; - user: { - login: string; - avatar_url: string; - }; - head: { - sha: string; - }; - base: { - sha: string; - }; -} - -export interface RepositoryCommit { - sha: string; - author: { - login: string; - avatar_url: string; - }; - commit: { - author: { - date: string; - email: string; - name: string; - }; - message: string; - }; - parents: { sha: string }[]; - files?: RepositoryChangedFile[]; -} - -export enum FileChangeType { - ADDED = 'added', - REMOVED = 'removed', - MODIFIED = 'modified', - RENAMED = 'renamed', -} - -export interface RepositoryChangedFile { - filename: string; - previous_filename?: string; - status: FileChangeType; -} - -export class Repository { - private static instance: Repository; - - public static getInstance() { - if (Repository.instance) { - return this.instance; - } - return (Repository.instance = new Repository()); - } - - // get current repo owner - public getOwner() { - const pathname = router.history.location.pathname; - return pathname.split('/').filter(Boolean)[0] || 'conwnet'; - } - - // get current repo name - public getRepo() { - const pathname = router.history.location.pathname; - return pathname.split('/').filter(Boolean)[1] || 'github1s'; - } - - // get all branches for current repository - public getBranches = reuseable( - async (forceUpdate: boolean = false): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return await getGitHubBranchRefs( - owner, - repo, - getFetchOptions(forceUpdate) - ); - } - ); - - // get all tags for current repository - public getTags = reuseable( - async (forceUpdate: boolean = false): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubTagRefs(owner, repo, getFetchOptions(forceUpdate)); - } - ); - - public getPulls = reuseable( - async (forceUpdate: boolean = false): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubPulls(owner, repo, getFetchOptions(forceUpdate)); - } - ); - - public getPull = reuseable( - async ( - pullNumber: number, - forceUpdate: boolean = false - ): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubPullDetail( - owner, - repo, - pullNumber, - getFetchOptions(forceUpdate) - ); - } - ); - - public getPullFiles = reuseable( - async ( - pullNumber: number, - forceUpdate: boolean = false - ): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubPullFiles( - owner, - repo, - pullNumber, - getFetchOptions(forceUpdate) - ); - } - ); - - public getCommits = reuseable( - async ( - sha: string, - forceUpdate: boolean = false - ): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubCommits(owner, repo, sha, getFetchOptions(forceUpdate)); - } - ); - - public getCommit = reuseable( - async ( - commitSha: string, - forceUpdate: boolean = false - ): Promise => { - const [owner, repo] = [this.getOwner(), this.getRepo()]; - return getGitHubCommitDetail( - owner, - repo, - commitSha, - getFetchOptions(forceUpdate) - ); - } - ); - - public getCommitFiles = reuseable( - async ( - commitSha: string, - forceUpdate: boolean = false - ): Promise => - (await this.getCommit(commitSha, forceUpdate)).files - ); -} - -export default Repository.getInstance(); diff --git a/extensions/github1s/src/repository/index.ts b/extensions/github1s/src/repository/index.ts new file mode 100644 index 000000000..e632424cf --- /dev/null +++ b/extensions/github1s/src/repository/index.ts @@ -0,0 +1,247 @@ +/** + * @file Current GitHub Repository + * @author netcon + */ + +import { reuseable } from '@/helpers/func'; +import router from '@/router'; +import { + getGitHubBranchRefs, + getGitHubPullDetail, + getGitHubTagRefs, + getGitHubPullFiles, + getGitHubPulls, + getGitHubCommitDetail, + getGitHubCommits, + getGitHubFileCommits, +} from '@/interfaces/github-api-rest'; +import { getFetchOptions } from '@/helpers/fetch'; +import { LinkedList, LinkedListDirection } from './linked-list'; +import { + RepositoryChangedFile, + RepositoryCommit, + RepositoryPull, + RepositoryRef, +} from './types'; + +export class Repository { + private static instance: Repository; + private _fileCommitIdListMap: Map; + private _pullMap: Map; + private _commitMap: Map; + + public static getInstance() { + if (Repository.instance) { + return this.instance; + } + return (Repository.instance = new Repository()); + } + + constructor() { + this._fileCommitIdListMap = new Map(); + this._pullMap = new Map(); + this._commitMap = new Map(); + } + + // get current repo owner + public getOwner() { + const pathname = router.history.location.pathname; + return pathname.split('/').filter(Boolean)[0] || 'conwnet'; + } + + // get current repo name + public getRepo() { + const pathname = router.history.location.pathname; + return pathname.split('/').filter(Boolean)[1] || 'github1s'; + } + + // get all branches for current repository + public getBranches = reuseable( + async (forceUpdate: boolean = false): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + return await getGitHubBranchRefs( + owner, + repo, + getFetchOptions(forceUpdate) + ); + } + ); + + // get all tags for current repository + public getTags = reuseable( + async (forceUpdate: boolean = false): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + return getGitHubTagRefs(owner, repo, getFetchOptions(forceUpdate)); + } + ); + + public getPulls = reuseable( + async (forceUpdate: boolean = false): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + const fetchOptions = getFetchOptions(forceUpdate); + const pulls = await getGitHubPulls(owner, repo, fetchOptions); + // `this.getPull` can be benefited from the cache + pulls.forEach((pull) => this._pullMap.set(pull.number, pull)); + return pulls; + } + ); + + public getPull = reuseable( + async ( + pullNumber: number, + forceUpdate: boolean = false + ): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + if (forceUpdate || !this._pullMap.has(pullNumber)) { + const pull = await getGitHubPullDetail( + owner, + repo, + pullNumber, + getFetchOptions(forceUpdate) + ); + this._pullMap.set(pullNumber, pull); + } + return this._pullMap.get(pullNumber); + } + ); + + public getPullFiles = reuseable( + async ( + pullNumber: number, + forceUpdate: boolean = false + ): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + return getGitHubPullFiles( + owner, + repo, + pullNumber, + getFetchOptions(forceUpdate) + ); + } + ); + + public getCommits = reuseable( + async ( + sha: string, + forceUpdate: boolean = false + ): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + const fetchOptions = getFetchOptions(forceUpdate); + const commits = await getGitHubCommits(owner, repo, sha, fetchOptions); + // `this.getCommit` can be benefited from the cache + commits.forEach((commit) => this._commitMap.set(commit.sha, commit)); + return commits; + } + ); + + public getCommit = reuseable( + async ( + commitSha: string, + forceUpdate: boolean = false + ): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + if (forceUpdate || !this._commitMap.has(commitSha)) { + const commit = await getGitHubCommitDetail( + owner, + repo, + commitSha, + getFetchOptions(forceUpdate) + ); + this._commitMap.set(commitSha, commit); + } + return this._commitMap.get(commitSha); + } + ); + + public getCommitFiles = reuseable( + async ( + commitSha: string, + forceUpdate: boolean = false + ): Promise => { + return ( + // the commit maybe updated by fetch commit **list** which + // won't have the file list data, so we will fallback to + // fetch single commit data to get the file list data + (await this.getCommit(commitSha, forceUpdate)).files || + (await this.getCommit(commitSha, true)).files + ); + } + ); + + // get this commits for a specified file + public getFileCommits = reuseable( + async ( + filePath: string, + commitSha: string, + forceUpdate: boolean = false + ): Promise => { + const [owner, repo] = [this.getOwner(), this.getRepo()]; + const commits = await getGitHubFileCommits( + owner, + repo, + filePath, + commitSha, + getFetchOptions(forceUpdate) + ); + // `this.getCommit` can be benefited from the cache + commits.forEach((commit) => this._commitMap.set(commit.sha, commit)); + return commits; + } + ); + + // get the commit sha of a file with direction, default get + // the latest commit sha for the file, note this the latest + // commit sha maybe not equal the `commitSha` in arguments + public getFileCommitSha = reuseable( + async ( + filePath: string, + commitShaOrRef: string, + direction: LinkedListDirection = LinkedListDirection.CURRENT, + forceUpdate: boolean = false + ): Promise => { + if (!this._fileCommitIdListMap.has(filePath)) { + this._fileCommitIdListMap.set(filePath, new LinkedList()); + } + const commitIdList = this._fileCommitIdListMap.get(filePath); + if (!commitIdList.getNodeId(commitShaOrRef, direction)) { + const commits = await this.getFileCommits( + filePath, + commitShaOrRef, + forceUpdate + ); + commitIdList.update(commits.map((item) => item.sha).reverse()); + // Actually the latest commit for `filePath` maybe not equal the + // `commitSha` in arguments, we should use commits[0].sha in this case + return commitIdList.getNodeId(commits[0]?.sha, direction); + } + return commitIdList.getNodeId(commitShaOrRef, direction); + } + ); + + public getFilePrevCommitSha = reuseable( + async ( + filePath: string, + commitSha: string, + forceUpdate: boolean = false + ): Promise => { + return this.getFileCommitSha( + filePath, + commitSha, + LinkedListDirection.PREVIOUS, + forceUpdate + ); + } + ); + + public getFileNextCommitSha = reuseable( + async (filePath: string, commitSha: string): Promise => { + // because we can not find the next commit by GitHub API, + // we can only try to find the next commit from the cache + return this._fileCommitIdListMap + .get(filePath) + ?.getNodeId(commitSha, LinkedListDirection.NEXT); + } + ); +} + +export default Repository.getInstance(); diff --git a/extensions/github1s/src/repository/linked-list.ts b/extensions/github1s/src/repository/linked-list.ts new file mode 100644 index 000000000..81cc3f577 --- /dev/null +++ b/extensions/github1s/src/repository/linked-list.ts @@ -0,0 +1,67 @@ +/** + * @file a bidirectional linked list + */ + +class ListNode { + id: string; + prev: ListNode; + next: ListNode; + + constructor(id: string) { + this.id = id; + this.prev = null; + this.next = null; + } +} + +const linkNodes = (prevNode: ListNode, currentNode: ListNode) => { + if (prevNode && currentNode) { + prevNode.next = currentNode; + currentNode.prev = prevNode; + } +}; + +export enum LinkedListDirection { + PREVIOUS = -1, + CURRENT = 0, + NEXT = 1, +} + +export class LinkedList { + private _nodeMap: Map; + + constructor() { + this._nodeMap = new Map(); + } + + private createNode(id: string) { + const node = new ListNode(id); + this._nodeMap.set(node.id, node); + return node; + } + + private getNode(id: string) { + return this._nodeMap.get(id); + } + + public update(idList: string[]) { + for (let i = 0, len = idList.length; i < len; i++) { + const currentNode = this.getNode(idList[i]) || this.createNode(idList[i]); + i > 0 && linkNodes(this.getNode(idList[i - 1]), currentNode); + } + } + + public getNodeId(id: string, direction: LinkedListDirection) { + if (direction === LinkedListDirection.PREVIOUS) { + return this.getNode(id)?.prev?.id; + } + + if (direction === LinkedListDirection.CURRENT) { + return this.getNode(id)?.id; + } + + if (direction === LinkedListDirection.NEXT) { + return this.getNode(id)?.next?.id; + } + } +} diff --git a/extensions/github1s/src/repository/types.ts b/extensions/github1s/src/repository/types.ts new file mode 100644 index 000000000..165cd5fef --- /dev/null +++ b/extensions/github1s/src/repository/types.ts @@ -0,0 +1,66 @@ +/** + * @file Repository types + * @author netcon + */ + +export interface RepositoryRef { + name: string; + ref: string; + node_id: string; + url: string; + object: { + sha: string; + type: string; + url: string; + }; +} + +export interface RepositoryPull { + number: number; + title: string; + state: string; + created_at: string; + closed_at: string; + merged_at: string; + user: { + login: string; + avatar_url: string; + }; + head: { + sha: string; + }; + base: { + sha: string; + }; +} + +export interface RepositoryCommit { + sha: string; + author: { + login: string; + avatar_url: string; + }; + commit: { + author: { + date: string; + email: string; + name: string; + }; + message: string; + }; + parents: { sha: string }[]; + files?: RepositoryChangedFile[]; +} + +export enum FileChangeType { + ADDED = 'added', + REMOVED = 'removed', + MODIFIED = 'modified', + RENAMED = 'renamed', +} + +export interface RepositoryChangedFile { + filename: string; + previous_filename?: string; + status: FileChangeType; +} diff --git a/extensions/github1s/src/source-control/changes.ts b/extensions/github1s/src/source-control/changes.ts index df76c9ec2..557118734 100644 --- a/extensions/github1s/src/source-control/changes.ts +++ b/extensions/github1s/src/source-control/changes.ts @@ -5,14 +5,15 @@ import * as vscode from 'vscode'; import * as queryString from 'query-string'; -import repository, { +import repository from '@/repository'; +import { FileChangeType, RepositoryCommit, RepositoryPull, -} from '@/repository'; +} from '@/repository/types'; import router from '@/router'; import { basename } from '@/helpers/util'; -import { EMPTY_FILE_SCHEME } from '@/providers'; +import { emptyFileUri } from '@/providers'; import { GitHub1sFileSystemProvider } from '@/providers/fileSystemProvider'; import { PageType } from '@/router/types'; import { GitHub1sQuickDiffProvider } from './quickDiffProviders'; @@ -78,7 +79,7 @@ export const getCommitChangedFiles = async (commit: RepositoryCommit) => { }); }; -const getChangedFiles = async (): Promise => { +export const getChangedFiles = async (): Promise => { const routerState = await router.getState(); // github pull page @@ -95,49 +96,49 @@ const getChangedFiles = async (): Promise => { }; // get the title of the diff editor -const getChangedFileDiffTitle = (changedFile: ChangedFile) => { - const baseFileUri = changedFile.baseFileUri; - const headFileUri = changedFile.headFileUri; +export const getChangedFileDiffTitle = ( + baseFileUri: vscode.Uri, + headFileUri: vscode.Uri, + status: FileChangeType +) => { const baseFileName = basename(baseFileUri.path); const headFileName = basename(headFileUri.path); const [_owner, _repo, baseCommitSha] = baseFileUri.authority.split('+'); const [__owner, __repo, headCommitSha] = headFileUri.authority.split('+'); - const baseFileLabel = `${baseFileName} (${baseCommitSha.slice(0, 7)})`; - const headFileLabel = `${headFileName} (${headCommitSha.slice(0, 7)})`; + const baseFileLabel = `${baseFileName} (${baseCommitSha?.slice(0, 7)})`; + const headFileLabel = `${headFileName} (${headCommitSha?.slice(0, 7)})`; - if (changedFile.status === FileChangeType.ADDED) { - return `${baseFileName} (added in ${headCommitSha.slice(0, 7)})`; + if (status === FileChangeType.ADDED) { + return `${headFileName} (added in ${headCommitSha.slice(0, 7)})`; } - if (changedFile.status === FileChangeType.REMOVED) { + if (status === FileChangeType.REMOVED) { return `${baseFileName} (deleted from ${baseCommitSha.slice(0, 7)})`; } return `${baseFileLabel} ⟷ ${headFileLabel}`; }; -const emptyFileUri = vscode.Uri.parse('').with({ - scheme: EMPTY_FILE_SCHEME, -}); - export const getChangedFileCommand = (changedFile: ChangedFile) => { - const title = getChangedFileDiffTitle(changedFile); let baseFileUri = changedFile.baseFileUri; let headFileUri = changedFile.headFileUri; - const query = queryString.stringify({ - base: baseFileUri.toString(), - head: headFileUri.toString(), - status: changedFile.status, - }); + const status = changedFile.status; - if (changedFile.status === FileChangeType.ADDED) { + if (status === FileChangeType.ADDED) { baseFileUri = emptyFileUri; } - if (changedFile.status === FileChangeType.REMOVED) { + if (status === FileChangeType.REMOVED) { headFileUri = emptyFileUri; } + const title = getChangedFileDiffTitle(baseFileUri, headFileUri, status); + const query = queryString.stringify({ + status, + base: baseFileUri.with({ query: '' }).toString(), + head: headFileUri.with({ query: '' }).toString(), + }); + return { title: 'Diff', command: 'vscode.diff', diff --git a/extensions/github1s/src/source-control/quickDiffProviders.ts b/extensions/github1s/src/source-control/quickDiffProviders.ts index b89e874fc..76d8cd4ca 100644 --- a/extensions/github1s/src/source-control/quickDiffProviders.ts +++ b/extensions/github1s/src/source-control/quickDiffProviders.ts @@ -5,13 +5,12 @@ import * as vscode from 'vscode'; import router from '@/router'; -import repository, { FileChangeType } from '@/repository'; +import repository from '@/repository'; +import { FileChangeType } from '@/repository/types'; import { PageType } from '@/router/types'; -import { EMPTY_FILE_SCHEME } from '@/providers'; +import { emptyFileUri } from '@/providers'; import { GitHub1sFileSystemProvider } from '@/providers/fileSystemProvider'; -const emptyFileUri = vscode.Uri.parse('').with({ scheme: EMPTY_FILE_SCHEME }); - // get the original source uri when the `routerState.pageType` is `PageType.PULL` const getOriginalResourceForPull = async ( uri: vscode.Uri, diff --git a/extensions/github1s/src/views/commit-list-view.ts b/extensions/github1s/src/views/commit-list-view.ts index 05c056175..697e7ce6c 100644 --- a/extensions/github1s/src/views/commit-list-view.ts +++ b/extensions/github1s/src/views/commit-list-view.ts @@ -6,7 +6,8 @@ import * as vscode from 'vscode'; import * as queryString from 'query-string'; import { relativeTimeTo } from '@/helpers/date'; -import repository, { RepositoryCommit } from '@/repository'; +import repository from '@/repository'; +import { RepositoryCommit } from '@/repository/types'; import { GitHub1sSourceControlDecorationProvider } from '@/providers/sourceControlDecorationProvider'; import { getChangedFileCommand, diff --git a/extensions/github1s/src/views/pull-list-view.ts b/extensions/github1s/src/views/pull-list-view.ts index 093713cf4..c6c883e21 100644 --- a/extensions/github1s/src/views/pull-list-view.ts +++ b/extensions/github1s/src/views/pull-list-view.ts @@ -5,7 +5,8 @@ import * as vscode from 'vscode'; import { relativeTimeTo } from '@/helpers/date'; -import repository, { RepositoryPull } from '@/repository'; +import repository from '@/repository'; +import { RepositoryPull } from '@/repository/types'; import { GitHub1sSourceControlDecorationProvider } from '@/providers/sourceControlDecorationProvider'; import * as queryString from 'query-string'; import { diff --git a/package.json b/package.json index d96a95d46..7d72a6712 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "lib": "lib" }, "devDependencies": { + "@github1s/vscode-web": "0.0.3", "@typescript-eslint/eslint-plugin": "^4.15.0", "@typescript-eslint/parser": "^4.15.0", "chokidar": "^3.5.1", @@ -22,6 +23,7 @@ "prettier": "^2.2.1", "serve-handler": "^6.1.3", "start-server-and-test": "^1.12.0", + "yalc": "^1.0.0-pre.50", "typescript": "^4.1.3" }, "scripts": { @@ -30,15 +32,17 @@ "clean-build": "./scripts/clean-build.sh", "clean": "./scripts/clean.sh", "build": "./scripts/build.sh", + "yalc": "yalc publish vscode-web-github1s && yalc add -D @github1s/vscode-web", + "build:vscode": "cd vscode-web-github1s && yarn build", "vercel-build": "yarn build && yarn hash && mv dist public", "hash": "./scripts/hash.sh", "package": "./scripts/package.sh", "watch": "rm -rf dist && run-p watch:*", + "watch-with-vscode": "run-p watch watch-vscode", + "watch-vscode": "cd vscode-web-github1s && yarn watch", "watch:setup": "./scripts/watch.sh", - "watch:vscode": "cd lib/vscode && yarn watch", - "watch:github1s-extension": "cd extensions/github1s && yarn dev", - "watch:src": "cd scripts/watch && node watch-src.js", "watch:dist": "cd scripts/watch && node watch-dist.js", + "watch:github1s-extension": "cd extensions/github1s && yarn dev", "serve": "node ./scripts/serve-dist.js", "format": "prettier --write .", "eslint": "eslint --ext .ts --ext .js .", diff --git a/scripts/build.sh b/scripts/build.sh index 64815bd38..bb411b40a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -9,12 +9,10 @@ export IS_BUILD="true" function main() { rm -rf "${APP_ROOT}/dist" cd "${APP_ROOT}/scripts" - ./build/sync-code.sh - ./build/build-vscode.sh ./build/build-github1s-extensions.sh ./package.sh echo "all build done!" } -main "$@" \ No newline at end of file +main "$@" diff --git a/scripts/package.sh b/scripts/package.sh index b8a3dc9c9..c441603ee 100755 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -6,7 +6,6 @@ APP_ROOT=$(pwd) function main() { cd "${APP_ROOT}/scripts" - ./package/copy-vscode.sh ./package/copy-extensions.sh ./package/copy-node_modules.sh ./package/copy-resources.sh diff --git a/scripts/package/copy-extensions.js b/scripts/package/copy-extensions.js index e25618276..0bb5bc92c 100755 --- a/scripts/package/copy-extensions.js +++ b/scripts/package/copy-extensions.js @@ -4,26 +4,13 @@ const path = require('path'); const fs = require('fs-extra'); const APP_ROOT = path.join(__dirname, '../..'); -const TARGET_DIR = path.join(APP_ROOT, 'dist/static/extensions'); -const enableExtensions = - require(path.join(APP_ROOT, 'resources/builtin-extensions.json')) || []; const main = () => { - fs.ensureDirSync(TARGET_DIR); - - enableExtensions.forEach((extension) => { - fs.copySync( - path.join(APP_ROOT, 'lib/vscode', extension.path), - path.join(TARGET_DIR, path.basename(extension.path)), - { filter: (src) => !src.includes('node_modules') } - ); - }); - const extensions = fs.readdirSync(path.join(APP_ROOT, 'extensions')); extensions.forEach((extension) => { fs.copySync( path.join(APP_ROOT, 'extensions', extension), - path.join(TARGET_DIR, extension), + path.join(path.join(APP_ROOT, 'dist/static/extensions'), extension), { filter: (src) => !src.includes('node_modules') } ); }); diff --git a/scripts/package/copy-extensions.sh b/scripts/package/copy-extensions.sh index c7cfd5931..28decb127 100755 --- a/scripts/package/copy-extensions.sh +++ b/scripts/package/copy-extensions.sh @@ -4,19 +4,10 @@ set -euo pipefail cd "$(dirname "${0}")/../.." APP_ROOT=$(pwd) -function ensureBuiltinExtensitions() { - cd "${APP_ROOT}/lib/vscode" - if [ ! -e "extensions/emmet/dist/browser" ] - then - echo "compile vscode builtin extensions..." - yarn gulp compile-web - fi -} - function main() { - ensureBuiltinExtensitions cd ${APP_ROOT} - mkdir -p dist/static/extensions + TARGET="vscode-web-github1s/dist" + mkdir -p "${TARGET}/extensions" node scripts/package/copy-extensions.js echo "copy vscode builtin extensions done!" diff --git a/scripts/package/copy-node_modules.sh b/scripts/package/copy-node_modules.sh index cc0c02fed..026dd4105 100755 --- a/scripts/package/copy-node_modules.sh +++ b/scripts/package/copy-node_modules.sh @@ -11,9 +11,11 @@ function main() { for dependency in ${dependencies[@]}; do - rsync -a --del lib/vscode/node_modules/${dependency} dist/static/node_modules + rsync -a --del vscode-web-github1s/node_modules/${dependency} dist/static/node_modules done + rsync -a node_modules/@github1s/vscode-web/dist/extensions/ dist/static/extensions + rsync -a --del node_modules/@github1s/vscode-web/dist/vscode/ dist/static/vscode echo "copy necessary node_modules done!" } diff --git a/scripts/package/generate-config.js b/scripts/package/generate-config.js index 07ba927c9..d4ce73aef 100755 --- a/scripts/package/generate-config.js +++ b/scripts/package/generate-config.js @@ -4,10 +4,13 @@ const fs = require('fs-extra'); const path = require('path'); const APP_ROOT = path.join(__dirname, '../..'); -const VSCODE_PATH = path.join(APP_ROOT, 'lib/vscode'); +const VSCODE_PATH = path.join( + APP_ROOT, + 'node_modules/@github1s/vscode-web/dist' +); const enableExtensions = require(path.join( APP_ROOT, - 'resources/builtin-extensions.json' + 'vscode-web-github1s/resources/builtin-extensions.json' )); /** diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh index dfe9b84bb..9b25b8194 100755 --- a/scripts/postinstall.sh +++ b/scripts/postinstall.sh @@ -15,16 +15,8 @@ function main() { fi done - # clone vscode and install dependencies - cd ${APP_ROOT} - if [ -d "lib/vscode" ]; then - echo "./lib/vscode already exists, skip clone." - exit 0 - fi - mkdir -p lib - cd lib - git clone --depth 1 -b 1.52.1 https://github.com/microsoft/vscode.git vscode - cd vscode + # install dependencies for the @github1s/vscode-web + cd "${APP_ROOT}/vscode-web-github1s" yarn --frozen-lockfile } diff --git a/scripts/watch.sh b/scripts/watch.sh index c22d79861..f292272ba 100755 --- a/scripts/watch.sh +++ b/scripts/watch.sh @@ -13,7 +13,7 @@ function main() { node ./package/generate-config.js echo 'please waiting...' - while [ ! -e "${APP_ROOT}/lib/vscode/out" ] + while [ ! -e "${APP_ROOT}/vscode-web-github1s/lib/vscode/out" ] do echo "waiting for vscode build..." sleep 3 diff --git a/scripts/watch/watch-dist.js b/scripts/watch/watch-dist.js index 14337ac05..0f2848ad3 100755 --- a/scripts/watch/watch-dist.js +++ b/scripts/watch/watch-dist.js @@ -22,21 +22,6 @@ const debounce = (func, delay) => { }; }; -const autoSyncVscodeOut = async () => { - const SOURCE = path.join(APP_ROOT, 'lib/vscode/out'); - const TARGET = path.join(APP_ROOT, 'dist/static/vscode'); - - await util.promisify(cp.exec)(`rsync -a ${SOURCE}/ ${TARGET}`); - - chokidar.watch(SOURCE).on( - 'all', - debounce((_, path) => { - cp.exec(`rsync -a ${SOURCE}/ ${TARGET}`); - console.log(`sync ${path}`); - }, 300) - ); -}; - const autoSyncGitHub1sExtension = async () => { const SOURCE = path.join(APP_ROOT, 'extensions'); const TARGET = path.join(APP_ROOT, 'dist/static/extensions'); @@ -55,7 +40,6 @@ const autoSyncGitHub1sExtension = async () => { const main = () => { fs.ensureDirSync(path.join(APP_ROOT, 'dist/static')); - autoSyncVscodeOut(); autoSyncGitHub1sExtension(); }; diff --git a/tsconfig.json b/tsconfig.json index e5043f6b7..cbb5ab60d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,9 +12,9 @@ "target": "es2017", "paths": { "vs/*": [ - "./src/vs/*", - "./lib/vscode/src/vs/*" - ], + "./vscode-web-github1s/src/vs/*", + "./vscode-web-github1s/lib/vscode/src/vs/*" + ] }, "lib": [ "ES2015", diff --git a/vscode-web-github1s/README.md b/vscode-web-github1s/README.md new file mode 100644 index 000000000..d98042eb0 --- /dev/null +++ b/vscode-web-github1s/README.md @@ -0,0 +1,42 @@ +# @github1s/vscode-web + +This is the companion NPM package to support GitHub1s. The NPM package is [@github1s/vscode-web](https://www.npmjs.com/package/@github1s/vscode-web). + +## Commands + +`yarn clone` - clone the official VS Code repo. + +`yarn build` - build the VS Code with the custom code under `src`. + +`yarn watch` - watch the code change under `src` directory and rebuild VS Code. + +## Local development + +There are two ways to do local development with GitHub1s. For feature development, you could use the `yarn watch-with-vscode` under the root directory. + +To verify the NPM package content itself before publish. You need to install the [yalc](https://github.com/wclr/yalc) first (`yarn global add yalc`). + +Then run the following commands: + +```sh +cd github1s +yarn build:vscode # Build the VS Code +yarn yalc # Install local package via yalc + +yarn build # Build the GitHub1s & other extensions +yarn serve +``` + +And visit the http://localhost:5000 to verify the change. Please revert any changes related to `yalc` before commit, i.e. the `package.json`, the `.yalc/` and `yalc.lock` files. + +## Publish + +To publish the NPM package, please make sure you have the right access via https://www.npmjs.com/ and run the following commands: + +```sh +cd github1s +cd vscode-web-github1s +yarn build +# bump the `version` field in vscode-web-github1s/package.json file. +npm publish --access public +``` diff --git a/vscode-web-github1s/package.json b/vscode-web-github1s/package.json new file mode 100644 index 000000000..692b8100f --- /dev/null +++ b/vscode-web-github1s/package.json @@ -0,0 +1,43 @@ +{ + "name": "@github1s/vscode-web", + "version": "0.0.3", + "description": "VS Code web for GitHub1s", + "author": "github1s", + "license": "MIT", + "repository": "https://github.com/conwnet/github1s/issues/257", + "scripts": { + "clone": "./scripts/clone.sh", + "sync": "./scripts/sync-code.sh", + "build": "run-s clone sync build:vscode copy:*", + "build:vscode": "./scripts/build-vscode.sh", + "copy:vscode": "./scripts/copy-vscode.sh", + "copy:extension": "./scripts/copy-extensions.sh", + "watch": "run-s clone sync && run-p watch:*", + "watch:vscode": "cd lib/vscode && yarn watch", + "watch:src": "cd scripts/watch && node watch-src.js", + "watch:dist": "cd scripts/watch && node watch-dist.js" + }, + "private": false, + "files": [ + "/dist" + ], + "keywords": [ + "vscode", + "vscode-web", + "github1s" + ], + "dependencies": { + "iconv-lite-umd": "0.6.8", + "jschardet": "2.2.1", + "tas-client-umd": "0.1.2", + "vscode-oniguruma": "1.3.1", + "vscode-textmate": "5.2.0", + "xterm": "4.10.0-beta.4", + "xterm-addon-search": "0.8.0-beta.3", + "xterm-addon-unicode11": "0.3.0-beta.3", + "xterm-addon-webgl": "0.10.0-beta.1" + }, + "devDependencies": { + "npm-run-all": "^4.1.5" + } +} diff --git a/resources/builtin-extensions.json b/vscode-web-github1s/resources/builtin-extensions.json similarity index 100% rename from resources/builtin-extensions.json rename to vscode-web-github1s/resources/builtin-extensions.json diff --git a/resources/gulp-github1s.js b/vscode-web-github1s/resources/gulp-github1s.js similarity index 100% rename from resources/gulp-github1s.js rename to vscode-web-github1s/resources/gulp-github1s.js diff --git a/scripts/build/build-vscode.sh b/vscode-web-github1s/scripts/build-vscode.sh similarity index 90% rename from scripts/build/build-vscode.sh rename to vscode-web-github1s/scripts/build-vscode.sh index 113896ab1..94e5b9ff6 100755 --- a/scripts/build/build-vscode.sh +++ b/vscode-web-github1s/scripts/build-vscode.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash set -euo pipefail -cd "$(dirname "${0}")/../.." +cd "$(dirname "${0}")/.." APP_ROOT=$(pwd) +echo $APP_ROOT # build vscode source and vscode builtin extensions function main() { diff --git a/vscode-web-github1s/scripts/clone.sh b/vscode-web-github1s/scripts/clone.sh new file mode 100755 index 000000000..72ef4bbb2 --- /dev/null +++ b/vscode-web-github1s/scripts/clone.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "${0}")/.." +APP_ROOT=$(pwd) + +function main() { + # clone vscode and install dependencies + cd ${APP_ROOT} + if [ -d "lib/vscode" ]; then + echo "./lib/vscode already exists, skip clone." + exit 0 + fi + mkdir -p lib + cd lib + git clone --depth 1 -b 1.52.1 https://github.com/microsoft/vscode.git vscode + cd vscode + yarn --frozen-lockfile +} + +main "$@" diff --git a/vscode-web-github1s/scripts/copy-extensions.js b/vscode-web-github1s/scripts/copy-extensions.js new file mode 100755 index 000000000..496b936d8 --- /dev/null +++ b/vscode-web-github1s/scripts/copy-extensions.js @@ -0,0 +1,23 @@ +#!/usr/bin/env node + +const path = require('path'); +const fs = require('fs-extra'); + +const APP_ROOT = path.join(__dirname, '..'); +const TARGET_DIR = path.join(APP_ROOT, 'dist/extensions'); +const enableExtensions = + require(path.join(APP_ROOT, 'resources/builtin-extensions.json')) || []; + +const main = () => { + fs.ensureDirSync(TARGET_DIR); + + enableExtensions.forEach((extension) => { + fs.copySync( + path.join(APP_ROOT, 'lib/vscode', extension.path), + path.join(TARGET_DIR, path.basename(extension.path)), + { filter: (src) => !src.includes('node_modules') } + ); + }); +}; + +main(); diff --git a/vscode-web-github1s/scripts/copy-extensions.sh b/vscode-web-github1s/scripts/copy-extensions.sh new file mode 100755 index 000000000..5d13a4a0f --- /dev/null +++ b/vscode-web-github1s/scripts/copy-extensions.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "${0}")/.." +APP_ROOT=$(pwd) + +function ensureBuiltinExtensitions() { + cd "${APP_ROOT}/lib/vscode" + if [ ! -e "extensions/emmet/dist/browser" ] + then + echo "compile vscode builtin extensions..." + yarn gulp compile-web + fi +} + +function main() { + ensureBuiltinExtensitions + cd ${APP_ROOT} + mkdir -p "dist/extensions" + node scripts/copy-extensions.js + + echo "copy vscode builtin extensions done!" +} + +main "$@" diff --git a/scripts/package/copy-vscode.sh b/vscode-web-github1s/scripts/copy-vscode.sh similarity index 51% rename from scripts/package/copy-vscode.sh rename to vscode-web-github1s/scripts/copy-vscode.sh index 8086ad0c7..2d3b1c6e4 100755 --- a/scripts/package/copy-vscode.sh +++ b/vscode-web-github1s/scripts/copy-vscode.sh @@ -1,13 +1,14 @@ #!/usr/bin/env bash set -euo pipefail -cd "$(dirname "${0}")/../.." +cd "$(dirname "${0}")/.." APP_ROOT=$(pwd) function main() { cd ${APP_ROOT} - mkdir -p dist/static - rsync -a --del lib/vscode/out-vscode-min/ dist/static/vscode + TARGET="dist/vscode" + mkdir -p ${TARGET} + rsync -a --del lib/vscode/out-vscode-min/ "${TARGET}" echo "copy vscode done!" } diff --git a/scripts/build/sync-code.sh b/vscode-web-github1s/scripts/sync-code.sh similarity index 79% rename from scripts/build/sync-code.sh rename to vscode-web-github1s/scripts/sync-code.sh index 5a4e27b93..e1420f0d3 100755 --- a/scripts/build/sync-code.sh +++ b/vscode-web-github1s/scripts/sync-code.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash set -euo pipefail -cd "$(dirname "${0}")/../.." +cd "$(dirname "${0}")/.." APP_ROOT=$(pwd) +echo $APP_ROOT # sync src/* to vscode function main() { diff --git a/vscode-web-github1s/scripts/watch/watch-dist.js b/vscode-web-github1s/scripts/watch/watch-dist.js new file mode 100755 index 000000000..6f1698e25 --- /dev/null +++ b/vscode-web-github1s/scripts/watch/watch-dist.js @@ -0,0 +1,46 @@ +#!/usr/bin/env node + +const chokidar = require('chokidar'); +const path = require('path'); +const fs = require('fs-extra'); +const cp = require('child_process'); +const util = require('util'); + +const APP_ROOT = path.join(__dirname, '../../..'); + +const debounce = (func, delay) => { + let timer = null; + let lastResult = null; + return function () { + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(() => { + lastResult = func.apply(this, Array.prototype.slice.call(arguments, 0)); + }, delay); + return lastResult; + }; +}; + +const autoSyncVscodeOut = async () => { + const SOURCE = path.join(APP_ROOT, 'vscode-web-github1s/lib/vscode/out'); + const TARGET = path.join(APP_ROOT, 'dist/static/vscode'); + + await util.promisify(cp.exec)(`rsync -a ${SOURCE}/ ${TARGET}`); + + chokidar.watch(SOURCE).on( + 'all', + debounce((_, path) => { + cp.exec(`rsync -a ${SOURCE}/ ${TARGET}`); + console.log(`sync ${path}`); + }, 300) + ); +}; + +const main = () => { + fs.ensureDirSync(path.join(APP_ROOT, 'dist/static')); + + autoSyncVscodeOut(); +}; + +main(); diff --git a/scripts/watch/watch-src.js b/vscode-web-github1s/scripts/watch/watch-src.js similarity index 100% rename from scripts/watch/watch-src.js rename to vscode-web-github1s/scripts/watch/watch-src.js diff --git a/src/vs/base/common/platform.ts b/vscode-web-github1s/src/vs/base/common/platform.ts similarity index 100% rename from src/vs/base/common/platform.ts rename to vscode-web-github1s/src/vs/base/common/platform.ts diff --git a/src/vs/code/browser/workbench/workbench.ts b/vscode-web-github1s/src/vs/code/browser/workbench/workbench.ts similarity index 100% rename from src/vs/code/browser/workbench/workbench.ts rename to vscode-web-github1s/src/vs/code/browser/workbench/workbench.ts diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/vscode-web-github1s/src/vs/editor/browser/controller/textAreaHandler.ts similarity index 100% rename from src/vs/editor/browser/controller/textAreaHandler.ts rename to vscode-web-github1s/src/vs/editor/browser/controller/textAreaHandler.ts diff --git a/src/vs/github1s/notification.css b/vscode-web-github1s/src/vs/github1s/notification.css similarity index 100% rename from src/vs/github1s/notification.css rename to vscode-web-github1s/src/vs/github1s/notification.css diff --git a/src/vs/github1s/notification.ts b/vscode-web-github1s/src/vs/github1s/notification.ts similarity index 100% rename from src/vs/github1s/notification.ts rename to vscode-web-github1s/src/vs/github1s/notification.ts diff --git a/src/vs/github1s/util.ts b/vscode-web-github1s/src/vs/github1s/util.ts similarity index 100% rename from src/vs/github1s/util.ts rename to vscode-web-github1s/src/vs/github1s/util.ts diff --git a/src/vs/platform/product/common/product.ts b/vscode-web-github1s/src/vs/platform/product/common/product.ts similarity index 100% rename from src/vs/platform/product/common/product.ts rename to vscode-web-github1s/src/vs/platform/product/common/product.ts diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/vscode-web-github1s/src/vs/platform/telemetry/common/telemetryService.ts similarity index 100% rename from src/vs/platform/telemetry/common/telemetryService.ts rename to vscode-web-github1s/src/vs/platform/telemetry/common/telemetryService.ts diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts similarity index 100% rename from src/vs/workbench/browser/parts/activitybar/activitybarActions.ts rename to vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts similarity index 100% rename from src/vs/workbench/browser/parts/activitybar/activitybarPart.ts rename to vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts diff --git a/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css b/vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css similarity index 100% rename from src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css rename to vscode-web-github1s/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/vscode-web-github1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts similarity index 100% rename from src/vs/workbench/browser/parts/titlebar/titlebarPart.ts rename to vscode-web-github1s/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts diff --git a/src/vs/workbench/browser/web.main.ts b/vscode-web-github1s/src/vs/workbench/browser/web.main.ts similarity index 100% rename from src/vs/workbench/browser/web.main.ts rename to vscode-web-github1s/src/vs/workbench/browser/web.main.ts diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/vscode-web-github1s/src/vs/workbench/browser/workbench.contribution.ts similarity index 100% rename from src/vs/workbench/browser/workbench.contribution.ts rename to vscode-web-github1s/src/vs/workbench/browser/workbench.contribution.ts diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/vscode-web-github1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts similarity index 100% rename from src/vs/workbench/contrib/files/browser/views/explorerView.ts rename to vscode-web-github1s/src/vs/workbench/contrib/files/browser/views/explorerView.ts diff --git a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts b/vscode-web-github1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts similarity index 100% rename from src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts rename to vscode-web-github1s/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts diff --git a/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/vscode-web-github1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts similarity index 100% rename from src/vs/workbench/contrib/url/browser/trustedDomains.ts rename to vscode-web-github1s/src/vs/workbench/contrib/url/browser/trustedDomains.ts diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/vscode-web-github1s/src/vs/workbench/contrib/webview/browser/pre/main.js similarity index 100% rename from src/vs/workbench/contrib/webview/browser/pre/main.js rename to vscode-web-github1s/src/vs/workbench/contrib/webview/browser/pre/main.js diff --git a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts b/vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts rename to vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts b/vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts rename to vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css b/vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css similarity index 100% rename from src/vs/workbench/contrib/welcome/page/browser/welcomePage.css rename to vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.css diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts rename to vscode-web-github1s/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/vscode-web-github1s/src/vs/workbench/services/themes/browser/workbenchThemeService.ts similarity index 100% rename from src/vs/workbench/services/themes/browser/workbenchThemeService.ts rename to vscode-web-github1s/src/vs/workbench/services/themes/browser/workbenchThemeService.ts diff --git a/src/vs/workbench/services/themes/common/themeConfiguration.ts b/vscode-web-github1s/src/vs/workbench/services/themes/common/themeConfiguration.ts similarity index 100% rename from src/vs/workbench/services/themes/common/themeConfiguration.ts rename to vscode-web-github1s/src/vs/workbench/services/themes/common/themeConfiguration.ts diff --git a/vscode-web-github1s/yarn.lock b/vscode-web-github1s/yarn.lock new file mode 100644 index 000000000..0a65a34fa --- /dev/null +++ b/vscode-web-github1s/yarn.lock @@ -0,0 +1,528 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/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" + supports-color "^5.3.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +graceful-fs@^4.1.2: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +iconv-lite-umd@0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0" + integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +resolve@^1.10.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +string.prototype.padend@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311" + integrity sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tas-client-umd@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tas-client-umd/-/tas-client-umd-0.1.2.tgz#fe93ae085f65424292ac79feff4f1add3e50e624" + integrity sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg== + +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vscode-oniguruma@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz#e2383879c3485b19f533ec34efea9d7a2b14be8f" + integrity sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +xterm-addon-search@0.8.0-beta.3: + version "0.8.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz#c6c7e36a03706bd43d8bba383511acf9e435aed0" + integrity sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w== + +xterm-addon-unicode11@0.3.0-beta.3: + version "0.3.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz#70af2dfb67809258edb62c19e2861f7ce5ccf5cd" + integrity sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw== + +xterm-addon-webgl@0.10.0-beta.1: + version "0.10.0-beta.1" + resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz#e0bf964945a9aa8fc18318ddbd32e56ec99c219e" + integrity sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q== + +xterm@4.10.0-beta.4: + version "4.10.0-beta.4" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.10.0-beta.4.tgz#95efce7a40ec582101ec9777f4ccc6e68e95185e" + integrity sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA== diff --git a/yarn.lock b/yarn.lock index e21087032..a4f2fdcf5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,6 +39,21 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@github1s/vscode-web@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@github1s/vscode-web/-/vscode-web-0.0.3.tgz#ce4c8d89633f0c6ef28dc67ff173d962c4ed64a9" + integrity sha512-RKAnVWmzhgxu0n68oK1hcLUAYLhzqAthnki2BBVG1bNb8W5wk9xDLTcvsdn6PSbrHq8nzQmWO8PeVgoX6Xmz8A== + dependencies: + iconv-lite-umd "0.6.8" + jschardet "2.2.1" + tas-client-umd "0.1.2" + vscode-oniguruma "1.3.1" + vscode-textmate "5.2.0" + xterm "4.10.0-beta.4" + xterm-addon-search "0.8.0-beta.3" + xterm-addon-unicode11 "0.3.0-beta.3" + xterm-addon-webgl "0.10.0-beta.1" + "@hapi/hoek@^9.0.0": version "9.1.1" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" @@ -380,6 +395,15 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -479,6 +503,11 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -553,6 +582,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -838,6 +872,15 @@ from@~0: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= +fs-extra@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -868,6 +911,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -896,7 +944,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -983,12 +1031,24 @@ husky@^5.0.9: resolved "https://registry.yarnpkg.com/husky/-/husky-5.0.9.tgz#6d38706643d66ed395bcd4ee952d02e3f15eb3a3" integrity sha512-0SjcaY21a+IRdx7p7r/X33Vc09UR2m8SbP8yfkhUX2/jAmwcz+GR7i9jXkp2pP3GfX23JhMkVP6SWwXB18uXtg== +iconv-lite-umd@0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0" + integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A== + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4: +ignore@^5.0.4, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -1024,6 +1084,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1139,6 +1204,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jschardet@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-2.2.1.tgz#03b0264669a90c7a5c436a68c5a7d4e4cb0c9823" + integrity sha512-Ks2JNuUJoc7PGaZ7bVFtSEvOcr0rBq6Q1J5/7+zKWLT+g+4zziL63O0jg7y2jxhzIa1LVsHUbPXrbaWmz9iwDw== + jsdoctypeparser@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26" @@ -1169,6 +1239,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -1358,6 +1435,27 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.4.1: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" @@ -1612,6 +1710,11 @@ regextras@^0.7.1: resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -1907,6 +2010,11 @@ table@^6.0.4: slice-ansi "^4.0.0" string-width "^4.2.0" +tas-client-umd@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tas-client-umd/-/tas-client-umd-0.1.2.tgz#fe93ae085f65424292ac79feff4f1add3e50e624" + integrity sha512-rT9BdDCejckqOTQL2ShX67QtTiAUGbmPm5ZTC8giXobBvZC6JuvBVy5G32hoGZ3Q0dpTvMfgpf3iVFNN2F7wzg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -1958,6 +2066,11 @@ typescript@^4.1.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -1983,6 +2096,16 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vscode-oniguruma@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.3.1.tgz#e2383879c3485b19f533ec34efea9d7a2b14be8f" + integrity sha512-gz6ZBofA7UXafVA+m2Yt2zHKgXC2qedArprIsHAPKByTkwq9l5y/izAGckqxYml7mSbYxTRTfdRwsFq3cwF4LQ== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + wait-on@5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" @@ -2036,6 +2159,45 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +xterm-addon-search@0.8.0-beta.3: + version "0.8.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.8.0-beta.3.tgz#c6c7e36a03706bd43d8bba383511acf9e435aed0" + integrity sha512-EZP97KJIJ4KGQaOPYiiOaRRJst6LOgeEFoQL46WcBl5EWH9pH8qfrv0BHAJ8+6nBV2B9u5M6rzxO1GvLLec19w== + +xterm-addon-unicode11@0.3.0-beta.3: + version "0.3.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.3.0-beta.3.tgz#70af2dfb67809258edb62c19e2861f7ce5ccf5cd" + integrity sha512-vaYopnOjn19wCLDCyIWPWLwKR7CvLPxB5YZ3CAxt9qL05o3symxIJJJC0DuCa4GaGKVjNc7EmjRCs5bsJ2O1tw== + +xterm-addon-webgl@0.10.0-beta.1: + version "0.10.0-beta.1" + resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.10.0-beta.1.tgz#e0bf964945a9aa8fc18318ddbd32e56ec99c219e" + integrity sha512-XNZMrmiyFaz3XiPq+LqF0qn2QHpUEwuk+cG53JwpJHnWo3dd2jxoIgHFQUcrnvHIVPZMbTKySIwLCCC9uQVl7Q== + +xterm@4.10.0-beta.4: + version "4.10.0-beta.4" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.10.0-beta.4.tgz#95efce7a40ec582101ec9777f4ccc6e68e95185e" + integrity sha512-q/yRy2nn4mp1jWZe218TJwlKjXCIr6h28Kw0JMB+lcTeU+MebZ3TrHqlrNVnB+UJfFDOpkw0qfKYfRoV8G/hXA== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yalc@^1.0.0-pre.50: + version "1.0.0-pre.50" + resolved "https://registry.yarnpkg.com/yalc/-/yalc-1.0.0-pre.50.tgz#e654e5af5f739cf255eedad1d66ba05a17de78f9" + integrity sha512-HGFjFFUhXSpQcxyOwJQl3jhERMn7XBgSCCoJ1k3dDPMbH6n56onv6Cp6cDGMiTho8tLIF4x02/Kb4g6pHavzgA== + dependencies: + chalk "^4.1.0" + detect-indent "^6.0.0" + fs-extra "^8.0.1" + glob "^7.1.4" + ignore "^5.0.4" + ini "^2.0.0" + npm-packlist "^1.4.1" + yargs "^16.1.1" + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -2045,3 +2207,21 @@ yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2"