diff --git a/.eslintignore b/.eslintignore index 2c1ef701c..b54c3b8df 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,4 @@ **/spec/fixtures/**/*.js node_modules /vendor/ -/out/ \ No newline at end of file +/out/ diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md deleted file mode 100644 index 5b85299a6..000000000 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - - - -## Summary - -One paragraph explanation of the feature. - -## Motivation - -Why are we doing this? What use cases does it support? What is the expected outcome? - -## Describe alternatives you've considered - -A clear and concise description of the alternative solutions you've considered. Be sure to explain why Atom's existing customizability isn't suitable for this feature. - -## Additional context - -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 293c66c18..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - - - -### Prerequisites - -* [ ] Put an X between the brackets on this line if you have done all of the following: - * Reproduced the problem in Safe Mode: https://flight-manual.atom.io/hacking-atom/sections/debugging/#using-safe-mode - * Followed all applicable steps in the debugging guide: https://flight-manual.atom.io/hacking-atom/sections/debugging/ - * Checked the FAQs on the message board for common solutions: https://discuss.atom.io/c/faq - * Checked that your issue isn't already filed: https://github.com/issues?utf8=✓&q=is%3Aissue+user%3Aatom - * Checked that there is not already an Atom package that provides the described functionality: https://atom.io/packages - -### Description - -[Description of the issue] - -### Steps to Reproduce - -1. [First Step] -2. [Second Step] -3. [and so on...] - -**Expected behavior:** [What you expect to happen] - -**Actual behavior:** [What actually happens] - -**Reproduces how often:** [What percentage of the time does it reproduce?] - -### Versions - -You can get this information from copy and pasting the output of `atom --version` and `apm --version` from the command line. Also, please include the OS and what version of the OS you're running. - -### Additional Information - -Any additional information, configuration or data that might be necessary to reproduce the issue. diff --git a/.github/PULL_REQUEST_TEMPLATE/bug_fix.md b/.github/PULL_REQUEST_TEMPLATE/bug_fix.md deleted file mode 100644 index e6a293012..000000000 --- a/.github/PULL_REQUEST_TEMPLATE/bug_fix.md +++ /dev/null @@ -1,59 +0,0 @@ -### Requirements for Contributing a Bug Fix - -* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. -* The pull request must only fix an existing bug. To contribute other changes, you must use a different template. You can see all templates at https://github.com/atom/atom/tree/master/.github/PULL_REQUEST_TEMPLATE. -* The pull request must update the test suite to demonstrate the changed functionality. For guidance, please see https://flight-manual.atom.io/hacking-atom/sections/writing-specs/. -* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/atom/atom/tree/master/CONTRIBUTING.md#pull-requests. - -### Identify the Bug - - - -### Description of the Change - - - -### Alternate Designs - - - -### Possible Drawbacks - - - -### Verification Process - - - -### Release Notes - - diff --git a/.github/PULL_REQUEST_TEMPLATE/documentation.md b/.github/PULL_REQUEST_TEMPLATE/documentation.md deleted file mode 100644 index 3fc1e4072..000000000 --- a/.github/PULL_REQUEST_TEMPLATE/documentation.md +++ /dev/null @@ -1,30 +0,0 @@ -### Requirements for Contributing Documentation - -* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. -* The pull request must only contribute documentation (for example, markdown files or API docs). To contribute other changes, you must use a different template. You can see all templates at https://github.com/atom/atom/tree/master/.github/PULL_REQUEST_TEMPLATE. - -### Description of the Change - - - -### Release Notes - - diff --git a/.github/PULL_REQUEST_TEMPLATE/feature_change.md b/.github/PULL_REQUEST_TEMPLATE/feature_change.md deleted file mode 100644 index cc6ed68af..000000000 --- a/.github/PULL_REQUEST_TEMPLATE/feature_change.md +++ /dev/null @@ -1,70 +0,0 @@ -### Requirements for Adding, Changing, or Removing a Feature - -* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. -* The pull request must contribute a change that has been endorsed by the maintainer team. See details in the template below. -* The pull request must update the test suite to exercise the updated functionality. For guidance, please see https://flight-manual.atom.io/hacking-atom/sections/writing-specs/. -* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/atom/atom/tree/master/CONTRIBUTING.md#pull-requests. - -### Issue or RFC Endorsed by Atom's Maintainers - - - -### Description of the Change - - - -### Alternate Designs - - - -### Possible Drawbacks - - - -### Verification Process - - - -### Release Notes - - diff --git a/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md b/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md deleted file mode 100644 index f75f5fb28..000000000 --- a/.github/PULL_REQUEST_TEMPLATE/performance_improvement.md +++ /dev/null @@ -1,55 +0,0 @@ -### Requirements for Contributing a Performance Improvement - -* Fill out the template below. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. -* The pull request must only affect performance of existing functionality. To contribute other changes, you must use a different template. You can see all templates at https://github.com/atom/atom/tree/master/.github/PULL_REQUEST_TEMPLATE. -* After you create the pull request, all status checks must be pass before a maintainer reviews your contribution. For more details, please see https://github.com/atom/atom/tree/master/CONTRIBUTING.md#pull-requests. - -### Description of the Change - - - -### Quantitative Performance Benefits - - - -### Possible Drawbacks - - - -### Verification Process - - - -### Applicable Issues - - - -### Release Notes - - diff --git a/.github/lock.yml b/.github/lock.yml index 39319ee90..ba43e69a4 100644 --- a/.github/lock.yml +++ b/.github/lock.yml @@ -8,7 +8,7 @@ lockComment: > any recent activity after it was closed. If you can still reproduce this issue in [Safe Mode](https://flight-manual.atom.io/hacking-atom/sections/debugging/#using-safe-mode) then please open a new issue and fill out - [the entire issue template](https://github.com/atom/atom/blob/master/ISSUE_TEMPLATE.md) + [the entire issue template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/bug_report.md) to ensure that we have enough information to address your issue. Thanks! # Issues or pull requests with these labels will not be locked exemptLabels: diff --git a/.gitignore b/.gitignore index ae3a28e59..5457617c5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ Thumbs.db .project .svn .nvm-version +.vscode node_modules npm-debug.log debug.log diff --git a/.travis.yml b/.travis.yml index f32e2721c..2d4fd2d1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,25 +1,25 @@ language: python python: - - "2.7.13" + - '2.7.13' git: depth: 10 branches: only: - - master - - /^[0-9.]+-releases$/ - - /.*-test-travis$/ + - master + - /^[0-9.]+-releases$/ + - /.*-test-travis$/ matrix: include: - os: linux dist: trusty - env: NODE_VERSION=8.9.3 DISPLAY=:99.0 CC=clang CXX=clang++ npm_config_clang=1 ATOM_JASMINE_REPORTER=list + env: NODE_VERSION=10.2.1 DISPLAY=:99.0 CC=clang CXX=clang++ npm_config_clang=1 ATOM_JASMINE_REPORTER=list before_install: - - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16" + - '/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16' install: - git clone https://github.com/creationix/nvm.git /tmp/.nvm @@ -57,11 +57,11 @@ addons: target_paths: travis-artifacts/$TRAVIS_BUILD_ID apt: packages: - - build-essential - - clang-3.3 - - fakeroot - - git - - libsecret-1-dev - - rpm - - libx11-dev - - libxkbfile-dev + - build-essential + - clang-3.3 + - fakeroot + - git + - libsecret-1-dev + - rpm + - libx11-dev + - libxkbfile-dev diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d57e61ab1..83b59fcb5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -113,7 +113,7 @@ When we make a significant decision in how we maintain the project and what we c This section guides you through submitting a bug report for Atom. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. -Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE.md), the information it asks for helps us resolve issues faster. +Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/bug_report.md), the information it asks for helps us resolve issues faster. > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. @@ -126,7 +126,7 @@ Before creating bug reports, please check [this list](#before-submitting-a-bug-r #### How Do I Submit A (Good) Bug Report? -Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you've determined [which repository](#atom-and-packages) your bug is related to, create an issue on that repository and provide the following information by filling in [the template](ISSUE_TEMPLATE.md). +Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you've determined [which repository](#atom-and-packages) your bug is related to, create an issue on that repository and provide the following information by filling in [the template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/bug_report.md). Explain the problem and include additional details to help maintainers reproduce the problem: @@ -163,7 +163,7 @@ Include details about your configuration and environment: This section guides you through submitting an enhancement suggestion for Atom, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion :pencil: and find related suggestions :mag_right:. -Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](ISSUE_TEMPLATE.md), including the steps that you imagine you would take if the feature you're requesting existed. +Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](https://github.com/atom/.github/blob/master/.github/ISSUE_TEMPLATE/feature_request.md), including the steps that you imagine you would take if the feature you're requesting existed. #### Before Submitting An Enhancement Suggestion diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index cf1773856..000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,40 +0,0 @@ - - -### Prerequisites - -* [ ] Put an X between the brackets on this line if you have done all of the following: - * Reproduced the problem in Safe Mode: https://flight-manual.atom.io/hacking-atom/sections/debugging/#using-safe-mode - * Followed all applicable steps in the debugging guide: https://flight-manual.atom.io/hacking-atom/sections/debugging/ - * Checked the FAQs on the message board for common solutions: https://discuss.atom.io/c/faq - * Checked that your issue isn't already filed: https://github.com/issues?utf8=✓&q=is%3Aissue+user%3Aatom - * Checked that there is not already an Atom package that provides the described functionality: https://atom.io/packages - -### Description - -[Description of the issue] - -### Steps to Reproduce - -1. [First Step] -2. [Second Step] -3. [and so on...] - -**Expected behavior:** [What you expect to happen] - -**Actual behavior:** [What actually happens] - -**Reproduces how often:** [What percentage of the time does it reproduce?] - -### Versions - -You can get this information from copy and pasting the output of `atom --version` and `apm --version` from the command line. Also, please include the OS and what version of the OS you're running. - -### Additional Information - -Any additional information, configuration or data that might be necessary to reproduce the issue. diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 7414fa3b1..cdf247b79 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,10 +1,10 @@ ⚛👋 Hello there! Welcome. Please follow the steps below to tell us about your contribution. 1. Copy the correct template for your contribution - - 🐛 Are you fixing a bug? Copy the template from https://bit.ly/atom-bugfix - - 📈 Are you improving performance? Copy the template from https://bit.ly/atom-perf - - 📝 Are you updating documentation? Copy the template from https://bit.ly/atom-docs - - 💻 Are you changing functionality? Copy the template from https://bit.ly/atom-behavior + - 🐛 Are you fixing a bug? Copy the template from + - 📈 Are you improving performance? Copy the template from + - 📝 Are you updating documentation? Copy the template from + - 💻 Are you changing functionality? Copy the template from 2. Replace this text with the contents of the template 3. Fill in all sections of the template 4. Click "Create pull request" diff --git a/README.md b/README.md index 4fa635259..f3ffb0ebb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Atom -[![Build status](https://dev.azure.com/github/Atom/_apis/build/status/Atom%20Production%20Branches?branchName=master)](https://dev.azure.com/github/Atom/_build/latest?definitionId=32&branchName=master) [![Linux Build Status](https://travis-ci.org/atom/atom.svg?branch=master)](https://travis-ci.org/atom/atom) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/1tkktwh654w07eim?svg=true)](https://ci.appveyor.com/project/Atom/atom) +[![Build status](https://dev.azure.com/github/Atom/_apis/build/status/Atom%20Production%20Branches?branchName=master)](https://dev.azure.com/github/Atom/_build/latest?definitionId=32&branchName=master) [![Linux Build Status](https://travis-ci.org/atom/atom.svg?branch=master)](https://travis-ci.org/atom/atom) [![Dependency Status](https://david-dm.org/atom/atom.svg)](https://david-dm.org/atom/atom) [![Join the Atom Community on Slack](https://atom-slack.herokuapp.com/badge.svg)](https://atom-slack.herokuapp.com) diff --git a/apm/package-lock.json b/apm/package-lock.json index e4a1cd064..c21d2488a 100644 --- a/apm/package-lock.json +++ b/apm/package-lock.json @@ -4,9 +4,9 @@ "lockfileVersion": 1, "dependencies": { "atom-package-manager": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/atom-package-manager/-/atom-package-manager-2.2.4.tgz", - "integrity": "sha512-Iyfs8FNPH+fDLm2DlzE+71TGGZt0fAO2fchJKUHbMLqxFPBPjOgigViQZxDhb2eBRYi2jLKkbalCa4m21Q8CRA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/atom-package-manager/-/atom-package-manager-2.3.1.tgz", + "integrity": "sha512-CAys5szBJbqhkizMm32o0+uOTpT9rgPh9TdFX0R//usjOAgDr8iJ7oGNfULPvJzaKnBhrokuniKNumAxVyuauA==", "requires": { "@atom/plist": "0.4.4", "asar-require": "0.3.0", @@ -834,19 +834,12 @@ } }, "keytar": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.7.0.tgz", - "integrity": "sha512-0hLlRRkhdR0068fVQo21hnIndGvacsh9PtAHGAPMPzxFjJwP8idAkVAcbdb1P5B+gterCBa3+4hxL0NPMDlZtw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-4.9.0.tgz", + "integrity": "sha512-5aKEpnxRWUIhSlRXckqTxomqokV1/tOBe3EdbCDyMjDaoa5AkVHVa1yK+fa2CgJR5MadbJndFWmcDMCq812F4A==", "requires": { - "nan": "2.13.2", + "nan": "2.14.0", "prebuild-install": "5.3.0" - }, - "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" - } } }, "klaw": { @@ -3876,9 +3869,9 @@ } }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==" }, "pump": { "version": "2.0.1", diff --git a/apm/package.json b/apm/package.json index 4e6b47e9c..8b8da2214 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "2.2.4" + "atom-package-manager": "2.3.1" } } diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 5ca67c824..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,95 +0,0 @@ -image: Visual Studio 2015 - -version: "{build}" - -skip_tags: true -clone_folder: c:\projects\atom -clone_depth: 10 - -branches: - only: - - master - - /^[0-9.]+-releases$/ - - /^electron-[0-9.]+$/ - -platform: - - x64 - - x86 - -environment: - global: - ATOM_DEV_RESOURCE_PATH: c:\projects\atom - ATOM_JASMINE_REPORTER: list - CI: true - NODE_VERSION: 8.9.3 - - matrix: - - TASK: test - - TASK: installer - -matrix: - fast_finish: true - exclude: - - platform: x86 - TASK: test - -install: - - SET PATH=C:\Program Files\Atom\resources\cli;%PATH% - - ps: Install-Product node $env:NODE_VERSION $env:PLATFORM - - npm install --global npm@6.2.0 - -build_script: - - CD %APPVEYOR_BUILD_FOLDER% - - IF NOT EXIST C:\tmp MKDIR C:\tmp - - SET SQUIRREL_TEMP=C:\tmp - - IF [%APPVEYOR_REPO_BRANCH:~-9%]==[-releases] IF NOT DEFINED APPVEYOR_PULL_REQUEST_NUMBER SET IS_RELEASE_BRANCH=true - - IF [%APPVEYOR_REPO_BRANCH%]==[master] IF NOT DEFINED APPVEYOR_PULL_REQUEST_NUMBER SET IS_SIGNED_ZIP_BRANCH=true - - IF [%APPVEYOR_REPO_BRANCH:~0,9%]==[electron-] IF NOT DEFINED APPVEYOR_PULL_REQUEST_NUMBER SET IS_SIGNED_ZIP_BRANCH=true - - IF [%TASK%]==[installer] ( - IF [%IS_RELEASE_BRANCH%]==[true] ( - ECHO Building on release branch - Creating production artifacts && - script\build.cmd --code-sign --compress-artifacts --create-windows-installer - ) ELSE ( - IF [%IS_SIGNED_ZIP_BRANCH%]==[true] ( - ECHO Building on %APPVEYOR_REPO_BRANCH% branch - Creating signed zips && - script\build.cmd --code-sign --compress-artifacts - ) ELSE ( - ECHO Skipping installer build for non-release/non-master branch - ) - ) - ) ELSE ( - ECHO Test build only - Not creating artifacts && - script\build.cmd - ) - -test_script: - - IF [%TASK%]==[test] ( - script\lint.cmd && - script\test.cmd - ) ELSE ( - ECHO Skipping tests on installer build matrix row - ) - -deploy: off -artifacts: - - path: out\AtomSetup.exe - name: AtomSetup.exe - - path: out\atom-windows.zip - name: atom-windows.zip - - path: out\RELEASES - name: RELEASES - - path: out\AtomSetup-x64.exe - name: AtomSetup-x64.exe - - path: out\atom-x64-windows.zip - name: atom-x64-windows.zip - - path: out\RELEASES-x64 - name: RELEASES-x64 - - path: out\atom-*-delta.nupkg - name: atom-delta.nupkg - - path: out\atom-*-full.nupkg - name: atom-full.nupkg - -cache: - - '%APPVEYOR_BUILD_FOLDER%\electron' - - '%USERPROFILE%\.atom\.apm' - - '%USERPROFILE%\.atom\compile-cache' diff --git a/docs/build-instructions/build-status.md b/docs/build-instructions/build-status.md index a6f7fdfd6..2dc9d3b02 100644 --- a/docs/build-instructions/build-status.md +++ b/docs/build-instructions/build-status.md @@ -2,7 +2,7 @@ | System | Travis | AppVeyor/Win | VSTS | Dependencies | |--------|--------|--------------|------------|--------------| -| [Atom](https://github.com/atom/atom) | [![Travis Build Status](https://travis-ci.org/atom/atom.svg?branch=master)](https://travis-ci.org/atom/atom) | [![AppVeyor/Wi Build Status](https://ci.appveyor.com/api/projects/status/1tkktwh654w07eim?svg=true)](https://ci.appveyor.com/project/Atom/atom) | [![Build status](https://github.visualstudio.com/Atom/_apis/build/status/Atom%20Production%20Branches?branch=master)](https://github.visualstudio.com/Atom/_build/latest?definitionId=32&branch=master) | [![Dependency Status](https://david-dm.org/atom/atom.svg)](https://david-dm.org/atom/atom) | +| [Atom](https://github.com/atom/atom) | [![Travis Build Status](https://travis-ci.org/atom/atom.svg?branch=master)](https://travis-ci.org/atom/atom) | | [![Build status](https://github.visualstudio.com/Atom/_apis/build/status/Atom%20Production%20Branches?branch=master)](https://github.visualstudio.com/Atom/_build/latest?definitionId=32&branch=master) | [![Dependency Status](https://david-dm.org/atom/atom.svg)](https://david-dm.org/atom/atom) | | [APM](https://github.com/atom/apm) | [![Travis Build Status](https://travis-ci.org/atom/apm.svg?branch=master)](https://travis-ci.org/atom/apm) | [![AppVeyor/Wi Build Status](https://ci.appveyor.com/api/projects/status/j6ixw374a397ugkb/branch/master?svg=true)](https://ci.appveyor.com/project/Atom/apm/branch/master) | | [![Dependency Status](https://david-dm.org/atom/apm.svg)](https://david-dm.org/atom/apm) | | [Electron](https://github.com/electron/electron) | [![Travis Build Status](https://travis-ci.org/electron/electron.svg?branch=master)](https://travis-ci.org/electron/electron) | [![AppVeyor/Wi Build Status](https://ci.appveyor.com/api/projects/status/kvxe4byi7jcxbe26/branch/master?svg=true)](https://ci.appveyor.com/project/Atom/electron) | | [![Dependency Status](https://david-dm.org/electron/electron/dev-status.svg)](https://david-dm.org/electron/electron) diff --git a/package-lock.json b/package-lock.json index 046cf99f6..63f01e405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "atom", - "version": "1.39.0-dev", + "version": "1.40.0-dev", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -29,24 +29,12 @@ } }, "@atom/nsfw": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/@atom/nsfw/-/nsfw-1.0.23.tgz", - "integrity": "sha512-mo6G3eYzQzmdUWjCHO/2a4dWPPYYOZjAXjA4QtLGVXlnTMn08gC7JUEuztjAld1Qk+MYyV613O3ACj8xZ4KEog==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@atom/nsfw/-/nsfw-1.0.25.tgz", + "integrity": "sha512-V7g509EVRCCkzoQW/QA7lQsROrjsfYYEJRHzEuc6+PAH88Z4oAs7D3W8MOJrBPo+6e06gxEwfxZjIq7BQbpfwQ==", "requires": { "fs-extra": "^7.0.0", "nan": "^2.10.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@atom/source-map-support": { @@ -68,16 +56,6 @@ "prebuild-install": "5.2.4" }, "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", @@ -1088,9 +1066,9 @@ } }, "@types/node": { - "version": "11.13.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.7.tgz", - "integrity": "sha512-suFHr6hcA9mp8vFrZTgrmqW2ZU3mbWsryQtQlY/QvwTISCw7nw/j+bCQPPohqmskhmqa5wLNuMHTTsc+xf1MQg==" + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.7.tgz", + "integrity": "sha512-1YKeT4JitGgE4SOzyB9eMwO0nGVNkNEsm9qlIt1Lqm/tG2QEiSMTD4kS3aO6L+w5SClLVxALmIBESK6Mk5wX0A==" }, "CSSselect": { "version": "0.4.1", @@ -1358,8 +1336,8 @@ "integrity": "sha512-AHEZOz7RcIdPWlGQByHGUE9yVhn1O9qJQRHehvkN8riiUyJpNpaImk7dloH8Nw/JX14tKJhjT+EadY2u/+j7IQ==" }, "autocomplete-plus": { - "version": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.0/tarball", - "integrity": "sha512-6DvqS4z8JR8kLLPKImGX5pZlc67SWr6JUpIJAH++gYmWZDu5kshqvsDnnuWjRtA1tCZpNW4e/mN/hQcHyuuOVA==", + "version": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.3/tarball", + "integrity": "sha512-/5Ou9lH8Yc7F7Hfl7UDu8zpVZCEYfYCGs0FxR+Z6+yS0O5k7TfYoJE74KgHHhW3vGAgDPph8/JIPptc5/a1YbQ==", "requires": { "atom-slick": "^2.0.0", "dompurify": "^1.0.8", @@ -1374,9 +1352,9 @@ }, "dependencies": { "dompurify": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-1.0.8.tgz", - "integrity": "sha512-vetRFbN1SXSPfP3ClIiYnxTrXquSqakBEOoB5JESn0SVcSYzpu6ougjakpKnskGctYdlNpwf+riUHSkG7d4XUw==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-1.0.10.tgz", + "integrity": "sha512-huhl3DSWX5LaA7jDtnj3XQdJgWW1wYouNW7N0drGzQa4vEUSVWyeFN+Atx6HP4r5cang6oQytMom6I4yhGJj5g==" }, "grim": { "version": "2.0.2", @@ -1387,9 +1365,9 @@ } }, "marked": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.1.tgz", - "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==" } } }, @@ -1715,8 +1693,8 @@ } }, "bracket-matcher": { - "version": "https://www.atom.io/api/packages/bracket-matcher/versions/0.91.0/tarball", - "integrity": "sha512-bgAsyS23bu3Y9LqRul4/IjOIqUZxpnIZGBEaxBHGcC5vW/ZHCr3SYsPsN2hLXwTHvXArwgcBt1Uylc0tz25FSQ==", + "version": "https://www.atom.io/api/packages/bracket-matcher/versions/0.91.1/tarball", + "integrity": "sha512-aBbNNVfEAzzNu71ZZ4+P9Y0AxBUB74wseVF/Mu88wCrOQq889IHdiW+wzayfli0F6MXNH1wIh/zYPeZHzvU/MQ==", "requires": { "first-mate": "^7.0.1", "underscore-plus": "1.x" @@ -1727,11 +1705,6 @@ "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=" }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" - }, "browserslist": { "version": "4.5.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.6.tgz", @@ -2481,11 +2454,6 @@ "humanize-plus": "^1.8.1" } }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" - }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -2873,8 +2841,8 @@ } }, "find-and-replace": { - "version": "https://www.atom.io/api/packages/find-and-replace/versions/0.218.11/tarball", - "integrity": "sha512-STNDeRCSXCV5YjfrWbS5X4TfOFnNX7Z1k96POk3uPoPN8aQvkAIUflT7h6p0MClR9E2/I2O7nYKbYzNqBflZ6Q==", + "version": "https://www.atom.io/api/packages/find-and-replace/versions/0.218.14/tarball", + "integrity": "sha512-ceaKDpLAyUmebe0q5aJ9vsiz3bZK8BAR9zDJwo3vl7Lb/GfK1QYrh8UllapOfltGdqCB59sKfAW/c3GBOzvrpA==", "requires": { "binary-search": "^1.3.3", "element-resize-detector": "^1.1.10", @@ -2911,15 +2879,15 @@ "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=" }, "first-mate": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/first-mate/-/first-mate-7.3.0.tgz", - "integrity": "sha512-fFtMzSR3cw90LAWhuzaCbxpfGXNCQsROi+KLL1HXatog/ivfLNTZEWjB+lxmH9mdUUqJn6LGitu6P9w9SvePjQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/first-mate/-/first-mate-7.4.0.tgz", + "integrity": "sha512-LCkK0ZkcHpdlKMyIKPib3/e5Uj7Mqw5XU8FSE1Of5x3RQx8YRdXr8ElRqNS0aCgOSjgpgnubek3VoapxAcWh+g==", "requires": { "emissary": "^1", "event-kit": "^2.2.0", "fs-plus": "^3.0.0", "grim": "^2.0.1", - "oniguruma": "7.1.0", + "oniguruma": "7.2.0", "season": "^6.0.2", "underscore-plus": "^1" }, @@ -2981,69 +2949,17 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, "fs-admin": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/fs-admin/-/fs-admin-0.1.7.tgz", - "integrity": "sha512-EQNioqUHgtnX9ErMiPuvHCAx0M1VSa9u4oxGF+EGVYBL15Mg5BxEzGBrTAYHUQDDobqw1Yc+6YqZWwSIIe+EwQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fs-admin/-/fs-admin-0.5.0.tgz", + "integrity": "sha512-jU0x86bI6wmhdGGcpaO1rI7EpNx/44cEXPsHqFIRgs9SVsk3HSWn9Zd5fd7bdDw3LcmdnazOcJFK9PZsoNecAA==", "requires": { - "mocha": "^3.5.0", - "nan": "^2.10.0" + "nan": "^2.13.2" }, "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "requires": { - "has-flag": "^1.0.0" - } + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" } } }, @@ -3053,9 +2969,9 @@ "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=" }, "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -3132,8 +3048,8 @@ "integrity": "sha1-gy9kifvodnaUWVmckUpnDsIpR+4=" }, "fuzzy-finder": { - "version": "https://www.atom.io/api/packages/fuzzy-finder/versions/1.13.5/tarball", - "integrity": "sha512-YGWs7O5f2H0An7wTKet9yst+EngKCMBMzI6E68UyM5qGs+1cEyOo4j5JEB3RtHpzsBDv+aYhT0C/WoXuOh+B/g==", + "version": "https://www.atom.io/api/packages/fuzzy-finder/versions/1.13.8/tarball", + "integrity": "sha512-uhBHzD0B42k4KQ+CktomP16nxH/0fxlM9of3r/1bEAAxK4i0+/4Z22Qmxv3qsawo+4DxFUc3P9KCTgjxZHTaBA==", "requires": { "@atom/fuzzy-native": "^1.0.3", "async": "0.2.6", @@ -3254,9 +3170,9 @@ } }, "git-utils": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/git-utils/-/git-utils-5.5.0.tgz", - "integrity": "sha512-4t3f2pU4HPgKOyTXyaEdMHTBwa24ubC4FykCXlqnsPgHlupSq66d0/aq0h92BgnyGwI3ogqx9D0a+Uw/jNckOg==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/git-utils/-/git-utils-5.6.1.tgz", + "integrity": "sha512-wDF7vSbH940NupuMFC87As0x/VSke51P7xTnkdSlk96YN3tzOagXzBUNq5Nq16KOVuMSxcGj1l3qHF5VXl39Ng==", "requires": { "fs-plus": "^3.0.0", "nan": "^2.0.0" @@ -3308,6 +3224,16 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", @@ -3359,11 +3285,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, "grammar-selector": { "version": "file:packages/grammar-selector", "requires": { @@ -3435,11 +3356,6 @@ "sntp": "1.x.x" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, "highlight.js": { "version": "9.12.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", @@ -3531,6 +3447,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "idb": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/idb/-/idb-4.0.3.tgz", + "integrity": "sha512-moRlNNe0Gsvp4jAwz5cJ7scjyNTVA/cESKGCobULaljfaKZ970y8NDNCseHdMY+YxNXH58Z1V+7tTyf0GZyKqw==" + }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -3847,11 +3768,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, "json5": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", @@ -3958,11 +3874,11 @@ } }, "language-c": { - "version": "https://www.atom.io/api/packages/language-c/versions/0.60.17/tarball", - "integrity": "sha512-jGu5Eo/QqqmMM1r62nYJhLdgop/pf4RUUK+udYyp0mOQpU3qPRT+9lVv14/9SDpwkiBB1DQSLJekhVobcD0McQ==", + "version": "https://www.atom.io/api/packages/language-c/versions/0.60.18/tarball", + "integrity": "sha512-q+oTv3QtnLGP8L3qIuWdOQ9XVKskVTsCp8hvURaSz9MGIIjKIK1ssO/r/gkCiBF/AWqaBuglYix4E6RmytHlVg==", "requires": { - "tree-sitter-c": "^0.13.13", - "tree-sitter-cpp": "^0.13.15" + "tree-sitter-c": "^0.15.0", + "tree-sitter-cpp": "^0.15.0" } }, "language-clojure": { @@ -3993,19 +3909,19 @@ "integrity": "sha512-xvsGO/d3/XsKJmwdAz9VGHo6t7A13VuJeuEoZaoLmvzwkVpFdpJcK8PNwVMPHav+lpNeu73qiXmqS+YIlvLwLQ==" }, "language-go": { - "version": "https://www.atom.io/api/packages/language-go/versions/0.47.0/tarball", - "integrity": "sha512-41lrL5fCPKJSxZ+GUkOemPcDSfme2E2KULuhJGnWLUun5vTrqevtkLgQGAnqH+M/D9zOqJH6H3Lc2kYPrLdUaA==", + "version": "https://www.atom.io/api/packages/language-go/versions/0.47.1/tarball", + "integrity": "sha512-SiySXDxMZ0nUvNCBAClB8sbil0VQi6MJq2ut+jNuNLKtXvO+PtuHxohtbfsSwSYeET0a8ylVahLv1lo0HBgUjw==", "requires": { - "tree-sitter-go": "^0.13.3" + "tree-sitter-go": "^0.15.0" } }, "language-html": { - "version": "https://www.atom.io/api/packages/language-html/versions/0.52.1/tarball", - "integrity": "sha512-39BmsxqzTJcb6u5bSqv/k/bigdZibbMm3BHascMuWHHl5swIQlJhYf+QPR3ozaojNK/aFbx4hj4zDolmlFEKlA==", + "version": "https://www.atom.io/api/packages/language-html/versions/0.52.3/tarball", + "integrity": "sha512-NcEU2LTS76VgnLJIc7sN8QGpiYqTmIPwB+jAv7Wg6kzbt7H0GGZwlUCtHqo7OUFnF9dc++BtDLNKUCNchnh6UA==", "requires": { "atom-grammar-test": "^0.6.3", - "tree-sitter-embedded-template": "^0.13.0", - "tree-sitter-html": "^0.13.2" + "tree-sitter-embedded-template": "^0.15.0", + "tree-sitter-html": "^0.15.0" } }, "language-hyperlink": { @@ -4017,19 +3933,19 @@ "integrity": "sha512-QXVHoj0eJDbl3pJK+Dm0+vnR1yRB80lSrvThwoVnnxsNphovsglXSGkhHoZ6RbEwkX9fEhtwOrhLUspT2NkG3A==" }, "language-javascript": { - "version": "https://www.atom.io/api/packages/language-javascript/versions/0.130.0/tarball", - "integrity": "sha512-PHuHeuHivsm8gYZR2FopxhBMIbapFFLdztyao7E9D/qDlayyTGHoGzBVPMBPXWCOh/JUnco8JArhOCAOv83Mng==", + "version": "https://www.atom.io/api/packages/language-javascript/versions/0.130.1/tarball", + "integrity": "sha512-KLz0V7EjpoYQxihWXYiNqFIdbZrOO4lMXg2K7ZA5y8/vb44reOQu1UnOwiC3f6kd1bPyJfv9zR2dUYoXVREy1Q==", "requires": { - "tree-sitter-javascript": "^0.13.10", - "tree-sitter-jsdoc": "^0.13.4", - "tree-sitter-regex": "^0.13.1" + "tree-sitter-javascript": "^0.15.0", + "tree-sitter-jsdoc": "^0.15.0", + "tree-sitter-regex": "^0.15.0" } }, "language-json": { - "version": "https://www.atom.io/api/packages/language-json/versions/1.0.2/tarball", - "integrity": "sha512-2OvmYoTjO5IXnnRMVMfPb7iOMEnqD36otbpOpQUELG4eJJqgrms6Hs7HnevFs5ZB4yLc1ZU2u9h9TAp/WXUmdA==", + "version": "https://www.atom.io/api/packages/language-json/versions/1.0.4/tarball", + "integrity": "sha512-NNFpsa8vNwB7W3iZp0oljMusKR+kGiqDlJNa31G6Z+rh+VNshv3cbih7oiQYXD6ZkaMtTJyFUBdQVOw9yiQiPw==", "requires": { - "tree-sitter-json": "git://github.com/tree-sitter/tree-sitter-json.git#337f55be9b9b1ccb0baa7763bfe014a94acea7ea" + "tree-sitter-json": "^0.14.0" } }, "language-less": { @@ -4061,18 +3977,18 @@ "integrity": "sha512-HD6HI41u57i0/Tu9catiriURhJsef0RDrzJDkGDtdFkE9F9KPxC9Fayq2JBLJrhIyADRVXFxwxsfwQ2Jmh6hxg==" }, "language-python": { - "version": "https://www.atom.io/api/packages/language-python/versions/0.53.2/tarball", - "integrity": "sha512-ACNHWQWlRUfWrOb5MTvjP2wMTFdAq8Wnd3tWXYEd/TcfECtmCGy+6h33dt9X6SmAZz6OGKQ7V8lnVbOlh3X+Fw==", + "version": "https://www.atom.io/api/packages/language-python/versions/0.53.3/tarball", + "integrity": "sha512-oZJ1WLqpdkpx8ca08jG6BmP/S6YNyu15Q0qMQKAle6ucbK0MagdmpaEcTP/1PkIIncCLaYa1Kdi15QZ+mCva8Q==", "requires": { "atom-grammar-test": "^0.6.4", - "tree-sitter-python": "^0.14.0" + "tree-sitter-python": "^0.15.0" } }, "language-ruby": { - "version": "https://www.atom.io/api/packages/language-ruby/versions/0.72.16/tarball", - "integrity": "sha512-7Ju9OP+fIo5qvFWFLuSR8KJe7wldZYI8m3ToBcds4v0+Q8i7+xNO2marC0JD72uEiK/x26xP9pYv/isSqTQ4dg==", + "version": "https://www.atom.io/api/packages/language-ruby/versions/0.72.17/tarball", + "integrity": "sha512-Yz+Kq06P07qz6KrC3I9vkMf60HjWTFGZBr8XTZOFs1AyLlHdxhXOnm67Rimlb4deCbGjzLda2JhqRkbUq6Y9FQ==", "requires": { - "tree-sitter-ruby": "^0.13.12" + "tree-sitter-ruby": "^0.15.0" } }, "language-ruby-on-rails": { @@ -4082,7 +3998,7 @@ "language-rust-bundled": { "version": "file:packages/language-rust-bundled", "requires": { - "tree-sitter-rust": "^0.13.7" + "tree-sitter-rust": "^0.15.1" } }, "language-sass": { @@ -4090,10 +4006,10 @@ "integrity": "sha512-qaH8BDNBOkpbR4thmcRimEphnrzzhpDxeQM+WCM3Unp3a8r3aV2xcY9LlvbZxpclz8TOUyvuc5qgj1YI//ge9w==" }, "language-shellscript": { - "version": "https://www.atom.io/api/packages/language-shellscript/versions/0.27.11/tarball", - "integrity": "sha512-SgVIqPfJz47jaJOe8d6INI6dIJUhznSsyF3rIyePQoDzimjPIOsgrMQEXYjfHicVts/q4Pa6D6x8v/sn2fTgog==", + "version": "https://www.atom.io/api/packages/language-shellscript/versions/0.27.12/tarball", + "integrity": "sha512-qulEv2pSginsKhMuIrqjBLmuNIEHorAjhNQZRsycW+cKR4c4Py+NEoMoGETEJhzIgxDs7bw7vffbFNRHUCPLgA==", "requires": { - "tree-sitter-bash": "^0.13.9" + "tree-sitter-bash": "^0.15.0" } }, "language-source": { @@ -4117,10 +4033,10 @@ "integrity": "sha512-6xFDqM6nZpynmxGKUS85iUWY0yeub7GYvLyzSOqDejMuOL5UXAITnSNcb7jhr+hQA8KTj5dCmRjphkAQER4Ucg==" }, "language-typescript": { - "version": "https://www.atom.io/api/packages/language-typescript/versions/0.5.0/tarball", - "integrity": "sha512-rRArdgBSjIxfMceapfPil4n5fraIr3lBWGWuXpRqGvYkmB7scvt01MpbCvdKlJGz/KAd7wKG8criIYqBvy2QDg==", + "version": "https://www.atom.io/api/packages/language-typescript/versions/0.5.2/tarball", + "integrity": "sha512-ji8aJg5QOueUHwwljnhDX/MkGSNReAJ2U0JyrB1HHZSJuYz89w1uSYYkoUfwK05FOkMLQr8kPi6SruZyIcRCUQ==", "requires": { - "tree-sitter-typescript": "^0.14.0" + "tree-sitter-typescript": "^0.15.1" } }, "language-xml": { @@ -4350,65 +4266,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4420,15 +4277,15 @@ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" }, "log4js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.1.0.tgz", - "integrity": "sha512-eDa+zZPeVEeK6QGJAePyXM6pg4P3n3TO5rX9iZMVY48JshsTyLJZLIL5HipI1kQ2qLsSyOpUqNND/C5H4WhhiA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", + "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", "requires": { "date-format": "^2.0.0", "debug": "^4.1.1", "flatted": "^2.0.0", "rfdc": "^1.1.2", - "streamroller": "^1.0.4" + "streamroller": "^1.0.5" }, "dependencies": { "debug": { @@ -4538,8 +4395,8 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" }, "markdown-preview": { - "version": "https://www.atom.io/api/packages/markdown-preview/versions/0.160.0/tarball", - "integrity": "sha512-cCL5SAfHPRwFzfcQ3OO1I3wJ4VEuYsM4CkZh7WuHoMN7gupELlOokiwbGU0pJu12kWChAOAfDHq78dOKpYxadw==", + "version": "https://www.atom.io/api/packages/markdown-preview/versions/0.160.2/tarball", + "integrity": "sha512-aJ9J7npcGWSPm2JApZ4KeS8EzZwigkDTDSd/ws1GRBCK8w5XcAMM5zjk4NlA+FJj4d4zH9dqYbjywlzCVgN+1A==", "requires": { "cheerio": "^1.0.0-rc.3", "dompurify": "^1.0.2", @@ -4630,9 +4487,9 @@ "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==" }, "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -4657,12 +4514,12 @@ } }, "metrics": { - "version": "https://www.atom.io/api/packages/metrics/versions/1.7.5/tarball", - "integrity": "sha512-HcA9QKEJAdQi1p6ppk48BKsBGv5E/bLK2rlNUQZJvCPIvPAM/ufFjnqlzujQbZ1/2VFvfXIh4EgQUyS2Hkm1+w==", + "version": "https://www.atom.io/api/packages/metrics/versions/1.8.1/tarball", + "integrity": "sha512-3yMZVI3eOixkeVORM0psQ1Hr7aooLBBwNGgIrIo59SQytLorj/7VYLCTaaYW1hup5m3fcU8vKlrGBj+UNfGJbA==", "requires": { "fs-plus": "^3.0.0", "grim": "^2.0.1", - "telemetry-github": "0.0.14" + "telemetry-github": "0.1.1" }, "dependencies": { "grim": { @@ -5006,11 +4863,18 @@ } }, "nslog": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/nslog/-/nslog-3.0.0.tgz", - "integrity": "sha1-nvfjpGveHnVyRFQcyhP/K2dvexk=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nslog/-/nslog-3.2.0.tgz", + "integrity": "sha512-3J5XPvodzhRpy0S7DIuxzQ16e70XZ8gS7MTvA70PiEFG9iZBv8XFABsyZDphO/62b/kEPkgPpoAbQvZprqLhOQ==", "requires": { - "nan": "^2.0.0" + "nan": "^2.14.0" + }, + "dependencies": { + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + } } }, "nth-check": { @@ -5063,17 +4927,17 @@ "version": "file:packages/one-light-ui" }, "oniguruma": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/oniguruma/-/oniguruma-7.1.0.tgz", - "integrity": "sha512-mV+6HcDNQ38vM8HVKM+MJyXO4EtSigwIZhq023A4rA8Am4dMlGhUkPwudDykExYR45oLrssR/Ep7PZCQ1OM3pA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/oniguruma/-/oniguruma-7.2.0.tgz", + "integrity": "sha512-bh+ZLdykY1sdIx8jBp2zpLbVFDBc3XmKH4Ceo2lijNaN1WhEqtnpqFlmtCbRuDB17nJ58RAUStVwfW8e8uEbnA==", "requires": { - "nan": "^2.12.1" + "nan": "^2.14.0" }, "dependencies": { "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" } } }, @@ -5175,9 +5039,9 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "pathwatcher": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/pathwatcher/-/pathwatcher-8.0.2.tgz", - "integrity": "sha512-zuP+fLmB2IB6z89ikcehA+vG/ITx3Cmhaj3DJrBgnbdss6dwPolSq7cDBjgZ78Vl+SXmG7CHGIOM5mqdT9h7BQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/pathwatcher/-/pathwatcher-8.1.0.tgz", + "integrity": "sha512-CF6M8W3kR4sEF2wzwRLAN/J+MfstclhRhfd0+SP83vQyrIsuKDSxd6r2TVG16sXpKCzo/ieAQ+GD0yYZ1380Nw==", "requires": { "async": "~0.2.10", "emissary": "^1.3.2", @@ -5735,9 +5599,9 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" }, "right-align": { "version": "0.1.3", @@ -5791,12 +5655,12 @@ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=" }, "scandal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scandal/-/scandal-3.1.0.tgz", - "integrity": "sha1-m0AkuXxxm74lAIzAm6rHn7tdNQE=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/scandal/-/scandal-3.2.0.tgz", + "integrity": "sha512-kXICe3ygxwyyO3Ur+k49UzQlu8yrdQgzD03eMgV8sMWDom9q4qpEvZuQRUcbyAujC1TpISPRUPoirOIO1bRxcQ==", "requires": { "argparse": "^1.0.2", - "git-utils": "^5.0.0", + "git-utils": "^5.6.0", "isbinaryfile": "^2.0.4", "minimatch": "^2.0.9", "split": "^1.0.0", @@ -6151,25 +6015,32 @@ "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=" }, "spell-check": { - "version": "https://www.atom.io/api/packages/spell-check/versions/0.74.5/tarball", - "integrity": "sha512-U6ne5vz5DHrfgL6noxuExAiM/UaBf0YrOq6PFkqH99g8FOlunJr6gz/YR1xur08UJuW5moVJTXjivzOt2VFboQ==", + "version": "https://www.atom.io/api/packages/spell-check/versions/0.75.0/tarball", + "integrity": "sha512-VhsBZE5Tj/Ffk9cjSSnZ8RJYLewB7WwP7RVcyo6SnXEqbIaYLCDoXQWsSjyLnEEeahMrVSISPIkycxN+sNyeFw==", "requires": { "atom-pathspec": "^0.0.0", "atom-select-list": "^0.7.0", "multi-integer-range": "^2.0.0", "natural": "^0.4.0", - "spellchecker": "^3.5.3", + "spellchecker": "^3.6.0", "spelling-manager": "^1.1.0", "underscore-plus": "^1" } }, "spellchecker": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/spellchecker/-/spellchecker-3.5.3.tgz", - "integrity": "sha512-Wx5LxzRgNCggBkuzj5MvqrUn3souo9pKRTvOqnQUyKcgX2gntk5E9j6tk/OE0danG6G7IgOWIRrgmcQZs19YJw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/spellchecker/-/spellchecker-3.6.0.tgz", + "integrity": "sha512-aGt8FEaFONTlo/IvDXbUvzN39NizCqkYS+MoQP8THy+Ocf1+OCfnG6QwrZwWxfrd8l06nxuc15icNiP8/ol/GA==", "requires": { "any-promise": "^1.3.0", - "nan": "^2.10.0" + "nan": "^2.14.0" + }, + "dependencies": { + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + } } }, "spelling-manager": { @@ -6265,15 +6136,15 @@ } }, "streamroller": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.4.tgz", - "integrity": "sha512-Wc2Gm5ygjSX8ZpW9J7Y9FwiSzTlKSvcl0FTTMd3rn7RoxDXpBW+xD9TY5sWL2n0UR61COB0LG1BQvN6nTUQbLQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", + "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", "requires": { - "async": "^2.6.1", + "async": "^2.6.2", "date-format": "^2.0.0", - "debug": "^3.1.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.10" + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11" }, "dependencies": { "async": { @@ -6292,16 +6163,6 @@ "ms": "^2.1.1" } }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", @@ -6378,9 +6239,9 @@ } }, "superstring": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.3.6.tgz", - "integrity": "sha512-kDTXCXArhHL1lRk2zBW7ByRJByqVwoLK3E3jlf8+LcwQLZgSMs9dwrDHDpBdoOm89kstSBSrGcW8OJqNkxjWrQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.4.0.tgz", + "integrity": "sha512-dg1jpBBvxL2pBpCkTfAABYj0AXcVC05wQ2CHz/AVY786BC9wwzgZmkbjVQ2s/PI9Se9QMRwURJ2UE3MF4EygOg==", "requires": { "nan": "^2.10.0" } @@ -6521,10 +6382,11 @@ } }, "telemetry-github": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/telemetry-github/-/telemetry-github-0.0.14.tgz", - "integrity": "sha512-rJthdI6QLFP6CV97qexkB06OmKygX9JT3qtCPUdvKBKyy6xnViSys+GKaxv3tRPKgpnOkQJgkdJzQYgpx5+/Nw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/telemetry-github/-/telemetry-github-0.1.1.tgz", + "integrity": "sha512-UUtkNKKHpUthL4FsAJDqKg+TiW0DBI636XAOAA3qcu86m20DhLhn3qhxl12joGdPBtk0tbv/Dx47pj28ZhuF+g==", "requires": { + "idb": "^4.0.3", "lokijs": "^1.5.4", "uuid": "^3.2.1" }, @@ -6545,9 +6407,9 @@ } }, "text-buffer": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/text-buffer/-/text-buffer-13.16.0.tgz", - "integrity": "sha512-J00KcJDKvV87I/4o7F6LYu+2/fzmuEb7liBbZsIeCUM+T0kwqW7k0R7ddyk9EJR2Nqq7asng2/hVIBNYldIfEg==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/text-buffer/-/text-buffer-13.17.0.tgz", + "integrity": "sha512-6KWUrAUp/fLnAX3i8nPiBAzFzNPMLevybVsS6WnvMc6W1Azod8RNMIw7fSsgcpwPgGjkZUg2HIIEKUgGveC7ZQ==", "requires": { "delegato": "^1.0.0", "diff": "^2.2.1", @@ -6557,9 +6419,9 @@ "fs-plus": "^3.0.0", "grim": "^2.0.2", "mkdirp": "^0.5.1", - "pathwatcher": "8.0.2", + "pathwatcher": "^8.1.0", "serializable": "^1.0.3", - "superstring": "2.3.6", + "superstring": "2.4.0", "underscore-plus": "^1.0.0" }, "dependencies": { @@ -6588,6 +6450,14 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "superstring": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.4.0.tgz", + "integrity": "sha512-dg1jpBBvxL2pBpCkTfAABYj0AXcVC05wQ2CHz/AVY786BC9wwzgZmkbjVQ2s/PI9Se9QMRwURJ2UE3MF4EygOg==", + "requires": { + "nan": "^2.10.0" + } } } }, @@ -6640,42 +6510,42 @@ "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" }, "tree-sitter": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.15.0.tgz", - "integrity": "sha512-3CDZ7X4hSJgMXOo8WWhYIwS06hFDmI3x6/3rX+i+LP4ykL3UWVt5TgNKYjAkgBxbpFEHGkaSBe5LRQu5LHOQ3A==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.15.6.tgz", + "integrity": "sha512-OYe9n9Td3iSoGpV39kOZymnjQfkzBaOOzaPEBsAZuBhoVsr+FjLl8IqqyQg8iNNJOEBI5Qc1LbDH1acVXVHIpA==", "requires": { "nan": "^2.13.2", "prebuild-install": "^5.0.0" }, "dependencies": { "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" } } }, "tree-sitter-bash": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/tree-sitter-bash/-/tree-sitter-bash-0.13.9.tgz", - "integrity": "sha512-b0L+QLS2eeIVrHnnbkFlvO1nElhPwqTxLIwyTeJytPYT0TS50Pe7bP+uPi3gkHT1YajxcauCxX1aDWDiZK1h5Q==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-bash/-/tree-sitter-bash-0.15.0.tgz", + "integrity": "sha512-rqXLK1S7ILV2W/mHrugruycDIJE/LXZzIqOUAWBXN4cTiFTcCnLlreTAu8nRqpxfPk76qQeJ9Os5D14Comg21Q==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" } }, "tree-sitter-c": { - "version": "0.13.13", - "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.13.13.tgz", - "integrity": "sha512-ToGn+YgTnidSN7Y1qYoEUlk6kws+WKsEL7G3GmQ62ZUhxE7Oumom65l+QS0JuQXpLeic4BWhXEhOKugOkYpqzA==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.15.0.tgz", + "integrity": "sha512-TCae6lqrzIoOL0LAbAoC//zrdzqyouJO7zp9qTfVJmlz/BEw5Z6UrnDYNt6n1t1ENPDVgUAjPI8dU0TuZfjF2A==", "requires": { "nan": "^2.10.0" } }, "tree-sitter-cpp": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.13.15.tgz", - "integrity": "sha512-S+29FaAfWFCkG02Lw0p4dVFRYnFua9Ua8tY+oFM9ZTgZMaBc7o5rfXVCxNIv5kXKdkHVq0TJWybsFJhtLlQuAw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.15.0.tgz", + "integrity": "sha512-ckK6eIGljzEaOrGRR+5aQGQTXgkTcV6iiqZJoSlPSCNbbSjQHztNRFFlV5yWwQxHnpGfgNUdHnQgnEqd3ffObQ==", "requires": { "nan": "^2.10.0" } @@ -6696,103 +6566,111 @@ } }, "tree-sitter-embedded-template": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/tree-sitter-embedded-template/-/tree-sitter-embedded-template-0.13.0.tgz", - "integrity": "sha512-IJVjMcL2Bg+qF+HibtEXTF4CE6A66ppGSqU8E+2ddn2pCqDtZGREhI+KfqerF9NpKSo1OtbvhXiEXPdXQANLGg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-embedded-template/-/tree-sitter-embedded-template-0.15.0.tgz", + "integrity": "sha512-LyDtwopMlAHg3T4qeBCywKIMGC4A+a59Y4OaE0LO+UtPVgm5xC3kY+Rq3A9T3Dp6L4ZxZl+zL6LBQA5D0mMnlg==", "requires": { "nan": "^2.0.0" } }, "tree-sitter-go": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.13.3.tgz", - "integrity": "sha512-pXnlEDMwrCdnYaOzfEzlMlWqZEKDJXEG4bPvc9j5JSd7IYDWBrwxo+XXuraLSlbj1mJL2kKLIDO8cKDNxUscHw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.15.0.tgz", + "integrity": "sha512-booht80IETCTTj79Yeicr0UmH9DhZeg8IA58Cf8evuARatbebsUQdh4Zg49Ye+15zVD663/LM+NxkmnJLfq2Rw==", "requires": { "nan": "^2.10.0" } }, "tree-sitter-html": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/tree-sitter-html/-/tree-sitter-html-0.13.5.tgz", - "integrity": "sha512-lawojfDlj/9ujEYvLoW4+WTTh2ocrYCYP2Dw5LmwxuvvE2lHr/D4RWA8W1N4jpR58tVef0SSqnnQwJkl1pNIeA==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-html/-/tree-sitter-html-0.15.0.tgz", + "integrity": "sha512-i8pUX4hNljVpo35D4S+8iopJBU6mS8XRbupjEycjsI7+FSBhr8tnMrx9hjjYhgKYCHdxTnYGTi9K7jc0p3gVDA==", "requires": { "nan": "^2.10.0" } }, "tree-sitter-javascript": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.13.10.tgz", - "integrity": "sha512-ku/841Nu7k/VXwI2ifm7xxv2cUiiYztLlIeYTYZXpjaIHMfFer5XZRgmZldJHVthTQ9uRMEr7UQ0qeqnWKzOlg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.15.0.tgz", + "integrity": "sha512-1MJ1gO2Bp///UNexxUfGfh5A75Gb5qFxklAhQPgrbWSK6OgjgaHRiYMmW5tRMqoexSp3U2+9bp4j4Nc3Q2lEpg==", "requires": { - "nan": "^2.4.0" + "nan": "^2.12.1" + }, + "dependencies": { + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + } } }, "tree-sitter-jsdoc": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/tree-sitter-jsdoc/-/tree-sitter-jsdoc-0.13.4.tgz", - "integrity": "sha512-823BIawpN3JegYIhP3tTUlVO+Qc1iaGSl9CEiXt5Lun58TOV56HMnqq6iWgtdcMVcykO24C6Yeovqk+3y20FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-jsdoc/-/tree-sitter-jsdoc-0.15.0.tgz", + "integrity": "sha512-Z5jPAYpB0ofLJYwXTr8oQLBMHqIzMNnpGYKaMVIMpt+wa6ee9pSyy4Uq/tMUQB3qxiYT+66Ij8hu4ou1TNW2CA==", "requires": { "nan": "^2.11.1" }, "dependencies": { "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" } } }, "tree-sitter-json": { - "version": "git://github.com/tree-sitter/tree-sitter-json.git#337f55be9b9b1ccb0baa7763bfe014a94acea7ea", - "from": "git://github.com/tree-sitter/tree-sitter-json.git#v0.14.0", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.14.0.tgz", + "integrity": "sha512-vNNo/9Xq024WTCGjmBClCGkyxlOSHOve4cQ4o5yvc81Syqbna/4x2wZPacNYsVUJCq+jtUFexHLDWtI2RqPQMg==", "requires": { "nan": "^2.0.0" } }, "tree-sitter-python": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.14.0.tgz", - "integrity": "sha512-Kcj5AUdeI4/c/JLsQV8OFI0zLrwcQ1nKoqCRr+W73Tp5SIK+Dd1ILNC5TFHPw1IqOGstcg8AH0XTeU0uq3boZg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.15.0.tgz", + "integrity": "sha512-lOV84DUTsyab8xRfU0o8pBQOKAZPjIJsGL7q0buuORHQvvwnvy3iwF/83OGSyiNYRJzPz6gW+E1N/VgNNavMHA==", "requires": { "nan": "^2.4.0" } }, "tree-sitter-regex": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/tree-sitter-regex/-/tree-sitter-regex-0.13.1.tgz", - "integrity": "sha512-A+ULuVOc37NOjmmmddqXMRwUq8g51FCRZ7YSupLdFcHngl1adI3nBRPskC9A8e++9jF+5fLytwA4X6uHW/v/mg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-regex/-/tree-sitter-regex-0.15.0.tgz", + "integrity": "sha512-e6SWC2vvDwFlTrKZMiqrKz5+6YpOawjb4wh7VyQClpF5fjOC6AeQO0EB0+oWXXKcveFZK0Xdn+cB/zY0GHwYrg==", "requires": { "nan": "^2.10.0" } }, "tree-sitter-ruby": { - "version": "0.13.14", - "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.13.14.tgz", - "integrity": "sha512-ye0Bpzp12HifMoocwhDVR0Adqo7DdR44anPHkx1qhhmdpzMdzsW7WzQYBTJjQo/iFXsgahl/Q9L7AwNI+2cKLw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.15.0.tgz", + "integrity": "sha512-DWLepimzxB6miFLS2dRUQHvQKxEyd3nkzl4WuYvGZEeqiVb3Y4KbzCgk4LCuhmqb+nhONZEgHsNBSN0G6hcpGw==", "requires": { "nan": "^2.12.1", "prebuild-install": "^5.0.0" }, "dependencies": { "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" } } }, "tree-sitter-rust": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.13.7.tgz", - "integrity": "sha512-OX7VlqNhw67yIB69ZhgtJb6sXhwLVwGx991EjLf4PP2bY4dWBgmZ+KxwxN7HBwk9RdUsNLf0KbTwzVRadKhPGw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.15.1.tgz", + "integrity": "sha512-nkuVgr/1QS/IkC1IE9DhjMKbGUUNymrMnRlV6HcOOOsW8s4ubCaL9Yu0M+eyVwSGjiD92xWEZMtt1I5ekUILYg==", "requires": { "nan": "^2.8.0" } }, "tree-sitter-typescript": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.14.0.tgz", - "integrity": "sha512-gx54LvIbjIdqSYGwau5G4Kr7j1oEwfWoZDKrR3jUlINEwskNOXaOzgsSdIM92JnFyqdBU+N6mBHpzjafbJ8EFw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.15.1.tgz", + "integrity": "sha512-xntREG9BE+zknNgcwmeVuq5/AT+lVCSUKvhX6T6KoZLk5OPY5EfHrTqGTxS97KDlSRiGfGPheOPMNzIgk/kwNQ==", "requires": { "nan": "^2.10.0" } diff --git a/package.json b/package.json index b26e1c0fd..db056d36b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.39.0-dev", + "version": "1.40.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/main-process/main.js", "repository": { @@ -14,7 +14,7 @@ "license": "MIT", "electronVersion": "3.1.10", "dependencies": { - "@atom/nsfw": "1.0.23", + "@atom/nsfw": "1.0.25", "@atom/source-map-support": "^0.3.4", "@atom/watcher": "1.3.1", "about": "file:packages/about", @@ -29,7 +29,7 @@ "autocomplete-atom-api": "https://www.atom.io/api/packages/autocomplete-atom-api/versions/0.10.7/tarball", "autocomplete-css": "https://www.atom.io/api/packages/autocomplete-css/versions/0.17.5/tarball", "autocomplete-html": "https://www.atom.io/api/packages/autocomplete-html/versions/0.8.8/tarball", - "autocomplete-plus": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.0/tarball", + "autocomplete-plus": "https://www.atom.io/api/packages/autocomplete-plus/versions/2.42.3/tarball", "autocomplete-snippets": "https://www.atom.io/api/packages/autocomplete-snippets/versions/1.12.1/tarball", "autoflow": "file:packages/autoflow", "autosave": "https://www.atom.io/api/packages/autosave/versions/0.24.6/tarball", @@ -38,7 +38,7 @@ "base16-tomorrow-dark-theme": "file:packages/base16-tomorrow-dark-theme", "base16-tomorrow-light-theme": "file:packages/base16-tomorrow-light-theme", "bookmarks": "https://www.atom.io/api/packages/bookmarks/versions/0.46.0/tarball", - "bracket-matcher": "https://www.atom.io/api/packages/bracket-matcher/versions/0.91.0/tarball", + "bracket-matcher": "https://www.atom.io/api/packages/bracket-matcher/versions/0.91.1/tarball", "chai": "3.5.0", "chart.js": "^2.3.0", "clear-cut": "^2.0.2", @@ -54,17 +54,17 @@ "etch": "^0.12.6", "event-kit": "^2.5.3", "exception-reporting": "file:packages/exception-reporting", - "find-and-replace": "https://www.atom.io/api/packages/find-and-replace/versions/0.218.11/tarball", + "find-and-replace": "https://www.atom.io/api/packages/find-and-replace/versions/0.218.14/tarball", "find-parent-dir": "^0.3.0", - "first-mate": "7.3.0", + "first-mate": "7.4.0", "focus-trap": "2.4.5", - "fs-admin": "^0.1.7", + "fs-admin": "^0.5.0", "fs-plus": "^3.1.1", "fstream": "0.1.24", "fuzzaldrin": "^2.1", - "fuzzy-finder": "https://www.atom.io/api/packages/fuzzy-finder/versions/1.13.5/tarball", + "fuzzy-finder": "https://www.atom.io/api/packages/fuzzy-finder/versions/1.13.8/tarball", "git-diff": "file:packages/git-diff", - "git-utils": "5.5.0", + "git-utils": "5.6.1", "github": "https://www.atom.io/api/packages/github/versions/0.29.0/tarball", "glob": "^7.1.1", "go-to-line": "file:packages/go-to-line", @@ -77,19 +77,19 @@ "jasmine-tagged": "^1.1.4", "key-path-helpers": "^0.4.0", "keybinding-resolver": "https://www.atom.io/api/packages/keybinding-resolver/versions/0.39.0/tarball", - "language-c": "https://www.atom.io/api/packages/language-c/versions/0.60.17/tarball", + "language-c": "https://www.atom.io/api/packages/language-c/versions/0.60.18/tarball", "language-clojure": "https://www.atom.io/api/packages/language-clojure/versions/0.22.8/tarball", "language-coffee-script": "https://www.atom.io/api/packages/language-coffee-script/versions/0.50.0/tarball", "language-csharp": "https://www.atom.io/api/packages/language-csharp/versions/1.1.0/tarball", "language-css": "https://www.atom.io/api/packages/language-css/versions/0.44.0/tarball", "language-gfm": "https://www.atom.io/api/packages/language-gfm/versions/0.90.6/tarball", "language-git": "https://www.atom.io/api/packages/language-git/versions/0.19.1/tarball", - "language-go": "https://www.atom.io/api/packages/language-go/versions/0.47.0/tarball", - "language-html": "https://www.atom.io/api/packages/language-html/versions/0.52.1/tarball", + "language-go": "https://www.atom.io/api/packages/language-go/versions/0.47.1/tarball", + "language-html": "https://www.atom.io/api/packages/language-html/versions/0.52.3/tarball", "language-hyperlink": "https://www.atom.io/api/packages/language-hyperlink/versions/0.17.1/tarball", "language-java": "https://www.atom.io/api/packages/language-java/versions/0.31.3/tarball", - "language-javascript": "https://www.atom.io/api/packages/language-javascript/versions/0.130.0/tarball", - "language-json": "https://www.atom.io/api/packages/language-json/versions/1.0.2/tarball", + "language-javascript": "https://www.atom.io/api/packages/language-javascript/versions/0.130.1/tarball", + "language-json": "https://www.atom.io/api/packages/language-json/versions/1.0.4/tarball", "language-less": "https://www.atom.io/api/packages/language-less/versions/0.34.3/tarball", "language-make": "https://www.atom.io/api/packages/language-make/versions/0.23.0/tarball", "language-mustache": "https://www.atom.io/api/packages/language-mustache/versions/0.14.5/tarball", @@ -97,27 +97,27 @@ "language-perl": "https://www.atom.io/api/packages/language-perl/versions/0.38.1/tarball", "language-php": "https://www.atom.io/api/packages/language-php/versions/0.44.1/tarball", "language-property-list": "https://www.atom.io/api/packages/language-property-list/versions/0.9.1/tarball", - "language-python": "https://www.atom.io/api/packages/language-python/versions/0.53.2/tarball", - "language-ruby": "https://www.atom.io/api/packages/language-ruby/versions/0.72.16/tarball", + "language-python": "https://www.atom.io/api/packages/language-python/versions/0.53.3/tarball", + "language-ruby": "https://www.atom.io/api/packages/language-ruby/versions/0.72.17/tarball", "language-ruby-on-rails": "https://www.atom.io/api/packages/language-ruby-on-rails/versions/0.25.3/tarball", "language-rust-bundled": "file:packages/language-rust-bundled", "language-sass": "https://www.atom.io/api/packages/language-sass/versions/0.62.0/tarball", - "language-shellscript": "https://www.atom.io/api/packages/language-shellscript/versions/0.27.11/tarball", + "language-shellscript": "https://www.atom.io/api/packages/language-shellscript/versions/0.27.12/tarball", "language-source": "https://www.atom.io/api/packages/language-source/versions/0.9.0/tarball", "language-sql": "https://www.atom.io/api/packages/language-sql/versions/0.25.10/tarball", "language-text": "https://www.atom.io/api/packages/language-text/versions/0.7.4/tarball", "language-todo": "https://www.atom.io/api/packages/language-todo/versions/0.29.4/tarball", "language-toml": "https://www.atom.io/api/packages/language-toml/versions/0.20.0/tarball", - "language-typescript": "https://www.atom.io/api/packages/language-typescript/versions/0.5.0/tarball", + "language-typescript": "https://www.atom.io/api/packages/language-typescript/versions/0.5.2/tarball", "language-xml": "https://www.atom.io/api/packages/language-xml/versions/0.35.3/tarball", "language-yaml": "https://www.atom.io/api/packages/language-yaml/versions/0.32.0/tarball", "less-cache": "1.1.0", "line-ending-selector": "file:packages/line-ending-selector", "line-top-index": "0.3.1", "link": "file:packages/link", - "markdown-preview": "https://www.atom.io/api/packages/markdown-preview/versions/0.160.0/tarball", + "markdown-preview": "https://www.atom.io/api/packages/markdown-preview/versions/0.160.2/tarball", "marked": "^0.3.12", - "metrics": "https://www.atom.io/api/packages/metrics/versions/1.7.5/tarball", + "metrics": "https://www.atom.io/api/packages/metrics/versions/1.8.1/tarball", "minimatch": "^3.0.3", "mocha": "2.5.1", "mocha-junit-reporter": "^1.13.0", @@ -125,20 +125,20 @@ "mock-spawn": "^0.2.6", "normalize-package-data": "^2.0.0", "notifications": "https://www.atom.io/api/packages/notifications/versions/0.70.6/tarball", - "nslog": "^3", + "nslog": "^3.0.0", "one-dark-syntax": "file:packages/one-dark-syntax", "one-dark-ui": "file:packages/one-dark-ui", "one-light-syntax": "file:packages/one-light-syntax", "one-light-ui": "file:packages/one-light-ui", "open-on-github": "https://www.atom.io/api/packages/open-on-github/versions/1.3.1/tarball", "package-generator": "https://www.atom.io/api/packages/package-generator/versions/1.3.0/tarball", - "pathwatcher": "8.0.2", + "pathwatcher": "8.1.0", "postcss": "5.2.4", "postcss-selector-parser": "2.2.1", "property-accessors": "^1.1.3", "random-words": "0.0.1", "resolve": "^1.1.6", - "scandal": "^3.1.0", + "scandal": "^3.2.0", "scoped-property-store": "^0.17.0", "scrollbar-style": "^3.2", "season": "^6.0.2", @@ -149,15 +149,15 @@ "snippets": "https://www.atom.io/api/packages/snippets/versions/1.5.0/tarball", "solarized-dark-syntax": "file:packages/solarized-dark-syntax", "solarized-light-syntax": "file:packages/solarized-light-syntax", - "spell-check": "https://www.atom.io/api/packages/spell-check/versions/0.74.5/tarball", + "spell-check": "https://www.atom.io/api/packages/spell-check/versions/0.75.0/tarball", "status-bar": "https://www.atom.io/api/packages/status-bar/versions/1.8.17/tarball", "styleguide": "https://www.atom.io/api/packages/styleguide/versions/0.49.12/tarball", "symbols-view": "https://www.atom.io/api/packages/symbols-view/versions/0.118.2/tarball", "tabs": "https://www.atom.io/api/packages/tabs/versions/0.110.0/tarball", "temp": "^0.9.0", - "text-buffer": "13.16.0", + "text-buffer": "13.17.0", "timecop": "https://www.atom.io/api/packages/timecop/versions/0.36.2/tarball", - "tree-sitter": "0.15.0", + "tree-sitter": "0.15.6", "tree-sitter-css": "^0.13.7", "tree-view": "https://www.atom.io/api/packages/tree-view/versions/0.228.0/tarball", "typescript-simple": "1.0.0", @@ -187,21 +187,21 @@ "autocomplete-atom-api": "0.10.7", "autocomplete-css": "0.17.5", "autocomplete-html": "0.8.8", - "autocomplete-plus": "2.42.0", + "autocomplete-plus": "2.42.3", "autocomplete-snippets": "1.12.1", "autoflow": "file:./packages/autoflow", "autosave": "0.24.6", "background-tips": "0.28.0", "bookmarks": "0.46.0", - "bracket-matcher": "0.91.0", + "bracket-matcher": "0.91.1", "command-palette": "0.43.5", "dalek": "file:./packages/dalek", "deprecation-cop": "file:./packages/deprecation-cop", "dev-live-reload": "file:./packages/dev-live-reload", "encoding-selector": "0.23.9", "exception-reporting": "file:./packages/exception-reporting", - "find-and-replace": "0.218.11", - "fuzzy-finder": "1.13.5", + "find-and-replace": "0.218.14", + "fuzzy-finder": "1.13.8", "github": "0.29.0", "git-diff": "file:./packages/git-diff", "go-to-line": "file:./packages/go-to-line", @@ -211,14 +211,14 @@ "keybinding-resolver": "0.39.0", "line-ending-selector": "file:./packages/line-ending-selector", "link": "file:./packages/link", - "markdown-preview": "0.160.0", - "metrics": "1.7.5", + "markdown-preview": "0.160.2", + "metrics": "1.8.1", "notifications": "0.70.6", "open-on-github": "1.3.1", "package-generator": "1.3.0", "settings-view": "0.261.3", "snippets": "1.5.0", - "spell-check": "0.74.5", + "spell-check": "0.75.0", "status-bar": "1.8.17", "styleguide": "0.49.12", "symbols-view": "0.118.2", @@ -229,19 +229,19 @@ "welcome": "0.36.9", "whitespace": "0.37.7", "wrap-guide": "0.41.0", - "language-c": "0.60.17", + "language-c": "0.60.18", "language-clojure": "0.22.8", "language-coffee-script": "0.50.0", "language-csharp": "1.1.0", "language-css": "0.44.0", "language-gfm": "0.90.6", "language-git": "0.19.1", - "language-go": "0.47.0", - "language-html": "0.52.1", + "language-go": "0.47.1", + "language-html": "0.52.3", "language-hyperlink": "0.17.1", "language-java": "0.31.3", - "language-javascript": "0.130.0", - "language-json": "1.0.2", + "language-javascript": "0.130.1", + "language-json": "1.0.4", "language-less": "0.34.3", "language-make": "0.23.0", "language-mustache": "0.14.5", @@ -249,18 +249,18 @@ "language-perl": "0.38.1", "language-php": "0.44.1", "language-property-list": "0.9.1", - "language-python": "0.53.2", - "language-ruby": "0.72.16", + "language-python": "0.53.3", + "language-ruby": "0.72.17", "language-ruby-on-rails": "0.25.3", "language-rust-bundled": "file:./packages/language-rust-bundled", "language-sass": "0.62.0", - "language-shellscript": "0.27.11", + "language-shellscript": "0.27.12", "language-source": "0.9.0", "language-sql": "0.25.10", "language-text": "0.7.4", "language-todo": "0.29.4", "language-toml": "0.20.0", - "language-typescript": "0.5.0", + "language-typescript": "0.5.2", "language-xml": "0.35.3", "language-yaml": "0.32.0" }, diff --git a/packages/autoflow/lib/autoflow.coffee b/packages/autoflow/lib/autoflow.coffee index 656d800e4..e9e85df01 100644 --- a/packages/autoflow/lib/autoflow.coffee +++ b/packages/autoflow/lib/autoflow.coffee @@ -60,15 +60,25 @@ module.exports = latexTagRegex = /^\s*\\\w+(\[.*\])?\{\w+\}(\[.*\])?\s*$/g # e.g. \begin{verbatim} latexTagStartRegex = /^\s*\\\w+\s*\{\s*$/g # e.g. \item{ latexTagEndRegex = /^\s*\}\s*$/g # e.g. } - while blockLines[0].match(latexTagRegex) or - blockLines[0].match(latexTagStartRegex) + while blockLines.length > 0 and ( + blockLines[0].match(latexTagRegex) or + blockLines[0].match(latexTagStartRegex)) beginningLinesToIgnore.push(blockLines[0]) blockLines.shift() - while blockLines[blockLines.length - 1].match(latexTagRegex) or - blockLines[blockLines.length - 1].match(latexTagEndRegex) + while blockLines.length > 0 and ( + blockLines[blockLines.length - 1].match(latexTagRegex) or + blockLines[blockLines.length - 1].match(latexTagEndRegex)) endingLinesToIgnore.unshift(blockLines[blockLines.length - 1]) blockLines.pop() + # The paragraph might be a LaTeX section with no text, only tags: + # \documentclass{article} + # In that case, we have nothing to reflow. + # Push the tags verbatim and continue to the next paragraph. + unless blockLines.length > 0 + paragraphs.push(block) + continue + # TODO: this could be more language specific. Use the actual comment char. # Remember that `-` has to be the last character in the character class. linePrefix = blockLines[0].match(/^\s*(\/\/|\/\*|;;|#'|\|\|\||--|[#%*>-])?\s*/g)[0] @@ -112,7 +122,7 @@ module.exports = wrappedLines = beginningLinesToIgnore.concat(lines.concat(endingLinesToIgnore)) paragraphs.push(wrappedLines.join('\n').replace(/\s+\n/g, '\n')) - leadingVerticalSpace + paragraphs.join('\n\n') + trailingVerticalSpace + return leadingVerticalSpace + paragraphs.join('\n\n') + trailingVerticalSpace getTabLength: (editor) -> atom.config.get('editor.tabLength', scope: editor.getRootScopeDescriptor()) ? 2 diff --git a/packages/autoflow/spec/autoflow-spec.coffee b/packages/autoflow/spec/autoflow-spec.coffee index 3e132305d..c302042c1 100644 --- a/packages/autoflow/spec/autoflow-spec.coffee +++ b/packages/autoflow/spec/autoflow-spec.coffee @@ -561,70 +561,79 @@ describe "Autoflow package", -> expect(autoflow.reflow(test, wrapColumn: 80)).toEqual res - it 'properly reflows text around LaTeX tags', -> - text = - ''' - \\begin{verbatim} - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - \\end{verbatim} - ''' + describe 'LaTeX', -> + it 'properly reflows text around LaTeX tags', -> + text = + ''' + \\begin{verbatim} + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + \\end{verbatim} + ''' - res = - ''' - \\begin{verbatim} - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget - condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec - semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit - quam, elementum neque pellentesque pulvinar et vestibulum. - \\end{verbatim} - ''' + res = + ''' + \\begin{verbatim} + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget + condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec + semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit + quam, elementum neque pellentesque pulvinar et vestibulum. + \\end{verbatim} + ''' - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res - it 'properly reflows text inside LaTeX tags', -> - text = - ''' - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - ''' + it 'properly reflows text inside LaTeX tags', -> + text = + ''' + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + ''' - res = - ''' - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget - condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec - semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit - quam, elementum neque pellentesque pulvinar et vestibulum. - } - ''' + res = + ''' + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget + condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec + semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit + quam, elementum neque pellentesque pulvinar et vestibulum. + } + ''' - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res - it 'properly reflows text inside nested LaTeX tags', -> - text = - ''' - \\begin{enumerate}[label=(\\alph*)] - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - \\end{enumerate} - ''' + it 'properly reflows text inside nested LaTeX tags', -> + text = + ''' + \\begin{enumerate}[label=(\\alph*)] + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + \\end{enumerate} + ''' - res = - ''' - \\begin{enumerate}[label=(\\alph*)] - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. - Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. - Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore - velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - \\end{enumerate} - ''' + res = + ''' + \\begin{enumerate}[label=(\\alph*)] + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. + Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. + Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore + velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + \\end{enumerate} + ''' - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + it 'does not attempt to reflow a selection that contains only LaTeX tags and nothing else', -> + text = + ''' + \\begin{enumerate} + \\end{enumerate} + ''' + + expect(autoflow.reflow(text, wrapColumn: 5)).toEqual text diff --git a/packages/grammar-selector/lib/grammar-list-view.js b/packages/grammar-selector/lib/grammar-list-view.js index 686d640c1..cbd1528fe 100644 --- a/packages/grammar-selector/lib/grammar-list-view.js +++ b/packages/grammar-selector/lib/grammar-list-view.js @@ -18,9 +18,25 @@ module.exports = class GrammarListView { const div = document.createElement('div'); div.classList.add('pull-right'); + + if (isTreeSitter(grammar)) { + const parser = document.createElement('span'); + parser.classList.add( + 'grammar-selector-parser', + 'badge', + 'badge-success' + ); + parser.textContent = 'Tree-sitter'; + parser.setAttribute( + 'title', + '(Recommended) A faster parser with improved syntax highlighting & code navigation support.' + ); + div.appendChild(parser); + } + if (grammar.scopeName) { const scopeName = document.createElement('scopeName'); - scopeName.classList.add('key-binding'); // It will be styled the same as the keybindings in the command palette + scopeName.classList.add('badge', 'badge-info'); scopeName.textContent = grammar.scopeName; div.appendChild(scopeName); element.appendChild(div); @@ -33,7 +49,7 @@ module.exports = class GrammarListView { if (grammar === this.autoDetect) { atom.textEditors.clearGrammarOverride(this.editor); } else { - atom.textEditors.setGrammarOverride(this.editor, grammar.scopeName); + atom.grammars.assignGrammar(this.editor, grammar); } }, didCancelSelection: () => { @@ -72,28 +88,44 @@ module.exports = class GrammarListView { async toggle() { if (this.panel != null) { this.cancel(); - } else if (atom.workspace.getActiveTextEditor()) { - this.editor = atom.workspace.getActiveTextEditor(); + return; + } + + const editor = atom.workspace.getActiveTextEditor(); + if (editor) { + this.editor = editor; this.currentGrammar = this.editor.getGrammar(); if (this.currentGrammar === atom.grammars.nullGrammar) { this.currentGrammar = this.autoDetect; } - const grammars = atom.grammars.getGrammars().filter(grammar => { - return grammar !== atom.grammars.nullGrammar && grammar.name; - }); + let grammars = atom.grammars + .getGrammars({ includeTreeSitter: true }) + .filter(grammar => { + return grammar !== atom.grammars.nullGrammar && grammar.name; + }); + + if (atom.config.get('grammar-selector.hideDuplicateTextMateGrammars')) { + const blacklist = new Set(); + grammars.forEach(grammar => { + if (isTreeSitter(grammar)) { + blacklist.add(grammar.name); + } + }); + grammars = grammars.filter( + grammar => isTreeSitter(grammar) || !blacklist.has(grammar.name) + ); + } + grammars.sort((a, b) => { if (a.scopeName === 'text.plain') { return -1; } else if (b.scopeName === 'text.plain') { return 1; - } else if (a.name) { - return a.name.localeCompare(b.name); - } else if (a.scopeName) { - return a.scopeName.localeCompare(b.scopeName); - } else { - return 1; + } else if (a.name === b.name) { + return compareGrammarType(a, b); } + return a.name.localeCompare(b.name); }); grammars.unshift(this.autoDetect); await this.selectListView.update({ items: grammars }); @@ -101,3 +133,16 @@ module.exports = class GrammarListView { } } }; + +function isTreeSitter(grammar) { + return grammar.constructor.name === 'TreeSitterGrammar'; +} + +function compareGrammarType(a, b) { + if (isTreeSitter(a)) { + return -1; + } else if (isTreeSitter(b)) { + return 1; + } + return 0; +} diff --git a/packages/grammar-selector/package.json b/packages/grammar-selector/package.json index 624cfe0bc..8e08012f0 100644 --- a/packages/grammar-selector/package.json +++ b/packages/grammar-selector/package.json @@ -37,6 +37,11 @@ "type": "boolean", "default": true, "description": "Show the active pane item's language on the right side of Atom's status bar, instead of the left." + }, + "hideDuplicateTextMateGrammars": { + "type": "boolean", + "default": true, + "description": "Hides the TextMate grammar when there is an existing Tree-sitter grammar" } } } diff --git a/packages/grammar-selector/spec/grammar-selector-spec.js b/packages/grammar-selector/spec/grammar-selector-spec.js index d6effb6b4..3e36b4c2e 100644 --- a/packages/grammar-selector/spec/grammar-selector-spec.js +++ b/packages/grammar-selector/spec/grammar-selector-spec.js @@ -7,6 +7,7 @@ describe('GrammarSelector', () => { beforeEach(async () => { jasmine.attachToDOM(atom.views.getView(atom.workspace)); atom.config.set('grammar-selector.showOnRightSideOfStatusBar', false); + atom.config.set('grammar-selector.hideDuplicateTextMateGrammars', false); await atom.packages.activatePackage('status-bar'); await atom.packages.activatePackage('grammar-selector'); @@ -27,21 +28,15 @@ describe('GrammarSelector', () => { describe('when grammar-selector:show is triggered', () => it('displays a list of all the available grammars', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); + const grammarView = (await getGrammarView(editor)).element; - const grammarView = atom.workspace.getModalPanels()[0].getItem().element; - // TODO: Remove once Atom 1.23 reaches stable - if (parseFloat(atom.getVersion()) >= 1.23) { - // Do not take into account the two JS regex grammars or language-with-no-name - expect(grammarView.querySelectorAll('li').length).toBe( - atom.grammars.grammars.length - 3 - ); - } else { - expect(grammarView.querySelectorAll('li').length).toBe( - atom.grammars.grammars.length - 1 - ); - } + // -1 for removing nullGrammar, +1 for adding "Auto Detect" + // Tree-sitter names the regex and JSDoc grammars + expect(grammarView.querySelectorAll('li').length).toBe( + atom.grammars + .getGrammars({ includeTreeSitter: true }) + .filter(g => g.name).length + ); expect(grammarView.querySelectorAll('li')[0].textContent).toBe( 'Auto Detect' ); @@ -51,31 +46,23 @@ describe('GrammarSelector', () => { .forEach(li => expect(li.textContent).not.toBe(atom.grammars.nullGrammar.name) ); + expect(grammarView.textContent.includes('Tree-sitter')).toBe(true); // check we are showing and labelling Tree-sitter grammars })); describe('when a grammar is selected', () => it('sets the new grammar on the editor', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); - - const grammarView = atom.workspace.getModalPanels()[0].getItem(); + const grammarView = await getGrammarView(editor); grammarView.props.didConfirmSelection(textGrammar); expect(editor.getGrammar()).toBe(textGrammar); })); describe('when auto-detect is selected', () => it('restores the auto-detected grammar on the editor', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); - - let grammarView = atom.workspace.getModalPanels()[0].getItem(); + let grammarView = await getGrammarView(editor); grammarView.props.didConfirmSelection(textGrammar); expect(editor.getGrammar()).toBe(textGrammar); - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); - - grammarView = atom.workspace.getModalPanels()[0].getItem(); + grammarView = await getGrammarView(editor); grammarView.props.didConfirmSelection(grammarView.items[0]); expect(editor.getGrammar()).toBe(jsGrammar); })); @@ -83,10 +70,7 @@ describe('GrammarSelector', () => { describe("when the editor's current grammar is the null grammar", () => it('displays Auto Detect as the selected grammar', async () => { editor.setGrammar(atom.grammars.nullGrammar); - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); - - const grammarView = atom.workspace.getModalPanels()[0].getItem().element; + const grammarView = (await getGrammarView(editor)).element; expect(grammarView.querySelector('li.active').textContent).toBe( 'Auto Detect' ); @@ -97,10 +81,7 @@ describe('GrammarSelector', () => { editor = await atom.workspace.open(); expect(editor.getGrammar()).not.toBe(jsGrammar); - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); - await SelectListView.getScheduler().getNextUpdatePromise(); - - const grammarView = atom.workspace.getModalPanels()[0].getItem(); + const grammarView = await getGrammarView(editor); grammarView.props.didConfirmSelection(jsGrammar); expect(editor.getGrammar()).toBe(jsGrammar); })); @@ -199,6 +180,73 @@ describe('GrammarSelector', () => { ); })); + describe('when toggling hideDuplicateTextMateGrammars', () => { + it('shows only the Tree-sitter if true and both exist', async () => { + // the main JS grammar has both a TextMate and Tree-sitter implementation + atom.config.set('grammar-selector.hideDuplicateTextMateGrammars', true); + const grammarView = await getGrammarView(editor); + const observedNames = new Set(); + grammarView.element.querySelectorAll('li').forEach(li => { + const name = li.getAttribute('data-grammar'); + expect(observedNames.has(name)).toBe(false); + observedNames.add(name); + }); + + // check the seen JS is actually the Tree-sitter one + const list = atom.workspace.getModalPanels()[0].item; + for (const item of list.items) { + if (item.name === 'JavaScript') { + expect(item.constructor.name === 'TreeSitterGrammar'); + } + } + }); + + it('shows both if false', async () => { + await atom.packages.activatePackage('language-c'); // punctuation making it sort wrong + atom.config.set( + 'grammar-selector.hideDuplicateTextMateGrammars', + false + ); + await getGrammarView(editor); + let cppCount = 0; + + const listItems = atom.workspace.getModalPanels()[0].item.items; + for (let i = 0; i < listItems.length; i++) { + const grammar = listItems[i]; + const name = grammar.name; + if (cppCount === 0 && name === 'C++') { + expect(grammar.constructor.name).toBe('TreeSitterGrammar'); // first C++ entry should be Tree-sitter + cppCount++; + } else if (cppCount === 1) { + expect(name).toBe('C++'); + expect(grammar.constructor.name).toBe('Grammar'); // immediate next grammar should be the TextMate version + cppCount++; + } else { + expect(name).not.toBe('C++'); // there should not be any other C++ grammars + } + } + + expect(cppCount).toBe(2); // ensure we actually saw both grammars + }); + }); + + describe('for every Tree-sitter grammar', () => { + it('adds a label to identify it as Tree-sitter', async () => { + const grammarView = await getGrammarView(editor); + const elements = grammarView.element.querySelectorAll('li'); + const listItems = atom.workspace.getModalPanels()[0].item.items; + for (let i = 0; i < listItems.length; i++) { + if (listItems[i].constructor.name === 'TreeSitterGrammar') { + expect( + elements[i].childNodes[1].childNodes[0].className.startsWith( + 'grammar-selector-parser' + ) + ).toBe(true); + } + } + }); + }); + describe('when clicked', () => it('shows the grammar selector modal', () => { const eventHandler = jasmine.createSpy('eventHandler'); @@ -224,3 +272,9 @@ function getTooltipText(element) { const [tooltip] = atom.tooltips.findTooltips(element); return tooltip.getTitle(); } + +async function getGrammarView(editor) { + atom.commands.dispatch(editor.getElement(), 'grammar-selector:show'); + await SelectListView.getScheduler().getNextUpdatePromise(); + return atom.workspace.getModalPanels()[0].getItem(); +} diff --git a/packages/grammar-selector/styles/grammar-selector.less b/packages/grammar-selector/styles/grammar-selector.less index b10bb60f4..e4a6d538b 100644 --- a/packages/grammar-selector/styles/grammar-selector.less +++ b/packages/grammar-selector/styles/grammar-selector.less @@ -4,3 +4,7 @@ .grammar-status a:hover { color: @text-color; } + +.grammar-selector-parser { + margin-right: @component-padding; +} diff --git a/packages/language-rust-bundled/grammars/tree-sitter-rust.cson b/packages/language-rust-bundled/grammars/tree-sitter-rust.cson index 6f77d1b90..651e2e247 100644 --- a/packages/language-rust-bundled/grammars/tree-sitter-rust.cson +++ b/packages/language-rust-bundled/grammars/tree-sitter-rust.cson @@ -2,6 +2,7 @@ name: 'Rust' scopeName: 'source.rust' type: 'tree-sitter' parser: 'tree-sitter-rust' +injectionRegex: 'rust' fileTypes: [ 'rs' diff --git a/packages/language-rust-bundled/lib/main.js b/packages/language-rust-bundled/lib/main.js new file mode 100644 index 000000000..7a996b689 --- /dev/null +++ b/packages/language-rust-bundled/lib/main.js @@ -0,0 +1,14 @@ +exports.activate = function() { + for (const nodeType of ['macro_invocation', 'macro_rule']) { + atom.grammars.addInjectionPoint('source.rust', { + type: nodeType, + language() { + return 'rust'; + }, + content(node) { + return node.lastChild; + }, + includeChildren: true + }); + } +}; diff --git a/packages/language-rust-bundled/package.json b/packages/language-rust-bundled/package.json index 91c1662ab..ca6e7bdda 100644 --- a/packages/language-rust-bundled/package.json +++ b/packages/language-rust-bundled/package.json @@ -7,10 +7,11 @@ "grammar", "rust" ], + "main": "lib/main.js", "repository": "https://github.com/atom/atom", "license": "MIT", "dependencies": { - "tree-sitter-rust": "^0.13.7" + "tree-sitter-rust": "^0.15.1" }, "engines": { "atom": ">=1.0.0 <2.0.0" diff --git a/packages/one-dark-syntax/styles/syntax/_base.less b/packages/one-dark-syntax/styles/syntax/_base.less index df706b084..64481655f 100644 --- a/packages/one-dark-syntax/styles/syntax/_base.less +++ b/packages/one-dark-syntax/styles/syntax/_base.less @@ -28,7 +28,7 @@ } &.syntax--operator { - color: @mono-1; + color: @hue-3; } &.syntax--other.syntax--special-method { diff --git a/resources/linux/redhat/atom.spec.in b/resources/linux/redhat/atom.spec.in index 7a4888895..f1bd93e5e 100644 --- a/resources/linux/redhat/atom.spec.in +++ b/resources/linux/redhat/atom.spec.in @@ -26,7 +26,7 @@ chmod 755 "%{buildroot}/<%= installDir %>/bin/<%= appFileName %>" mkdir -p "%{buildroot}/<%= installDir %>/share/applications/" cp "<%= appFileName %>.desktop" "%{buildroot}/<%= installDir %>/share/applications/" mkdir -p "%{buildroot}/<%= installDir %>/share/polkit-1/actions/" -cp "atom.policy" "%{buildroot}/<%= installDir %>/share/polkit-1/actions/atom.policy" +cp "<%= policyFileName %>" "%{buildroot}/<%= installDir %>/share/polkit-1/actions/<%= policyFileName %>" mkdir -p "%{buildroot}/<%= installDir %>/share/icons/hicolor/1024x1024/apps" cp "icons/1024.png" "%{buildroot}/<%= installDir %>/share/icons/hicolor/1024x1024/apps/<%= appFileName %>.png" @@ -52,5 +52,5 @@ cp "icons/16.png" "%{buildroot}/<%= installDir %>/share/icons/hicolor/16x16/apps <%= installDir %>/bin/<%= apmFileName %> <%= installDir %>/share/<%= appFileName %>/ <%= installDir %>/share/applications/<%= appFileName %>.desktop -<%= installDir %>/share/polkit-1/actions/atom.policy +<%= installDir %>/share/polkit-1/actions/<%= policyFileName %> <%= installDir %>/share/icons/hicolor/ diff --git a/script/build b/script/build index 193eb7310..9219edad2 100755 --- a/script/build +++ b/script/build @@ -109,7 +109,7 @@ if (!argv.generateApiDocs) { if (argv.codeSign) { const executablesToSign = [ path.join(packagedAppPath, 'Atom.exe') ] if (argv.createWindowsInstaller) { - executablesToSign.push(path.join(__dirname, 'node_modules', 'electron-winstaller', 'vendor', 'Update.exe')) + executablesToSign.push(path.join(__dirname, 'node_modules', '@atom', 'electron-winstaller', 'vendor', 'Squirrel.exe')) } codeSignOnWindows(executablesToSign) } else { diff --git a/script/lib/code-sign-on-windows.js b/script/lib/code-sign-on-windows.js index 93bd3e65d..181f58c15 100644 --- a/script/lib/code-sign-on-windows.js +++ b/script/lib/code-sign-on-windows.js @@ -40,6 +40,7 @@ module.exports = function(filesToSign) { __dirname, '..', 'node_modules', + '@atom', 'electron-winstaller', 'vendor', 'signtool.exe' diff --git a/script/lib/create-debian-package.js b/script/lib/create-debian-package.js index 4bc1a1dff..e79d256e8 100644 --- a/script/lib/create-debian-package.js +++ b/script/lib/create-debian-package.js @@ -209,7 +209,12 @@ module.exports = function(packagedAppPath) { ); fs.copySync( path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'atom.policy'), - path.join(debianPackageShareDirPath, 'polkit-1', 'actions', 'atom.policy') + path.join( + debianPackageShareDirPath, + 'polkit-1', + 'actions', + `atom-${CONFIG.channel}.policy` + ) ); console.log(`Generating .deb file from ${debianPackageDirPath}`); diff --git a/script/lib/create-rpm-package.js b/script/lib/create-rpm-package.js index 52f33d32a..a8bd143dd 100644 --- a/script/lib/create-rpm-package.js +++ b/script/lib/create-rpm-package.js @@ -19,6 +19,7 @@ module.exports = function(packagedAppPath) { // RPM versions can't have dashes or tildes in them. // (Ref.: https://twiki.cern.ch/twiki/bin/view/Main/RPMAndDebVersioning) const appVersion = CONFIG.appMetadata.version.replace(/-/g, '.'); + const policyFileName = `atom-${CONFIG.channel}.policy`; const rpmPackageDirPath = path.join(CONFIG.homeDirPath, 'rpmbuild'); const rpmPackageBuildDirPath = path.join(rpmPackageDirPath, 'BUILD'); @@ -80,7 +81,8 @@ module.exports = function(packagedAppPath) { apmFileName: apmExecutableName, description: appDescription, installDir: '/usr', - version: appVersion + version: appVersion, + policyFileName }); fs.writeFileSync(rpmPackageSpecFilePath, rpmPackageSpecsContents); @@ -114,7 +116,7 @@ module.exports = function(packagedAppPath) { console.log(`Copying atom.policy into "${rpmPackageBuildDirPath}"`); fs.copySync( path.join(CONFIG.repositoryRootPath, 'resources', 'linux', 'atom.policy'), - path.join(rpmPackageBuildDirPath, 'atom.policy') + path.join(rpmPackageBuildDirPath, policyFileName) ); console.log(`Generating .rpm package from "${rpmPackageDirPath}"`); diff --git a/script/lib/create-windows-installer.js b/script/lib/create-windows-installer.js index bddbf12d4..6c13e7425 100644 --- a/script/lib/create-windows-installer.js +++ b/script/lib/create-windows-installer.js @@ -1,6 +1,6 @@ 'use strict'; -const electronInstaller = require('electron-winstaller'); +const electronInstaller = require('@atom/electron-winstaller'); const fs = require('fs'); const glob = require('glob'); const path = require('path'); @@ -26,7 +26,6 @@ module.exports = packagedAppPath => { ), outputDirectory: CONFIG.buildOutputPath, noMsi: true, - noDelta: CONFIG.channel === 'nightly', // Delta packages are broken for nightly versions past nightly9 due to Squirrel/NuGet limitations remoteReleases: `${updateUrlPrefix}/api/updates${archSuffix}?version=${ CONFIG.computedAppVersion }`, diff --git a/script/lib/include-path-in-packaged-app.js b/script/lib/include-path-in-packaged-app.js index 3bb80fd6c..f8caac357 100644 --- a/script/lib/include-path-in-packaged-app.js +++ b/script/lib/include-path-in-packaged-app.js @@ -16,7 +16,6 @@ const EXCLUDE_REGEXPS_SOURCES = [ escapeRegExp('.npmignore'), escapeRegExp('.pairs'), escapeRegExp('.travis.yml'), - escapeRegExp('appveyor.yml'), escapeRegExp('.idea'), escapeRegExp('.editorconfig'), escapeRegExp('.lint'), diff --git a/script/package-lock.json b/script/package-lock.json index 568d7d622..9b3839dae 100644 --- a/script/package-lock.json +++ b/script/package-lock.json @@ -8,6 +8,66 @@ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz", "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==" }, + "@atom/electron-winstaller": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@atom/electron-winstaller/-/electron-winstaller-0.0.1.tgz", + "integrity": "sha512-E8bGTBrhf4HsZZS5oPxQgx8XL2wCz04vi0gtYzQH+i9gpxdkuGuV+RHGAtQY+k+wbG5RVR89sB6ICMmhUYNi2Q==", + "requires": { + "@babel/runtime": "^7.3.4", + "asar": "^1.0.0", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash.template": "^4.2.2", + "pify": "^4.0.1", + "temp": "^0.9.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "temp": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz", + "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==", + "requires": { + "rimraf": "~2.6.2" + } + } + } + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -119,6 +179,14 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==" }, + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", @@ -211,6 +279,104 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.4.tgz", "integrity": "sha512-Zl8dGvAcEmadgs1tmSPcvwzO1YRsz38bVJQvH1RvRqSR9/5n61Q1ktcDL0ht3FXWR+ZpVmXVwN1LuH4Ax23NsA==" }, + "@wdio/config": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-5.9.1.tgz", + "integrity": "sha512-u5dqcTpUk4eXILEy5ytKX+0s7vXVHAwU/GghhbWrbL3mDTvZ65Wn6IyDGtBLckY6lfa2KF5Tswk0cg9mCw0mnA==", + "requires": { + "@wdio/logger": "^5.9.0", + "deepmerge": "^2.0.1", + "glob": "^7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@wdio/logger": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-5.9.0.tgz", + "integrity": "sha512-L08MyO844LoTOnOZFxbupbTeqMAH7ZmrrNtN5AXpk3hJP7t4i5A+7eCiNWMpUpmOGHzM+04W27mYdaSei7imKg==", + "requires": { + "chalk": "^2.3.0", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.5.3", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@wdio/repl": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-5.9.1.tgz", + "integrity": "sha512-GUZ35ZLfNAIwKH/3TNrrusisMVX5Ukm9aLjbCRRKUCqGudD9yMFnkw1iJgfWFk38OnEcGS7plgdAJJooQx5Kqw==", + "requires": { + "@wdio/config": "^5.9.1" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -295,41 +461,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "archiver": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.6.1.tgz", - "integrity": "sha1-1AKZJXH9F5rtZy2Xl/iI5Wjh3Vw=", - "requires": { - "file-utils": "~0.1.5", - "lazystream": "~0.1.0", - "lodash": "~2.4.1", - "readable-stream": "~1.0.24", - "zip-stream": "~0.2.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -444,27 +575,34 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asar": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-0.11.0.tgz", - "integrity": "sha1-uSbnksMV+MBIxDNx4yWwnJenZGQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-1.0.0.tgz", + "integrity": "sha512-MBiDU5cDr9UWuY2F0zq2fZlnyRq1aOPmJGMas22Qa14K1odpRXL3xkMHPN3uw2hAK5mD89Q+/KidOUtpi4V0Cg==", "requires": { - "chromium-pickle-js": "^0.1.0", - "commander": "^2.9.0", - "cuint": "^0.2.1", - "glob": "^6.0.4", - "minimatch": "^3.0.0", - "mkdirp": "^0.5.0", - "mksnapshot": "^0.3.0" + "chromium-pickle-js": "^0.2.0", + "commander": "^2.19.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "pify": "^4.0.1", + "tmp-promise": "^1.0.5" }, "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { + "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "2 || 3", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -476,6 +614,11 @@ "requires": { "brace-expansion": "^1.1.7" } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -897,14 +1040,6 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "requires": { - "hoek": "0.9.x" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -929,11 +1064,6 @@ "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=" }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" - }, "browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", @@ -1060,14 +1190,6 @@ "lazy-cache": "^1.0.3" } }, - "chainit": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chainit/-/chainit-2.1.1.tgz", - "integrity": "sha1-5TRdnAcdRz5zJ0yIrqZskVE2KME=", - "requires": { - "queue": "~1.0.2" - } - }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -1132,9 +1254,9 @@ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "chromium-pickle-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz", - "integrity": "sha1-HUixB9ghJqLz4hHC6iX4A7pVGyE=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=" }, "circular-json": { "version": "0.3.3", @@ -1470,15 +1592,6 @@ "which": "^1.2.8" } }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "optional": true, - "requires": { - "boom": "0.4.x" - } - }, "cson-parser": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-1.0.9.tgz", @@ -1494,11 +1607,6 @@ } } }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -1531,12 +1639,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "optional": true - }, "cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -1623,9 +1725,9 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-0.2.10.tgz", - "integrity": "sha1-iQa/nlJaT78bIDsq/LRkAkmCEhk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" }, "deferred-leveldown": { "version": "4.0.2", @@ -1792,11 +1894,6 @@ "wrappy": "1" } }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" - }, "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", @@ -2263,38 +2360,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=" }, - "electron-winstaller": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-2.6.4.tgz", - "integrity": "sha1-a0gHboc6bqNWJR8Ve2i55dwDtak=", - "requires": { - "asar": "^0.11.0", - "bluebird": "^3.3.4", - "debug": "^2.2.0", - "fs-extra": "^0.26.7", - "lodash.template": "^4.2.2", - "temp": "^0.8.3" - }, - "dependencies": { - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - } - } - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -3343,71 +3408,6 @@ "object-assign": "^4.0.1" } }, - "file-utils": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", - "integrity": "sha1-3IFTyFU4fLTaywoXJVMfpESmtIw=", - "requires": { - "findup-sync": "~0.1.2", - "glob": "~3.2.6", - "iconv-lite": "~0.2.11", - "isbinaryfile": "~0.1.9", - "lodash": "~2.1.0", - "minimatch": "~0.2.12", - "rimraf": "~2.2.2" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "2", - "minimatch": "0.3" - }, - "dependencies": { - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=" - }, - "lodash": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz", - "integrity": "sha1-Bjfqqjaooc/IZcOt+5Qhib+wmY0=" - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" - } - } - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -3444,45 +3444,6 @@ } } }, - "findup-sync": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", - "requires": { - "glob": "~3.2.9", - "lodash": "~2.4.1" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -3578,12 +3539,11 @@ } }, "fs-admin": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/fs-admin/-/fs-admin-0.1.7.tgz", - "integrity": "sha512-EQNioqUHgtnX9ErMiPuvHCAx0M1VSa9u4oxGF+EGVYBL15Mg5BxEzGBrTAYHUQDDobqw1Yc+6YqZWwSIIe+EwQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fs-admin/-/fs-admin-0.5.0.tgz", + "integrity": "sha512-jU0x86bI6wmhdGGcpaO1rI7EpNx/44cEXPsHqFIRgs9SVsk3HSWn9Zd5fd7bdDw3LcmdnazOcJFK9PZsoNecAA==", "requires": { - "mocha": "^3.5.0", - "nan": "^2.10.0" + "nan": "^2.13.2" } }, "fs-constants": { @@ -3883,15 +3843,10 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, "har-schema": { "version": "2.0.0", @@ -3992,28 +3947,6 @@ } } }, - "hawk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", - "integrity": "sha1-uQuxaYByhUEdp//LjdJZhQLTtS0=", - "optional": true, - "requires": { - "boom": "0.4.x", - "cryptiles": "0.2.x", - "hoek": "0.9.x", - "sntp": "0.2.x" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" - }, "home-or-tmp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", @@ -4563,11 +4496,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isbinaryfile": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz", - "integrity": "sha1-Fe7ONcSrcI2JJNqZ+4dPK1zAtsQ=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4678,11 +4606,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, "json5": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", @@ -4742,32 +4665,6 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lazystream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", - "integrity": "sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=", - "requires": { - "readable-stream": "~1.0.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -4928,126 +4825,35 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } - } - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "requires": { - "lodash._objecttypes": "~2.4.1" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" }, "lodash.startcase": { "version": "4.4.0", @@ -5071,6 +4877,11 @@ "lodash._reinterpolate": "~3.0.0" } }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -5112,6 +4923,16 @@ } } }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" + }, + "loglevel-plugin-prefix": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.5.3.tgz", + "integrity": "sha512-zRAJw3WYCQAJ6xfEIi04/oqlmR6jkwg3hmBcMW82Zic3iPWyju1gwntcgic0m5NgqYNJ62alCmb0g/div26WjQ==" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -5323,96 +5144,6 @@ "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" }, - "mksnapshot": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.1.tgz", - "integrity": "sha1-JQHAVldDbXQs6Vik/5LHfkDdN+Y=", - "requires": { - "decompress-zip": "0.3.0", - "fs-extra": "0.26.7", - "request": "^2.79.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - } - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5424,9 +5155,9 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -8971,11 +8702,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, - "pragma-singleton": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pragma-singleton/-/pragma-singleton-1.0.3.tgz", - "integrity": "sha1-aJQxe7jUcVflneKkoAnbfm9j4w4=" - }, "prebuild-install": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", @@ -9082,11 +8808,6 @@ "once": "^1.3.1" } }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -9097,16 +8818,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "queue": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-1.0.2.tgz", - "integrity": "sha1-LZr55hyaGuRVem842FtTTq/yBYE=" - }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", @@ -9337,6 +9048,11 @@ "through": "~2.3.8" } }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", @@ -9541,6 +9257,21 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "resq": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.5.0.tgz", + "integrity": "sha512-6US6oo2fQ/vgs7wBwqq1w9901Z5VEDgxQH0LrNaN8HcHUZInhtrIt1a0Icysu0vuoK26Bt+SR1dIYeR9+ftMxA==", + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + } + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -9556,9 +9287,9 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rgb2hex": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.8.tgz", - "integrity": "sha512-kPH3Zm3UrBIfJv17AtJJGLRxak+Hvvz6SnsTBIajqB2Zbh+A4EEjkMWKkmGhms0cJlzOOjZcu1LX5K3vnON7ug==" + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.9.tgz", + "integrity": "sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ==" }, "right-align": { "version": "0.1.3", @@ -9666,6 +9397,11 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, + "serialize-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-3.0.0.tgz", + "integrity": "sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A==" + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -9705,11 +9441,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -9880,15 +9611,6 @@ "kind-of": "^3.2.0" } }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "optional": true, - "requires": { - "hoek": "0.9.x" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -10732,6 +10454,59 @@ "os-tmpdir": "~1.0.2" } }, + "tmp-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", + "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", + "requires": { + "bluebird": "^3.5.0", + "tmp": "0.1.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -11096,15 +10871,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -11183,142 +10949,37 @@ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.12.tgz", "integrity": "sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw==" }, - "webdriverio": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-2.4.5.tgz", - "integrity": "sha1-wD7ajhp+tCMDhYjm5z8nCyx03gs=", + "webdriver": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-5.9.1.tgz", + "integrity": "sha512-emUetEEJKN6ZsyZzj28D4HKC5p7Qo3ZSuuRlH9TpWyCp8ahxu3UicgL19ES//Sy1xPomWOi2Xk54/FLv/BIxgQ==", "requires": { - "archiver": "~0.6.1", - "async": "^0.9.0", - "chainit": "^2.1.1", - "css-parse": "^1.7.0", - "css-value": "0.0.1", - "deepmerge": "~0.2.7", - "pragma-singleton": "~1.0.3", - "q": "^1.1.2", - "request": "~2.34.0", - "rgb2hex": "^0.1.0", - "url": "^0.10.1", - "wgxpath": "^0.23.0" - }, - "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "optional": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "optional": true - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "optional": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "optional": true - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" - }, - "form-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", - "optional": true, - "requires": { - "async": "~0.9.0", - "combined-stream": "~0.0.4", - "mime": "~1.2.11" - } - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "optional": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" - } - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "oauth-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", - "optional": true - }, - "qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=" - }, - "request": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.34.0.tgz", - "integrity": "sha1-tdi5UmrdSi1GKfTUFxJFc5lkRa4=", - "requires": { - "aws-sign2": "~0.5.0", - "forever-agent": "~0.5.0", - "form-data": "~0.1.0", - "hawk": "~1.0.0", - "http-signature": "~0.10.0", - "json-stringify-safe": "~5.0.0", - "mime": "~1.2.9", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.3.0", - "qs": "~0.6.0", - "tough-cookie": ">=0.12.0", - "tunnel-agent": "~0.3.0" - } - }, - "tunnel-agent": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", - "optional": true - } + "@wdio/config": "^5.9.1", + "@wdio/logger": "^5.9.0", + "deepmerge": "^2.0.1", + "lodash.merge": "^4.6.1", + "request": "^2.83.0" } }, - "wgxpath": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-0.23.0.tgz", - "integrity": "sha1-2z/IOJ2BhOluunA3SJc1wTYiep8=" + "webdriverio": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-5.9.2.tgz", + "integrity": "sha512-ub87P5+h4935jEXXxJ5b22sq5sx25LJC0W5oXmNQfHyYWvca+oS75iJS80jGQ6haDUfyvek1PBMBh7M2+ikeIw==", + "requires": { + "@wdio/config": "^5.9.1", + "@wdio/logger": "^5.9.0", + "@wdio/repl": "^5.9.1", + "css-value": "^0.0.1", + "grapheme-splitter": "^1.0.2", + "lodash.isobject": "^3.0.2", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.1", + "lodash.zip": "^4.2.0", + "resq": "^1.5.0", + "rgb2hex": "^0.1.0", + "serialize-error": "^3.0.0", + "webdriver": "^5.9.1" + } }, "which": { "version": "1.3.1", @@ -11485,39 +11146,6 @@ "requires": { "fd-slicer": "~1.0.1" } - }, - "zip-stream": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.2.3.tgz", - "integrity": "sha1-rvCVN2z+E4lZqBNBmB0mM4tG2NM=", - "requires": { - "debug": "~0.7.4", - "lodash.defaults": "~2.4.1", - "readable-stream": "~1.0.24" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } } } } diff --git a/script/package.json b/script/package.json index c6ed49977..35d0cf00e 100644 --- a/script/package.json +++ b/script/package.json @@ -14,7 +14,7 @@ "electron-link": "0.4.0", "electron-mksnapshot": "^3.1.10", "electron-packager": "12.2.0", - "electron-winstaller": "2.6.4", + "@atom/electron-winstaller": "0.0.1", "eslint": "^5.16.0", "eslint-config-prettier": "^4.2.0", "eslint-config-standard": "^12.0.0", @@ -23,7 +23,7 @@ "eslint-plugin-prettier": "^3.0.1", "eslint-plugin-promise": "^4.1.1", "eslint-plugin-standard": "^4.0.0", - "fs-admin": "^0.1.5", + "fs-admin": "^0.5.0", "fs-extra": "0.30.0", "glob": "7.0.3", "joanna": "0.0.10", @@ -46,7 +46,7 @@ "sync-request": "3.0.1", "tello": "1.0.7", "terser": "^3.8.1", - "webdriverio": "2.4.5", + "webdriverio": "^5.9.2", "yargs": "4.8.1" } } diff --git a/script/test b/script/test index 7004b08bc..e6e4737a1 100755 --- a/script/test +++ b/script/test @@ -39,6 +39,7 @@ const childProcess = require('child_process') const fs = require('fs-extra') const glob = require('glob') const path = require('path') +const temp = require('temp').track() const CONFIG = require('./config') const backupNodeModules = require('./lib/backup-node-modules') @@ -63,7 +64,8 @@ if (process.platform === 'darwin') { } function prepareEnv (suiteName) { - const env = Object.assign({}, process.env) + const atomHomeDirPath = temp.mkdirSync(suiteName) + const env = Object.assign({}, process.env, {ATOM_HOME: atomHomeDirPath}) if (process.env.TEST_JUNIT_XML_ROOT) { // Tell Jasmine to output this suite's results as a JUnit XML file to a subdirectory of the root, so that a @@ -116,10 +118,7 @@ for (let packageName in CONFIG.appMetadata.packageDependencies) { const testSubdir = ['spec', 'test'].find(subdir => fs.existsSync(path.join(repositoryPackagePath, subdir))) if (!testSubdir) { - packageTestSuites.push(function (callback) { - console.log(`Skipping tests for ${packageName} because no test folder was found`.bold.yellow) - callback(null, {exitCode: 0, step: `package-${packageName}`}) - }) + console.log(`No test folder found for package: ${packageName}`.yellow) continue } @@ -201,7 +200,17 @@ function testSuitesForPlatform (platform) { let suites = [] switch (platform) { case 'darwin': - suites = [runCoreMainProcessTests, runCoreRenderProcessTests, runBenchmarkTests].concat(packageTestSuites) + const PACKAGES_TO_TEST_IN_PARALLEL = 23 + + if (process.env.ATOM_RUN_CORE_TESTS === 'true') { + suites = [runCoreMainProcessTests, runCoreRenderProcessTests] + } else if (process.env.ATOM_RUN_PACKAGE_TESTS === '1') { + suites = packageTestSuites.slice(0, PACKAGES_TO_TEST_IN_PARALLEL) + } else if (process.env.ATOM_RUN_PACKAGE_TESTS === '2') { + suites = packageTestSuites.slice(PACKAGES_TO_TEST_IN_PARALLEL) + } else { + suites = [runCoreMainProcessTests, runCoreRenderProcessTests].concat(packageTestSuites) + } break case 'win32': suites = (process.arch === 'x64') ? [runCoreMainProcessTests, runCoreRenderProcessTests] : [runCoreMainProcessTests] diff --git a/script/vsts/lib/release-notes.js b/script/vsts/lib/release-notes.js index c76c23317..144518d17 100644 --- a/script/vsts/lib/release-notes.js +++ b/script/vsts/lib/release-notes.js @@ -97,32 +97,60 @@ module.exports.generateForNightly = async function( releaseVersion, githubToken ) { - const releases = await octokit.repos.getReleases({ - owner: 'atom', - repo: 'atom-nightly-releases' - }); - const previousRelease = getPreviousRelease(releaseVersion, releases.data); - const oldReleaseNotes = previousRelease ? previousRelease.body : undefined; - const latestCommitResult = childProcess.spawnSync('git', [ 'rev-parse', '--short', 'HEAD' ]); + if (!latestCommitResult) { + console.log("Couldn't get the current commmit from git."); - if (latestCommitResult && oldReleaseNotes) { - const latestCommit = latestCommitResult.stdout.toString().trim(); - const extractMatch = oldReleaseNotes.match( - /atom\/atom\/compare\/([0-9a-f]{5,40})\.\.\.([0-9a-f]{5,40})/ - ); - if (extractMatch) { - return `### Click [here](https://github.com/atom/atom/compare/${ - extractMatch[2] - }...${latestCommit}) to see the changes included with this release! :atom: :night_with_stars:`; - } + return undefined; } - return undefined; + const latestCommit = latestCommitResult.stdout.toString().trim(); + const output = [ + `### This nightly release is based on https://github.com/atom/atom/commit/${latestCommit} :atom: :night_with_stars:` + ]; + + try { + const releases = await octokit.repos.getReleases({ + owner: 'atom', + repo: 'atom-nightly-releases' + }); + + const previousRelease = getPreviousRelease(releaseVersion, releases.data); + const oldReleaseNotes = previousRelease ? previousRelease.body : undefined; + + if (oldReleaseNotes) { + const extractMatch = oldReleaseNotes.match( + /atom\/atom\/commit\/([0-9a-f]{5,40})/ + ); + if (extractMatch.length > 1 && extractMatch[1]) { + output.push('', '---', ''); + const previousCommit = extractMatch[1]; + + if ( + previousCommit === latestCommit || + previousCommit.startsWith(latestCommit) || + latestCommit.startsWith(previousCommit) + ) { + // TODO: Maybe we can bail out and not publish a release if it contains no commits? + output.push('No changes have been included in this release'); + } else { + output.push( + `Click [here](https://github.com/atom/atom/compare/${previousCommit}...${latestCommit}) to see the changes included with this release!` + ); + } + } + } + } catch (e) { + console.log( + 'Error when trying to find the previous nightly release: ' + e.message + ); + } + + return output.join('\n'); }; function extractWrittenReleaseNotes(oldReleaseNotes) { diff --git a/script/vsts/nightly-release.yml b/script/vsts/nightly-release.yml index ac6537bb9..2faacf724 100644 --- a/script/vsts/nightly-release.yml +++ b/script/vsts/nightly-release.yml @@ -1,65 +1,64 @@ resources: containers: - - container: atom-linux-ci - image: atomeditor/atom-linux-ci:latest + - container: atom-linux-ci + image: atomeditor/atom-linux-ci:latest jobs: + - job: GetReleaseVersion + steps: + # This has to be done separately because VSTS inexplicably + # exits the script block after `npm install` completes. + - script: | + cd script\vsts + npm install + displayName: npm install + - script: node script\vsts\get-release-version.js --nightly + name: Version -- job: GetReleaseVersion - steps: - # This has to be done separately because VSTS inexplicably - # exits the script block after `npm install` completes. - - script: | - cd script\vsts - npm install - displayName: npm install - - script: node script\vsts\get-release-version.js --nightly - name: Version + # Import OS-specific build definitions + - template: platforms/windows.yml + - template: platforms/macos.yml + - template: platforms/linux.yml -# Import OS-specific build definitions -- template: platforms/windows.yml -- template: platforms/macos.yml -- template: platforms/linux.yml + - job: Release + pool: + vmImage: vs2015-win2012r2 # needed for Python 2.7 and gyp -- job: Release - pool: - vmImage: vs2015-win2012r2 # needed for Python 2.7 and gyp + dependsOn: + - GetReleaseVersion + - Windows + - Linux + - macOS_tests - dependsOn: - - GetReleaseVersion - - Windows - - Linux - - macOS + variables: + ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] - variables: - ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - steps: - - task: NodeTool@0 - inputs: - versionSpec: 8.9.3 - displayName: Install Node.js 8.9.3 + # This has to be done separately because VSTS inexplicably + # exits the script block after `npm install` completes. + - script: | + cd script\vsts + npm install + displayName: npm install - # This has to be done separately because VSTS inexplicably - # exits the script block after `npm install` completes. - - script: | - cd script\vsts - npm install - displayName: npm install + - task: DownloadBuildArtifacts@0 + inputs: + itemPattern: '**' + downloadType: 'specific' + displayName: Download Release Artifacts - - task: DownloadBuildArtifacts@0 - inputs: - itemPattern: '**' - downloadType: 'specific' - displayName: Download Release Artifacts - - - script: | - node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --create-github-release --assets-path "$(System.ArtifactsDirectory)" - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) - ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) - ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) - PACKAGE_CLOUD_API_KEY: $(PACKAGE_CLOUD_API_KEY) - displayName: Create Nightly Release + - script: | + node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --create-github-release --assets-path "$(System.ArtifactsDirectory)" --linux-repo-name "atom" + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) + ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) + ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) + PACKAGE_CLOUD_API_KEY: $(PACKAGE_CLOUD_API_KEY) + displayName: Create Nightly Release diff --git a/script/vsts/platforms/linux.yml b/script/vsts/platforms/linux.yml index 1142c428e..cd26d081b 100644 --- a/script/vsts/platforms/linux.yml +++ b/script/vsts/platforms/linux.yml @@ -1,76 +1,99 @@ jobs: -- job: Linux - dependsOn: GetReleaseVersion - timeoutInMinutes: 180 + - job: Linux + dependsOn: GetReleaseVersion + timeoutInMinutes: 180 - variables: - ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] - pool: - # This image is used to host the Docker container that runs the build - vmImage: ubuntu-16.04 + variables: + ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] + pool: + # This image is used to host the Docker container that runs the build + vmImage: ubuntu-16.04 - container: atom-linux-ci + container: atom-linux-ci - steps: - - script: script/bootstrap - displayName: Bootstrap build environment - env: - CI: true - CI_PROVIDER: VSTS + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - - script: script/lint - displayName: Run linter + - script: npm install --global npm@6.2.0 + displayName: Update npm - - script: script/build --no-bootstrap --create-debian-package --create-rpm-package --compress-artifacts - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - displayName: Build Atom + - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + displayName: Restore node_modules cache + inputs: + keyfile: 'package.json, script/vsts/platforms/linux.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' - - script: script/test - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + - script: script/bootstrap + displayName: Bootstrap build environment + env: + CI: true + CI_PROVIDER: VSTS + condition: ne(variables['CacheRestored'], 'true') - - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + displayName: Save node_modules cache + inputs: + keyfile: 'package.json, script/vsts/platforms/linux.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)/junit - testResultsFiles: "**/*.xml" - mergeTestResults: true - testRunTitle: Linux - condition: ne(variables['Atom.SkipTests'], 'true') + - script: script/lint + displayName: Run linter - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom.x86_64.rpm - ArtifactName: atom.x86_64.rpm - ArtifactType: Container - displayName: Upload atom.x84_64.rpm - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - script: script/build --no-bootstrap --create-debian-package --create-rpm-package --compress-artifacts + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + displayName: Build Atom - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.deb - ArtifactName: atom-amd64.deb - ArtifactType: Container - displayName: Upload atom-amd64.deb - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - script: script/test + env: + CI: true + CI_PROVIDER: VSTS + ATOM_JASMINE_REPORTER: list + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + displayName: Run tests + condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.tar.gz - ArtifactName: atom-amd64.tar.gz - ArtifactType: Container - displayName: Upload atom-amd64.tar.gz - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" + env: + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + displayName: Post-process test results + condition: ne(variables['Atom.SkipTests'], 'true') + + - task: PublishTestResults@2 + inputs: + testResultsFormat: JUnit + searchFolder: $(Common.TestResultsDirectory)/junit + testResultsFiles: '**/*.xml' + mergeTestResults: true + testRunTitle: Linux + condition: ne(variables['Atom.SkipTests'], 'true') + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom.x86_64.rpm + ArtifactName: atom.x86_64.rpm + ArtifactType: Container + displayName: Upload atom.x84_64.rpm + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.deb + ArtifactName: atom-amd64.deb + ArtifactType: Container + displayName: Upload atom-amd64.deb + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.tar.gz + ArtifactName: atom-amd64.tar.gz + ArtifactType: Container + displayName: Upload atom-amd64.tar.gz + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) diff --git a/script/vsts/platforms/macos.yml b/script/vsts/platforms/macos.yml index 0ea324633..a8674eaf9 100644 --- a/script/vsts/platforms/macos.yml +++ b/script/vsts/platforms/macos.yml @@ -1,114 +1,195 @@ jobs: -- job: macOS - dependsOn: GetReleaseVersion - timeoutInMinutes: 180 + - job: macOS_build + displayName: macOS build + dependsOn: GetReleaseVersion + timeoutInMinutes: 180 - variables: - ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] - IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] - IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] - pool: - vmImage: macos-10.13 + variables: + ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] + IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] + IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] + pool: + vmImage: macos-10.13 - steps: - - task: NodeTool@0 - inputs: - versionSpec: 8.9.3 - displayName: Install Node.js 8.9.3 + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - - script: npm install --global npm@6.2.0 - displayName: Update npm + - script: npm install --global npm@6.2.0 + displayName: Update npm - - script: script/bootstrap - displayName: Bootstrap build environment - env: - CI: true - CI_PROVIDER: VSTS - NPM_BIN_PATH: /usr/local/bin/npm + - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + displayName: Restore node_modules cache + inputs: + keyfile: 'package.json, script/vsts/platforms/macos.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' - - script: script/lint - displayName: Run linter + - script: script/bootstrap + displayName: Bootstrap build environment + env: + CI: true + CI_PROVIDER: VSTS + NPM_BIN_PATH: /usr/local/bin/npm + condition: ne(variables['CacheRestored'], 'true') - - script: | - if [ $IS_RELEASE_BRANCH == "true" ] || [ $IS_SIGNED_ZIP_BRANCH == "true" ]; then - script/build --no-bootstrap --code-sign --compress-artifacts - else - script/build --no-bootstrap --compress-artifacts - fi - displayName: Build Atom - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - IS_RELEASE_BRANCH: $(IsReleaseBranch) - IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL) - ATOM_MAC_CODE_SIGNING_CERT_PASSWORD: $(ATOM_MAC_CODE_SIGNING_CERT_PASSWORD) - ATOM_MAC_CODE_SIGNING_KEYCHAIN: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN) - ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD) + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + displayName: Save node_modules cache + inputs: + keyfile: 'package.json, script/vsts/platforms/macos.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' - - script: | - osascript -e 'tell application "System Events" to keystroke "x"' # clear screen saver - caffeinate -s script/test # Run with caffeinate to prevent screen saver - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + - script: script/lint + displayName: Run linter - - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') + - script: | + if [ $IS_RELEASE_BRANCH == "true" ] || [ $IS_SIGNED_ZIP_BRANCH == "true" ]; then + script/build --no-bootstrap --code-sign --compress-artifacts + else + script/build --no-bootstrap --compress-artifacts + fi + displayName: Build Atom + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + IS_RELEASE_BRANCH: $(IsReleaseBranch) + IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL) + ATOM_MAC_CODE_SIGNING_CERT_PASSWORD: $(ATOM_MAC_CODE_SIGNING_CERT_PASSWORD) + ATOM_MAC_CODE_SIGNING_KEYCHAIN: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN) + ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD) - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)/junit - testResultsFiles: "**/*.xml" - mergeTestResults: true - testRunTitle: MacOS - condition: ne(variables['Atom.SkipTests'], 'true') + - script: | + cp $(Build.SourcesDirectory)/out/*.zip $(Build.ArtifactStagingDirectory) + displayName: Stage Artifacts - - script: | - cp $(Build.SourcesDirectory)/out/*.zip $(Build.ArtifactStagingDirectory) - displayName: Stage Artifacts + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac.zip + ArtifactName: atom-mac.zip + ArtifactType: Container + displayName: Upload atom-mac.zip + condition: succeeded() - - script: | - mkdir -p $(Build.ArtifactStagingDirectory)/crash-reports - cp ${HOME}/Library/Logs/DiagnosticReports/*.crash $(Build.ArtifactStagingDirectory)/crash-reports - displayName: Stage Crash Reports - condition: failed() + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac-symbols.zip + ArtifactName: atom-mac-symbols.zip + ArtifactType: Container + displayName: Upload atom-mac-symbols.zip + condition: succeeded() - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac.zip - ArtifactName: atom-mac.zip - ArtifactType: Container - displayName: Upload atom-mac.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/docs/output/atom-api.json + ArtifactName: atom-api.json + ArtifactType: Container + displayName: Upload atom-api.json + condition: succeeded() - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac-symbols.zip - ArtifactName: atom-mac-symbols.zip - ArtifactType: Container - displayName: Upload atom-mac-symbols.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - job: macOS_tests + displayName: macOS test + dependsOn: macOS_build + timeoutInMinutes: 180 + pool: + vmImage: macos-10.13 + strategy: + maxParallel: 3 + matrix: + core: + RunCoreTests: true + RunPackageTests: false + packages-1: + RunCoreTests: false + RunPackageTests: 1 + packages-2: + RunCoreTests: false + RunPackageTests: 2 - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/docs/output/atom-api.json - ArtifactName: atom-api.json - ArtifactType: Container - displayName: Upload atom-api.json - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports - ArtifactName: crash-reports.zip - displayName: Upload Crash Reports - condition: failed() + - script: npm install --global npm@6.2.0 + displayName: Update npm + + - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + displayName: Restore node_modules cache + inputs: + keyfile: 'package.json, script/vsts/platforms/macos.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' + + # The artifact caching task does not work on forks, so we need to + # bootstrap again for pull requests coming from forked repositories. + - script: script/bootstrap + displayName: Bootstrap build environment + env: + CI: true + CI_PROVIDER: VSTS + NPM_BIN_PATH: /usr/local/bin/npm + condition: ne(variables['CacheRestored'], 'true') + + - task: DownloadBuildArtifacts@0 + displayName: Download atom-mac.zip + inputs: + artifactName: 'atom-mac.zip' + downloadPath: $(Build.SourcesDirectory) + + - script: unzip atom-mac.zip/atom-mac.zip -d out + displayName: Unzip atom-mac.zip + + - task: DownloadBuildArtifacts@0 + displayName: Download atom-mac-symbols.zip + inputs: + artifactName: 'atom-mac-symbols.zip' + downloadPath: $(Build.SourcesDirectory) + + - script: unzip atom-mac-symbols.zip/atom-mac-symbols.zip -d out + displayName: Unzip atom-mac-symbols.zip + + - script: | + osascript -e 'tell application "System Events" to keystroke "x"' # clear screen saver + caffeinate -s script/test # Run with caffeinate to prevent screen saver + env: + CI: true + CI_PROVIDER: VSTS + ATOM_JASMINE_REPORTER: list + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + ATOM_RUN_CORE_TESTS: $(RunCoreTests) + ATOM_RUN_PACKAGE_TESTS: $(RunPackageTests) + displayName: Run tests + condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + + - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" + env: + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + displayName: Post-process test results + condition: ne(variables['Atom.SkipTests'], 'true') + + - task: PublishTestResults@2 + inputs: + testResultsFormat: JUnit + searchFolder: $(Common.TestResultsDirectory)/junit + testResultsFiles: '**/*.xml' + mergeTestResults: true + testRunTitle: MacOS + condition: ne(variables['Atom.SkipTests'], 'true') + + - script: | + mkdir -p $(Build.ArtifactStagingDirectory)/crash-reports + cp ${HOME}/Library/Logs/DiagnosticReports/*.crash $(Build.ArtifactStagingDirectory)/crash-reports + displayName: Stage Crash Reports + condition: failed() + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports + ArtifactName: crash-reports.zip + displayName: Upload Crash Reports + condition: failed() diff --git a/script/vsts/platforms/windows.yml b/script/vsts/platforms/windows.yml index de8247335..6432cfa17 100644 --- a/script/vsts/platforms/windows.yml +++ b/script/vsts/platforms/windows.yml @@ -1,216 +1,249 @@ jobs: -- job: Windows - dependsOn: GetReleaseVersion - timeoutInMinutes: 180 - strategy: - maxParallel: 2 - matrix: - x64: - buildArch: x64 - x86: - buildArch: x86 + - job: Windows + dependsOn: GetReleaseVersion + timeoutInMinutes: 180 + strategy: + maxParallel: 2 + matrix: + x64: + buildArch: x64 + x86: + buildArch: x86 - pool: - vmImage: vs2015-win2012r2 # needed for python 2.7 and gyp + pool: + vmImage: vs2015-win2012r2 # needed for python 2.7 and gyp - variables: - ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] - IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] - IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] + variables: + ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] + IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] + IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] - steps: - - task: NodeTool@0 - inputs: - versionSpec: 8.9.3 - displayName: Install Node.js 8.9.3 + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - - script: | - ECHO Installing npm-windows-upgrade - npm install --global --production npm-windows-upgrade - displayName: Install npm-windows-upgrade + - script: | + ECHO Installing npm-windows-upgrade + npm install --global --production npm-windows-upgrade + displayName: Install npm-windows-upgrade - - script: | - ECHO Upgrading npm - npm-windows-upgrade --no-spinner --no-prompt --npm-version 6.2.0 - displayName: Install npm 6.2.0 + - script: | + ECHO Upgrading npm + npm-windows-upgrade --no-spinner --no-prompt --npm-version 6.2.0 + displayName: Install npm 6.2.0 - - script: | - cd script\vsts - npm install - displayName: Install Windows build dependencies + - script: | + cd script\vsts + npm install + displayName: Install Windows build dependencies - - script: | - node script\vsts\windows-run.js script\bootstrap.cmd - env: - BUILD_ARCH: $(buildArch) - CI: true - CI_PROVIDER: VSTS - NPM_BIN_PATH: "D:\\a\\_tool\\node\\8.9.3\\x64\\npm.cmd" - displayName: Bootstrap build environment + - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + displayName: Restore node_modules cache (x64) + inputs: + keyfile: 'package.json, script/vsts/platforms/windows.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json, script/vsts/x64-cache-key' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' + condition: eq(variables['buildArch'], 'x64') - - script: node script\vsts\windows-run.js script\lint.cmd - env: - BUILD_ARCH: $(buildArch) - displayName: Run linter + - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 + displayName: Restore node_modules cache (x86) + inputs: + keyfile: 'package.json, script/vsts/platforms/windows.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json, script/vsts/x86-cache-key' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' + condition: eq(variables['buildArch'], 'x86') - - script: | - IF NOT EXIST C:\tmp MKDIR C:\tmp - SET SQUIRREL_TEMP=C:\tmp - IF [%IS_RELEASE_BRANCH%]==[true] ( - ECHO Creating production artifacts for release branch %BUILD_SOURCEBRANCHNAME% - node script\vsts\windows-run.js script\build.cmd --code-sign --compress-artifacts --create-windows-installer - ) ELSE ( - IF [%IS_SIGNED_ZIP_BRANCH%]==[true] ( - ECHO Creating signed CI artifacts for branch %BUILD_SOURCEBRANCHNAME% - node script\vsts\windows-run.js script\build.cmd --code-sign --compress-artifacts - ) ELSE ( - ECHO Pull request build, no code signing will be performed - node script\vsts\windows-run.js script\build.cmd --compress-artifacts - ) - ) - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - BUILD_ARCH: $(buildArch) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL) - ATOM_WIN_CODE_SIGNING_CERT_PASSWORD: $(ATOM_WIN_CODE_SIGNING_CERT_PASSWORD) - IS_RELEASE_BRANCH: $(IsReleaseBranch) - IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) - displayName: Build Atom + - script: | + node script\vsts\windows-run.js script\bootstrap.cmd + env: + BUILD_ARCH: $(buildArch) + CI: true + CI_PROVIDER: VSTS + NPM_BIN_PATH: "D:\\a\\_tool\\node\\10.2.1\\x64\\npm.cmd" + displayName: Bootstrap build environment + condition: ne(variables['CacheRestored'], 'true') - - script: node script\vsts\windows-run.js script\test.cmd - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit - BUILD_ARCH: $(buildArch) - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + displayName: Save node_modules cache (x64) + inputs: + keyfile: 'package.json, script/vsts/platforms/windows.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json, script/vsts/x64-cache-key' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' + condition: eq(variables['buildArch'], 'x64') - - script: > - node script\vsts\windows-run.js script\postprocess-junit-results.cmd - --search-folder %TEST_JUNIT_XML_ROOT% --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') + - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 + displayName: Save node_modules cache (x86) + inputs: + keyfile: 'package.json, script/vsts/platforms/windows.yml, **/package-lock.json, !**/node_modules/**/package-lock.json, !**/.*/**/package-lock.json, script/vsts/x86-cache-key' + targetfolder: '**/node_modules, !**/node_modules/**/node_modules' + vstsFeed: 'bae1bc26-220d-43c7-a955-4de039370de2' + condition: eq(variables['buildArch'], 'x86') - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)\junit - testResultsFiles: "**/*.xml" - mergeTestResults: true - testRunTitle: Windows $(buildArch) - condition: ne(variables['Atom.SkipTests'], 'true') + - script: node script\vsts\windows-run.js script\lint.cmd + env: + BUILD_ARCH: $(buildArch) + displayName: Run linter - - script: | - IF NOT EXIST "%ARTIFACT_STAGING_DIR%\crash-reports" MKDIR "%ARTIFACT_STAGING_DIR%\crash-reports" - IF EXIST "%Temp%\Atom Crashes" ( - FOR %%a in ("%Temp%\Atom Crashes\*.dmp") DO XCOPY "%%a" "%ARTIFACT_STAGING_DIR%\crash-reports" /I - ) - displayName: Stage crash reports - condition: failed() - env: - ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) + - script: | + IF NOT EXIST C:\tmp MKDIR C:\tmp + SET SQUIRREL_TEMP=C:\tmp + IF [%IS_RELEASE_BRANCH%]==[true] ( + ECHO Creating production artifacts for release branch %BUILD_SOURCEBRANCHNAME% + node script\vsts\windows-run.js script\build.cmd --no-bootstrap --code-sign --compress-artifacts --create-windows-installer + ) ELSE ( + IF [%IS_SIGNED_ZIP_BRANCH%]==[true] ( + ECHO Creating signed CI artifacts for branch %BUILD_SOURCEBRANCHNAME% + node script\vsts\windows-run.js script\build.cmd --no-bootstrap --code-sign --compress-artifacts + ) ELSE ( + ECHO Pull request build, no code signing will be performed + node script\vsts\windows-run.js script\build.cmd --no-bootstrap --compress-artifacts + ) + ) + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + BUILD_ARCH: $(buildArch) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL) + ATOM_WIN_CODE_SIGNING_CERT_PASSWORD: $(ATOM_WIN_CODE_SIGNING_CERT_PASSWORD) + IS_RELEASE_BRANCH: $(IsReleaseBranch) + IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) + displayName: Build Atom - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports - ArtifactName: crash-reports - displayName: Publish crash reports on non-release branch - condition: and(failed(), eq(variables['ATOM_RELEASES_S3_KEY'], '')) + - script: node script\vsts\windows-run.js script\test.cmd + env: + CI: true + CI_PROVIDER: VSTS + ATOM_JASMINE_REPORTER: list + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit + BUILD_ARCH: $(buildArch) + displayName: Run tests + condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) - - script: > - node $(Build.SourcesDirectory)\script\vsts\upload-crash-reports.js --crash-report-path "%ARTIFACT_STAGING_DIR%\crash-reports" --s3-path "vsts-artifacts/%BUILD_ID%/" - env: - ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) - ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) - ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) - ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) - BUILD_ID: $(Build.BuildId) - displayName: Upload crash reports to S3 on release branch - condition: and(failed(), ne(variables['ATOM_RELEASES_S3_KEY'], '')) + - script: > + node script\vsts\windows-run.js script\postprocess-junit-results.cmd + --search-folder %TEST_JUNIT_XML_ROOT% --test-results-files "**/*.xml" + env: + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit + displayName: Post-process test results + condition: ne(variables['Atom.SkipTests'], 'true') - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-windows.zip - ArtifactName: atom-x64-windows.zip - ArtifactType: Container - displayName: Upload atom-x64-windows.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x64')) + - task: PublishTestResults@2 + inputs: + testResultsFormat: JUnit + searchFolder: $(Common.TestResultsDirectory)\junit + testResultsFiles: '**/*.xml' + mergeTestResults: true + testRunTitle: Windows $(buildArch) + condition: ne(variables['Atom.SkipTests'], 'true') - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup-x64.exe - ArtifactName: AtomSetup-x64.exe - ArtifactType: Container - displayName: Upload AtomSetup-x64.exe - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) + - script: | + IF NOT EXIST "%ARTIFACT_STAGING_DIR%\crash-reports" MKDIR "%ARTIFACT_STAGING_DIR%\crash-reports" + IF EXIST "%Temp%\Atom Crashes" ( + FOR %%a in ("%Temp%\Atom Crashes\*.dmp") DO XCOPY "%%a" "%ARTIFACT_STAGING_DIR%\crash-reports" /I + ) + displayName: Stage crash reports + condition: failed() + env: + ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-$(ReleaseVersion)-full.nupkg - ArtifactName: atom-x64-$(ReleaseVersion)-full.nupkg - ArtifactType: Container - displayName: Upload atom-x64-$(ReleaseVersion)-full.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports + ArtifactName: crash-reports + displayName: Publish crash reports on non-release branch + condition: and(failed(), eq(variables['ATOM_RELEASES_S3_KEY'], '')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-$(ReleaseVersion)-delta.nupkg - ArtifactName: atom-x64-$(ReleaseVersion)-delta.nupkg - ArtifactType: Container - displayName: Upload atom-x64-$(ReleaseVersion)-delta.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build + - script: > + node $(Build.SourcesDirectory)\script\vsts\upload-crash-reports.js --crash-report-path "%ARTIFACT_STAGING_DIR%\crash-reports" --s3-path "vsts-artifacts/%BUILD_ID%/" + env: + ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) + ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) + ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) + ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) + BUILD_ID: $(Build.BuildId) + displayName: Upload crash reports to S3 on release branch + condition: and(failed(), ne(variables['ATOM_RELEASES_S3_KEY'], '')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES-x64 - ArtifactName: RELEASES-x64 - ArtifactType: Container - displayName: Upload RELEASES-x64 - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-windows.zip + ArtifactName: atom-x64-windows.zip + ArtifactType: Container + displayName: Upload atom-x64-windows.zip + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x64')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-windows.zip - ArtifactName: atom-windows.zip - ArtifactType: Container - displayName: Upload atom-windows.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x86')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup-x64.exe + ArtifactName: AtomSetup-x64.exe + ArtifactType: Container + displayName: Upload AtomSetup-x64.exe + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup.exe - ArtifactName: AtomSetup.exe - ArtifactType: Container - displayName: Upload AtomSetup.exe - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-$(ReleaseVersion)-full.nupkg + ArtifactName: atom-x64-$(ReleaseVersion)-full.nupkg + ArtifactType: Container + displayName: Upload atom-x64-$(ReleaseVersion)-full.nupkg + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-$(ReleaseVersion)-full.nupkg - ArtifactName: atom-$(ReleaseVersion)-full.nupkg - ArtifactType: Container - displayName: Upload atom-$(ReleaseVersion)-full.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-$(ReleaseVersion)-delta.nupkg + ArtifactName: atom-x64-$(ReleaseVersion)-delta.nupkg + ArtifactType: Container + displayName: Upload atom-x64-$(ReleaseVersion)-delta.nupkg + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) + continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-$(ReleaseVersion)-delta.nupkg - ArtifactName: atom-$(ReleaseVersion)-delta.nupkg - ArtifactType: Container - displayName: Upload atom-$(ReleaseVersion)-delta.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) - continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES-x64 + ArtifactName: RELEASES-x64 + ArtifactType: Container + displayName: Upload RELEASES-x64 + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES - ArtifactName: RELEASES - ArtifactType: Container - displayName: Upload RELEASES - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-windows.zip + ArtifactName: atom-windows.zip + ArtifactType: Container + displayName: Upload atom-windows.zip + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x86')) + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup.exe + ArtifactName: AtomSetup.exe + ArtifactType: Container + displayName: Upload AtomSetup.exe + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-$(ReleaseVersion)-full.nupkg + ArtifactName: atom-$(ReleaseVersion)-full.nupkg + ArtifactType: Container + displayName: Upload atom-$(ReleaseVersion)-full.nupkg + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/atom-$(ReleaseVersion)-delta.nupkg + ArtifactName: atom-$(ReleaseVersion)-delta.nupkg + ArtifactType: Container + displayName: Upload atom-$(ReleaseVersion)-delta.nupkg + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES + ArtifactName: RELEASES + ArtifactType: Container + displayName: Upload RELEASES + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) diff --git a/script/vsts/pull-requests.yml b/script/vsts/pull-requests.yml index 5c59cec39..c09c2d816 100644 --- a/script/vsts/pull-requests.yml +++ b/script/vsts/pull-requests.yml @@ -1,24 +1,23 @@ -trigger: none # No CI builds, only PR builds +trigger: none # No CI builds, only PR builds resources: containers: - - container: atom-linux-ci - image: atomeditor/atom-linux-ci:latest + - container: atom-linux-ci + image: atomeditor/atom-linux-ci:latest jobs: + - job: GetReleaseVersion + steps: + # This has to be done separately because VSTS inexplicably + # exits the script block after `npm install` completes. + - script: | + cd script\vsts + npm install + displayName: npm install + - script: node script\vsts\get-release-version.js + name: Version -- job: GetReleaseVersion - steps: - # This has to be done separately because VSTS inexplicably - # exits the script block after `npm install` completes. - - script: | - cd script\vsts - npm install - displayName: npm install - - script: node script\vsts\get-release-version.js - name: Version - -# Import OS-specific build definitions -- template: platforms/windows.yml -- template: platforms/macos.yml -- template: platforms/linux.yml + # Import OS-specific build definitions + - template: platforms/windows.yml + - template: platforms/macos.yml + - template: platforms/linux.yml diff --git a/script/vsts/release-branch-build.yml b/script/vsts/release-branch-build.yml index ab600d80d..52c0dfd25 100644 --- a/script/vsts/release-branch-build.yml +++ b/script/vsts/release-branch-build.yml @@ -1,85 +1,84 @@ trigger: -- master -- 1.* # VSTS only supports wildcards at the end -- electron-* + - master + - 1.* # VSTS only supports wildcards at the end + - electron-* resources: containers: - - container: atom-linux-ci - image: atomeditor/atom-linux-ci:latest + - container: atom-linux-ci + image: atomeditor/atom-linux-ci:latest jobs: + - job: GetReleaseVersion + steps: + # This has to be done separately because VSTS inexplicably + # exits the script block after `npm install` completes. + - script: | + cd script\vsts + npm install + displayName: npm install + - script: node script\vsts\get-release-version.js + name: Version -- job: GetReleaseVersion - steps: - # This has to be done separately because VSTS inexplicably - # exits the script block after `npm install` completes. - - script: | - cd script\vsts - npm install - displayName: npm install - - script: node script\vsts\get-release-version.js - name: Version + # Import OS-specific build definitions. + - template: platforms/windows.yml + - template: platforms/macos.yml + - template: platforms/linux.yml -# Import OS-specific build definitions. -- template: platforms/windows.yml -- template: platforms/macos.yml -- template: platforms/linux.yml + - job: UploadArtifacts + pool: + vmImage: vs2015-win2012r2 # needed for python 2.7 and gyp -- job: UploadArtifacts - pool: - vmImage: vs2015-win2012r2 # needed for python 2.7 and gyp + dependsOn: + - GetReleaseVersion + - Windows + - Linux + - macOS_tests - dependsOn: - - GetReleaseVersion - - Windows - - Linux - - macOS + variables: + ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] + IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] + IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] - variables: - ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] - IsReleaseBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsReleaseBranch'] ] - IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] + steps: + - task: NodeTool@0 + inputs: + versionSpec: 10.2.1 + displayName: Install Node.js 10.2.1 - steps: - - task: NodeTool@0 - inputs: - versionSpec: 8.9.3 - displayName: Install Node.js 8.9.3 + # This has to be done separately because VSTS inexplicably + # exits the script block after `npm install` completes. + - script: | + cd script\vsts + npm install + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + displayName: npm install - # This has to be done separately because VSTS inexplicably - # exits the script block after `npm install` completes. - - script: | - cd script\vsts - npm install - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - displayName: npm install + - task: DownloadBuildArtifacts@0 + inputs: + itemPattern: '**' + downloadType: 'specific' + displayName: Download Release Artifacts - - task: DownloadBuildArtifacts@0 - inputs: - itemPattern: '**' - downloadType: 'specific' - displayName: Download Release Artifacts + - script: | + node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --create-github-release --assets-path "$(System.ArtifactsDirectory)" --linux-repo-name "atom-staging" + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) + ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) + ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) + PACKAGE_CLOUD_API_KEY: $(PACKAGE_CLOUD_API_KEY) + displayName: Create Draft Release + condition: and(succeeded(), eq(variables['Atom.AutoDraftRelease'], 'true'), eq(variables['IsReleaseBranch'], 'true')) - - script: | - node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --create-github-release --assets-path "$(System.ArtifactsDirectory)" --linux-repo-name "atom-staging" - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) - ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) - ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) - PACKAGE_CLOUD_API_KEY: $(PACKAGE_CLOUD_API_KEY) - displayName: Create Draft Release - condition: and(succeeded(), eq(variables['Atom.AutoDraftRelease'], 'true'), eq(variables['IsReleaseBranch'], 'true')) - - - script: | - node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --assets-path "$(System.ArtifactsDirectory)" --s3-path "vsts-artifacts/$(Build.BuildId)/" - env: - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) - ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) - ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) - displayName: Upload CI Artifacts to S3 - condition: and(succeeded(), eq(variables['IsSignedZipBranch'], 'true')) + - script: | + node $(Build.SourcesDirectory)\script\vsts\upload-artifacts.js --assets-path "$(System.ArtifactsDirectory)" --s3-path "vsts-artifacts/$(Build.BuildId)/" + env: + ATOM_RELEASE_VERSION: $(ReleaseVersion) + ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) + ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) + ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) + displayName: Upload CI Artifacts to S3 + condition: and(succeeded(), eq(variables['IsSignedZipBranch'], 'true')) diff --git a/script/vsts/windows-run.js b/script/vsts/windows-run.js index 2ac8760a3..d8538c287 100644 --- a/script/vsts/windows-run.js +++ b/script/vsts/windows-run.js @@ -5,7 +5,7 @@ const path = require('path'); const download = require('download'); const childProcess = require('child_process'); -const nodeVersion = '8.9.3'; +const nodeVersion = '10.2.1'; const nodeFileName = `node-v${nodeVersion}-win-x86`; const extractedNodePath = `c:\\tmp\\${nodeFileName}`; diff --git a/script/vsts/x64-cache-key b/script/vsts/x64-cache-key new file mode 100644 index 000000000..e9b6ac458 --- /dev/null +++ b/script/vsts/x64-cache-key @@ -0,0 +1 @@ +x64 diff --git a/script/vsts/x86-cache-key b/script/vsts/x86-cache-key new file mode 100644 index 000000000..7306afab8 --- /dev/null +++ b/script/vsts/x86-cache-key @@ -0,0 +1 @@ +x86 diff --git a/spec/context-menu-manager-spec.coffee b/spec/context-menu-manager-spec.coffee index 70ab4b3e7..7c977e352 100644 --- a/spec/context-menu-manager-spec.coffee +++ b/spec/context-menu-manager-spec.coffee @@ -334,6 +334,30 @@ describe "ContextMenuManager", -> ] ]) + it "does not add accelerators for multi-keystroke key bindings", -> + atom.keymaps.add('source', { + '.child': { + 'ctrl-a ctrl-b': 'test:multi-keystroke-command' + } + }) + contextMenu.clear() + contextMenu.add('.parent': [{ + label: 'Multi-keystroke command', + command: 'test:multi-keystroke-command', + }]) + + child.focus() + + label = + if process.platform is 'darwin' + '⌃A ⌃B' + else + 'Ctrl+A Ctrl+B' + expect(contextMenu.templateForEvent({target: child})).toEqual([{ + label: "Multi-keystroke command [#{label}]", + command: 'test:multi-keystroke-command', + }]) + describe "::templateForEvent(target) (sorting)", -> it "applies simple sorting rules", -> contextMenu.add('.parent': [{ diff --git a/spec/fixtures/packages/package-with-activation-commands-and-deserializers/index.js b/spec/fixtures/packages/package-with-activation-commands-and-deserializers/index.js new file mode 100644 index 000000000..28c7c70b4 --- /dev/null +++ b/spec/fixtures/packages/package-with-activation-commands-and-deserializers/index.js @@ -0,0 +1,25 @@ +module.exports = { + activateCallCount: 0, + activationCommandCallCount: 0, + + initialize() {}, + activate () { + this.activateCallCount++ + + atom.commands.add('atom-workspace', 'activation-command-2', () => this.activationCommandCallCount++) + }, + + deserializeMethod1 (state) { + return { + wasDeserializedBy: 'deserializeMethod1', + state: state + } + }, + + deserializeMethod2 (state) { + return { + wasDeserializedBy: 'deserializeMethod2', + state: state + } + } +} diff --git a/spec/fixtures/packages/package-with-activation-commands-and-deserializers/package.json b/spec/fixtures/packages/package-with-activation-commands-and-deserializers/package.json new file mode 100644 index 000000000..0a1ded445 --- /dev/null +++ b/spec/fixtures/packages/package-with-activation-commands-and-deserializers/package.json @@ -0,0 +1,14 @@ +{ + "name": "package-with-activation-commands-and-deserializers", + "version": "1.0.0", + "main": "./index", + "activationCommands": { + "atom-workspace": [ + "activation-command-2" + ] + }, + "deserializers": { + "Deserializer1": "deserializeMethod1", + "Deserializer2": "deserializeMethod2" + } +} diff --git a/spec/fixtures/packages/package-with-empty-workspace-openers/index.coffee b/spec/fixtures/packages/package-with-empty-workspace-openers/index.coffee new file mode 100644 index 000000000..78d8802a9 --- /dev/null +++ b/spec/fixtures/packages/package-with-empty-workspace-openers/index.coffee @@ -0,0 +1 @@ +module.exports = activate: -> diff --git a/spec/fixtures/packages/package-with-empty-workspace-openers/package.json b/spec/fixtures/packages/package-with-empty-workspace-openers/package.json new file mode 100644 index 000000000..6f0bbca4c --- /dev/null +++ b/spec/fixtures/packages/package-with-empty-workspace-openers/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-with-empty-workspace-openers", + "version": "0.1.0", + "workspaceOpeners": [] +} diff --git a/spec/fixtures/packages/package-with-workspace-openers/index.coffee b/spec/fixtures/packages/package-with-workspace-openers/index.coffee new file mode 100644 index 000000000..227447421 --- /dev/null +++ b/spec/fixtures/packages/package-with-workspace-openers/index.coffee @@ -0,0 +1,9 @@ +module.exports = + activateCallCount: 0 + openerCount: 0 + + activate: -> + @activateCallCount++ + atom.workspace.addOpener (filePath) => + if filePath is 'atom://fictitious' + @openerCount++ diff --git a/spec/fixtures/packages/package-with-workspace-openers/package.cson b/spec/fixtures/packages/package-with-workspace-openers/package.cson new file mode 100644 index 000000000..c7d5047c9 --- /dev/null +++ b/spec/fixtures/packages/package-with-workspace-openers/package.cson @@ -0,0 +1,5 @@ +{ + "name": "package-with-workspace-openers", + "version": "0.1.0", + "workspaceOpeners": ['atom://fictitious'] +} diff --git a/spec/grammar-registry-spec.js b/spec/grammar-registry-spec.js index da17bdc2c..05fd98b18 100644 --- a/spec/grammar-registry-spec.js +++ b/spec/grammar-registry-spec.js @@ -69,6 +69,23 @@ describe('GrammarRegistry', () => { }); }); + describe('.assignGrammar(buffer, grammar)', () => { + it('allows a TextMate grammar to be assigned directly, even when Tree-sitter is permitted', () => { + grammarRegistry.loadGrammarSync( + require.resolve( + 'language-javascript/grammars/tree-sitter-javascript.cson' + ) + ); + const tmGrammar = grammarRegistry.loadGrammarSync( + require.resolve('language-javascript/grammars/javascript.cson') + ); + + const buffer = new TextBuffer(); + expect(grammarRegistry.assignGrammar(buffer, tmGrammar)).toBe(true); + expect(buffer.getLanguageMode().getGrammar()).toBe(tmGrammar); + }); + }); + describe('.grammarForId(languageId)', () => { it('returns a text-mate grammar when `core.useTreeSitterParsers` is false', () => { atom.config.set('core.useTreeSitterParsers', false, { @@ -859,6 +876,29 @@ describe('GrammarRegistry', () => { expect(buffer2Copy.getLanguageMode().getLanguageId()).toBe('source.js'); }); }); + + describe('when working with grammars', () => { + beforeEach(async () => { + await atom.packages.activatePackage('language-javascript'); + }); + + it('returns only Tree-sitter grammars by default', async () => { + const tmGrammars = atom.grammars.getGrammars(); + const allGrammars = atom.grammars.getGrammars({ + includeTreeSitter: true + }); + expect(allGrammars.length).toBeGreaterThan(tmGrammars.length); + }); + + it('executes the foreach callback on both Tree-sitter and TextMate grammars', async () => { + const numAllGrammars = atom.grammars.getGrammars({ + includeTreeSitter: true + }).length; + let i = 0; + atom.grammars.forEachGrammar(() => i++); + expect(i).toBe(numAllGrammars); + }); + }); }); function retainedBufferCount(grammarRegistry) { diff --git a/spec/integration/helpers/start-atom.coffee b/spec/integration/helpers/start-atom.coffee deleted file mode 100644 index 4820a7120..000000000 --- a/spec/integration/helpers/start-atom.coffee +++ /dev/null @@ -1,165 +0,0 @@ -path = require 'path' -http = require 'http' -temp = require('temp').track() -os = require('os') -remote = require 'remote' -async = require 'async' -{map, extend, once, difference} = require 'underscore-plus' -{spawn, spawnSync} = require 'child_process' -webdriverio = require '../../../script/node_modules/webdriverio' - -AtomPath = remote.process.argv[0] -AtomLauncherPath = path.join(__dirname, "..", "helpers", "atom-launcher.sh") -ChromedriverPath = path.resolve(__dirname, '..', '..', '..', 'script', 'node_modules', 'electron-chromedriver', 'bin', 'chromedriver') -ChromedriverPort = 9515 -ChromedriverURLBase = "/wd/hub" -ChromedriverStatusURL = "http://localhost:#{ChromedriverPort}#{ChromedriverURLBase}/status" - -userDataDir = null - -chromeDriverUp = (done) -> - checkStatus = -> - http - .get ChromedriverStatusURL, (response) -> - if response.statusCode is 200 - done() - else - chromeDriverUp(done) - .on("error", -> chromeDriverUp(done)) - setTimeout(checkStatus, 100) - -chromeDriverDown = (done) -> - checkStatus = -> - http - .get ChromedriverStatusURL, (response) -> - chromeDriverDown(done) - .on("error", done) - setTimeout(checkStatus, 100) - -buildAtomClient = (args, env) -> - userDataDir = temp.mkdirSync('atom-user-data-dir') - client = webdriverio.remote( - host: 'localhost' - port: ChromedriverPort - desiredCapabilities: - browserName: "atom" - chromeOptions: - binary: AtomLauncherPath - args: [ - "atom-path=#{AtomPath}" - "atom-args=#{args.join(" ")}" - "atom-env=#{map(env, (value, key) -> "#{key}=#{value}").join(" ")}" - "dev" - "safe" - "user-data-dir=#{userDataDir}" - ]) - - isRunning = false - client.on "init", -> isRunning = true - client.on "end", -> isRunning = false - - client - .addCommand "waitUntil", (conditionFn, timeout, cb) -> - timedOut = succeeded = false - pollingInterval = Math.min(timeout, 100) - setTimeout((-> timedOut = true), timeout) - async.until( - (-> succeeded or timedOut), - ((next) => - setTimeout(=> - conditionFn.call(this).then( - ((result) -> - succeeded = result - next()), - ((err) -> next(err)) - ) - , pollingInterval)), - ((err) -> cb(err, succeeded))) - - .addCommand "waitForWindowCount", (count, timeout, cb) -> - @waitUntil(-> - @windowHandles().then ({value}) -> value.length is count - , timeout) - .then (result) -> expect(result).toBe(true) - .windowHandles(cb) - - .addCommand "waitForPaneItemCount", (count, timeout, cb) -> - @waitUntil(-> - @execute(-> atom.workspace?.getActivePane()?.getItems().length) - .then(({value}) -> value is count) - , timeout) - .then (result) -> - expect(result).toBe(true) - cb(null) - - .addCommand "treeViewRootDirectories", (cb) -> - @waitForExist('.tree-view', 10000) - .execute(-> - for element in document.querySelectorAll(".tree-view .project-root > .header .name") - element.dataset.path - , cb) - - .addCommand "waitForNewWindow", (fn, timeout, done) -> - @windowHandles (err, {value: oldWindowHandles}) -> - return done() unless isRunning - @call(fn) - .waitForWindowCount(oldWindowHandles.length + 1, 5000) - .then ({value: newWindowHandles}) -> - [newWindowHandle] = difference(newWindowHandles, oldWindowHandles) - return done() unless newWindowHandle - @window(newWindowHandle) - .waitForExist('atom-workspace', 10000, done) - - .addCommand "dispatchCommand", (command, done) -> - @execute "atom.commands.dispatch(document.activeElement, '#{command}')" - .call(done) - -module.exports = (args, env, fn) -> - [chromedriver, chromedriverLogs, chromedriverExit] = [] - - runs -> - chromedriver = spawn(ChromedriverPath, [ - "--verbose", - "--port=#{ChromedriverPort}", - "--url-base=#{ChromedriverURLBase}" - ]) - - chromedriverLogs = [] - chromedriverExit = new Promise (resolve) -> - errorCode = null - chromedriver.on "exit", (code, signal) -> - errorCode = code unless signal? - chromedriver.stderr.on "data", (log) -> - chromedriverLogs.push(log.toString()) - chromedriver.stderr.on "close", -> - resolve(errorCode) - - waitsFor("webdriver to start", chromeDriverUp, 15000) - - waitsFor("tests to run", (done) -> - finish = once -> - client.end() - .then(-> chromedriver.kill()) - .then(chromedriverExit.then( - (errorCode) -> - if errorCode? - jasmine.getEnv().currentSpec.fail """ - Chromedriver exited with code #{errorCode}. - Logs:\n#{chromedriverLogs.join("\n")} - """ - done())) - - client = buildAtomClient(args, env) - - client.on "error", (err) -> - jasmine.getEnv().currentSpec.fail(new Error(err.response?.body?.value?.message)) - finish() - - fn( - client.init() - .waitUntil((-> @windowHandles().then ({value}) -> value.length > 0), 10000) - .waitForExist("atom-workspace", 10000) - ).then(finish) - , 30000) - - waitsFor("webdriver to stop", chromeDriverDown, 15000) diff --git a/spec/integration/helpers/start-atom.js b/spec/integration/helpers/start-atom.js new file mode 100644 index 000000000..09dce64b2 --- /dev/null +++ b/spec/integration/helpers/start-atom.js @@ -0,0 +1,195 @@ +const path = require('path'); +const http = require('http'); +const temp = require('temp').track(); +const remote = require('remote'); +const { once } = require('underscore-plus'); +const { spawn } = require('child_process'); +const webdriverio = require('../../../script/node_modules/webdriverio'); + +const AtomPath = remote.process.argv[0]; +const AtomLauncherPath = path.join( + __dirname, + '..', + 'helpers', + 'atom-launcher.sh' +); +const ChromedriverPath = path.resolve( + __dirname, + '..', + '..', + '..', + 'script', + 'node_modules', + 'electron-chromedriver', + 'bin', + 'chromedriver' +); +const ChromedriverPort = 9515; +const ChromedriverURLBase = '/wd/hub'; +const ChromedriverStatusURL = `http://localhost:${ChromedriverPort}${ChromedriverURLBase}/status`; + +const chromeDriverUp = done => { + const checkStatus = () => + http + .get(ChromedriverStatusURL, response => { + if (response.statusCode === 200) { + done(); + } else { + chromeDriverUp(done); + } + }) + .on('error', () => chromeDriverUp(done)); + + setTimeout(checkStatus, 100); +}; + +const chromeDriverDown = done => { + const checkStatus = () => + http + .get(ChromedriverStatusURL, response => chromeDriverDown(done)) + .on('error', done); + + setTimeout(checkStatus, 100); +}; + +const buildAtomClient = async (args, env) => { + const userDataDir = temp.mkdirSync('atom-user-data-dir'); + const client = await webdriverio.remote({ + host: 'localhost', + port: ChromedriverPort, + capabilities: { + browserName: 'atom', + chromeOptions: { + binary: AtomLauncherPath, + args: [ + `atom-path=${AtomPath}`, + `atom-args=${args.join(' ')}`, + `atom-env=${Object.entries(env) + .map(([key, value]) => `${key}=${value}`) + .join(' ')}`, + 'dev', + 'safe', + `user-data-dir=${userDataDir}` + ] + } + } + }); + + client.addCommand('waitForPaneItemCount', async function(count, timeout) { + await this.waitUntil( + () => + this.execute(() => atom.workspace.getActivePane().getItems().length), + timeout + ); + }); + client.addCommand('treeViewRootDirectories', async function() { + const treeViewElement = await this.$('.tree-view'); + await treeViewElement.waitForExist(10000); + return this.execute(() => + Array.from( + document.querySelectorAll('.tree-view .project-root > .header .name') + ).map(element => element.dataset.path) + ); + }); + client.addCommand('dispatchCommand', async function(command) { + return this.execute( + command => atom.commands.dispatch(document.activeElement, command), + command + ); + }); + + return client; +}; + +module.exports = function(args, env, fn) { + let chromedriver, chromedriverLogs, chromedriverExit; + + runs(() => { + chromedriver = spawn(ChromedriverPath, [ + '--verbose', + `--port=${ChromedriverPort}`, + `--url-base=${ChromedriverURLBase}` + ]); + + chromedriverLogs = []; + chromedriverExit = new Promise(resolve => { + let errorCode = null; + chromedriver.on('exit', (code, signal) => { + if (signal == null) { + errorCode = code; + } + }); + chromedriver.stderr.on('data', log => + chromedriverLogs.push(log.toString()) + ); + chromedriver.stderr.on('close', () => resolve(errorCode)); + }); + }); + + waitsFor('webdriver to start', chromeDriverUp, 15000); + + waitsFor( + 'tests to run', + async done => { + const finish = once(async () => { + await client.deleteSession(); + chromedriver.kill(); + + const errorCode = await chromedriverExit; + if (errorCode != null) { + jasmine.getEnv().currentSpec + .fail(`Chromedriver exited with code ${errorCode}. +Logs:\n${chromedriverLogs.join('\n')}`); + } + done(); + }); + + let client; + try { + client = await buildAtomClient(args, env); + } catch (error) { + jasmine + .getEnv() + .currentSpec.fail(`Unable to build Atom client.\n${error}`); + finish(); + return; + } + + try { + await client.waitUntil(async function() { + const handles = await this.getWindowHandles(); + return handles.length > 0; + }, 10000); + } catch (error) { + jasmine + .getEnv() + .currentSpec.fail(`Unable to locate windows.\n\n${error}`); + finish(); + return; + } + + try { + const workspaceElement = await client.$('atom-workspace'); + await workspaceElement.waitForExist(10000); + } catch (error) { + jasmine + .getEnv() + .currentSpec.fail(`Unable to find workspace element.\n\n${error}`); + finish(); + return; + } + + try { + await fn(client); + } catch (error) { + jasmine.getEnv().currentSpec.fail(error); + finish(); + return; + } + finish(); + }, + 30000 + ); + + waitsFor('webdriver to stop', chromeDriverDown, 15000); +}; diff --git a/spec/integration/smoke-spec.coffee b/spec/integration/smoke-spec.coffee deleted file mode 100644 index dd6c9776f..000000000 --- a/spec/integration/smoke-spec.coffee +++ /dev/null @@ -1,42 +0,0 @@ -fs = require 'fs-plus' -path = require 'path' -season = require 'season' -temp = require('temp').track() -runAtom = require './helpers/start-atom' - -describe "Smoke Test", -> - return unless process.platform is 'darwin' # Fails on win32 - - atomHome = temp.mkdirSync('atom-home') - - beforeEach -> - jasmine.useRealClock() - season.writeFileSync(path.join(atomHome, 'config.cson'), { - '*': { - welcome: {showOnStartup: false}, - core: { - telemetryConsent: 'no', - disabledPackages: ['github'] - } - } - }) - - it "can open a file in Atom and perform basic operations on it", -> - tempDirPath = temp.mkdirSync("empty-dir") - filePath = path.join(tempDirPath, "new-file") - - fs.writeFileSync filePath, "", {encoding: "utf8"} - - runAtom [filePath], {ATOM_HOME: atomHome}, (client) -> - client - .treeViewRootDirectories() - .then ({value}) -> expect(value).toEqual([]) - .waitForExist("atom-text-editor", 5000) - .then (exists) -> expect(exists).toBe true - .waitForPaneItemCount(1, 1000) - .click("atom-text-editor") - .waitUntil((-> @execute(-> document.activeElement.closest('atom-text-editor'))), 5000) - .keys("Hello!") - .execute -> atom.workspace.getActiveTextEditor().getText() - .then ({value}) -> expect(value).toBe "Hello!" - .dispatchCommand("editor:delete-line") diff --git a/spec/integration/smoke-spec.js b/spec/integration/smoke-spec.js new file mode 100644 index 000000000..6e2de3edb --- /dev/null +++ b/spec/integration/smoke-spec.js @@ -0,0 +1,62 @@ +const fs = require('fs-plus'); +const path = require('path'); +const season = require('season'); +const temp = require('temp').track(); +const runAtom = require('./helpers/start-atom'); + +describe('Smoke Test', () => { + // Fails on win32 + if (process.platform !== 'darwin') { + return; + } + + const atomHome = temp.mkdirSync('atom-home'); + + beforeEach(() => { + jasmine.useRealClock(); + season.writeFileSync(path.join(atomHome, 'config.cson'), { + '*': { + welcome: { showOnStartup: false }, + core: { + telemetryConsent: 'no', + disabledPackages: ['github'] + } + } + }); + }); + + it('can open a file in Atom and perform basic operations on it', async () => { + const tempDirPath = temp.mkdirSync('empty-dir'); + const filePath = path.join(tempDirPath, 'new-file'); + + fs.writeFileSync(filePath, '', { encoding: 'utf8' }); + + runAtom([tempDirPath], { ATOM_HOME: atomHome }, async client => { + const roots = await client.treeViewRootDirectories(); + expect(roots).toEqual([tempDirPath]); + + await client.execute(filePath => atom.workspace.open(filePath), filePath); + + const textEditorElement = await client.$('atom-text-editor'); + await textEditorElement.waitForExist(5000); + + await client.waitForPaneItemCount(1, 1000); + + await textEditorElement.click(); + + const closestElement = await client.execute(() => + document.activeElement.closest('atom-text-editor') + ); + expect(closestElement).not.toBeNull(); + + await client.keys('Hello!'); + + const text = await client.execute(() => + atom.workspace.getActiveTextEditor().getText() + ); + expect(text).toBe('Hello!'); + + await client.dispatchCommand('editor:delete-line'); + }); + }); +}); diff --git a/spec/main-process/atom-application.test.js b/spec/main-process/atom-application.test.js index be5dbd1c1..bf04be3e0 100644 --- a/spec/main-process/atom-application.test.js +++ b/spec/main-process/atom-application.test.js @@ -47,6 +47,10 @@ const { describe('AtomApplication', function() { let scenario, sinon; + if (process.env.CI) { + this.timeout(10 * 1000); + } + beforeEach(async function() { sinon = sandbox.create(); scenario = await LaunchScenario.create(sinon); diff --git a/spec/main-process/atom-window.test.js b/spec/main-process/atom-window.test.js index 2f38624b8..939c23fbf 100644 --- a/spec/main-process/atom-window.test.js +++ b/spec/main-process/atom-window.test.js @@ -77,21 +77,6 @@ describe('AtomWindow', function() { ); }); - await new Promise((resolve, reject) => { - fs.symlink( - path.join(original.ATOM_HOME, 'compile-cache'), - path.join(atomHome, 'compile-cache'), - 'junction', - err => { - if (err) { - reject(err); - } else { - resolve(); - } - } - ); - }); - process.env.ATOM_HOME = atomHome; process.env.ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT = 'true'; }); diff --git a/spec/package-manager-spec.js b/spec/package-manager-spec.js index c1feaaf7c..df8735ddb 100644 --- a/spec/package-manager-spec.js +++ b/spec/package-manager-spec.js @@ -625,6 +625,10 @@ describe('PackageManager', () => { }); describe('when the package has a main module', () => { + beforeEach(() => { + spyOn(Package.prototype, 'requireMainModule').andCallThrough(); + }); + describe('when the metadata specifies a main module path˜', () => { it('requires the module at the specified path', async () => { const mainModule = require('./fixtures/packages/package-with-main/main-module'); @@ -680,13 +684,12 @@ describe('PackageManager', () => { mainModule = require('./fixtures/packages/package-with-activation-commands/index'); mainModule.activationCommandCallCount = 0; spyOn(mainModule, 'activate').andCallThrough(); - spyOn(Package.prototype, 'requireMainModule').andCallThrough(); workspaceCommandListener = jasmine.createSpy( 'workspaceCommandListener' ); registration = atom.commands.add( - '.workspace', + 'atom-workspace', 'activation-command', workspaceCommandListener ); @@ -835,72 +838,171 @@ describe('PackageManager', () => { ); }); }); - }); - describe('when the package metadata includes `activationHooks`', () => { - let mainModule, promise; + describe('when the package metadata includes both activation commands and deserializers', () => { + let mainModule, promise, workspaceCommandListener, registration; - beforeEach(() => { - mainModule = require('./fixtures/packages/package-with-activation-hooks/index'); - spyOn(mainModule, 'activate').andCallThrough(); - spyOn(Package.prototype, 'requireMainModule').andCallThrough(); + beforeEach(() => { + jasmine.attachToDOM(atom.workspace.getElement()); + spyOn(atom.packages, 'hasActivatedInitialPackages').andReturn(true); + mainModule = require('./fixtures/packages/package-with-activation-commands-and-deserializers/index'); + mainModule.activationCommandCallCount = 0; + spyOn(mainModule, 'activate').andCallThrough(); + workspaceCommandListener = jasmine.createSpy( + 'workspaceCommandListener' + ); + registration = atom.commands.add( + '.workspace', + 'activation-command-2', + workspaceCommandListener + ); + + promise = atom.packages.activatePackage( + 'package-with-activation-commands-and-deserializers' + ); + }); + + afterEach(() => { + if (registration) { + registration.dispose(); + } + mainModule = null; + }); + + it('activates the package when a deserializer is called', async () => { + expect(Package.prototype.requireMainModule.callCount).toBe(0); + + const state1 = { deserializer: 'Deserializer1', a: 'b' }; + expect(atom.deserializers.deserialize(state1, atom)).toEqual({ + wasDeserializedBy: 'deserializeMethod1', + state: state1 + }); + + await promise; + expect(Package.prototype.requireMainModule.callCount).toBe(1); + }); + + it('defers requiring/activating the main module until an activation event bubbles to the root view', async () => { + expect(Package.prototype.requireMainModule.callCount).toBe(0); + + atom.workspace + .getElement() + .dispatchEvent( + new CustomEvent('activation-command-2', { bubbles: true }) + ); + + await promise; + expect(mainModule.activate.callCount).toBe(1); + expect(mainModule.activationCommandCallCount).toBe(1); + expect(Package.prototype.requireMainModule.callCount).toBe(1); + }); }); - it('defers requiring/activating the main module until an triggering of an activation hook occurs', async () => { - promise = atom.packages.activatePackage( - 'package-with-activation-hooks' - ); - expect(Package.prototype.requireMainModule.callCount).toBe(0); - atom.packages.triggerActivationHook('language-fictitious:grammar-used'); - atom.packages.triggerDeferredActivationHooks(); + describe('when the package metadata includes `activationHooks`', () => { + let mainModule, promise; - await promise; - expect(Package.prototype.requireMainModule.callCount).toBe(1); + beforeEach(() => { + mainModule = require('./fixtures/packages/package-with-activation-hooks/index'); + spyOn(mainModule, 'activate').andCallThrough(); + }); + + it('defers requiring/activating the main module until an triggering of an activation hook occurs', async () => { + promise = atom.packages.activatePackage( + 'package-with-activation-hooks' + ); + expect(Package.prototype.requireMainModule.callCount).toBe(0); + atom.packages.triggerActivationHook( + 'language-fictitious:grammar-used' + ); + atom.packages.triggerDeferredActivationHooks(); + + await promise; + expect(Package.prototype.requireMainModule.callCount).toBe(1); + }); + + it('does not double register activation hooks when deactivating and reactivating', async () => { + promise = atom.packages.activatePackage( + 'package-with-activation-hooks' + ); + expect(mainModule.activate.callCount).toBe(0); + atom.packages.triggerActivationHook( + 'language-fictitious:grammar-used' + ); + atom.packages.triggerDeferredActivationHooks(); + + await promise; + expect(mainModule.activate.callCount).toBe(1); + + await atom.packages.deactivatePackage( + 'package-with-activation-hooks' + ); + + promise = atom.packages.activatePackage( + 'package-with-activation-hooks' + ); + atom.packages.triggerActivationHook( + 'language-fictitious:grammar-used' + ); + atom.packages.triggerDeferredActivationHooks(); + + await promise; + expect(mainModule.activate.callCount).toBe(2); + }); + + it('activates the package immediately when activationHooks is empty', async () => { + mainModule = require('./fixtures/packages/package-with-empty-activation-hooks/index'); + spyOn(mainModule, 'activate').andCallThrough(); + + expect(Package.prototype.requireMainModule.callCount).toBe(0); + + await atom.packages.activatePackage( + 'package-with-empty-activation-hooks' + ); + expect(mainModule.activate.callCount).toBe(1); + expect(Package.prototype.requireMainModule.callCount).toBe(1); + }); + + it('activates the package immediately if the activation hook had already been triggered', async () => { + atom.packages.triggerActivationHook( + 'language-fictitious:grammar-used' + ); + atom.packages.triggerDeferredActivationHooks(); + expect(Package.prototype.requireMainModule.callCount).toBe(0); + + await atom.packages.activatePackage('package-with-activation-hooks'); + expect(mainModule.activate.callCount).toBe(1); + expect(Package.prototype.requireMainModule.callCount).toBe(1); + }); }); - it('does not double register activation hooks when deactivating and reactivating', async () => { - promise = atom.packages.activatePackage( - 'package-with-activation-hooks' - ); - expect(mainModule.activate.callCount).toBe(0); - atom.packages.triggerActivationHook('language-fictitious:grammar-used'); - atom.packages.triggerDeferredActivationHooks(); + describe('when the package metadata includes `workspaceOpeners`', () => { + let mainModule, promise; - await promise; - expect(mainModule.activate.callCount).toBe(1); + beforeEach(() => { + mainModule = require('./fixtures/packages/package-with-workspace-openers/index'); + spyOn(mainModule, 'activate').andCallThrough(); + }); - await atom.packages.deactivatePackage('package-with-activation-hooks'); + it('defers requiring/activating the main module until a registered opener is called', async () => { + promise = atom.packages.activatePackage( + 'package-with-workspace-openers' + ); + expect(Package.prototype.requireMainModule.callCount).toBe(0); + atom.workspace.open('atom://fictitious'); - promise = atom.packages.activatePackage( - 'package-with-activation-hooks' - ); - atom.packages.triggerActivationHook('language-fictitious:grammar-used'); - atom.packages.triggerDeferredActivationHooks(); + await promise; + expect(Package.prototype.requireMainModule.callCount).toBe(1); + expect(mainModule.openerCount).toBe(1); + }); - await promise; - expect(mainModule.activate.callCount).toBe(2); - }); + it('activates the package immediately when the events are empty', async () => { + mainModule = require('./fixtures/packages/package-with-empty-workspace-openers/index'); + spyOn(mainModule, 'activate').andCallThrough(); - it('activates the package immediately when activationHooks is empty', async () => { - mainModule = require('./fixtures/packages/package-with-empty-activation-hooks/index'); - spyOn(mainModule, 'activate').andCallThrough(); + atom.packages.activatePackage('package-with-empty-workspace-openers'); - expect(Package.prototype.requireMainModule.callCount).toBe(0); - - await atom.packages.activatePackage( - 'package-with-empty-activation-hooks' - ); - expect(mainModule.activate.callCount).toBe(1); - expect(Package.prototype.requireMainModule.callCount).toBe(1); - }); - - it('activates the package immediately if the activation hook had already been triggered', async () => { - atom.packages.triggerActivationHook('language-fictitious:grammar-used'); - atom.packages.triggerDeferredActivationHooks(); - expect(Package.prototype.requireMainModule.callCount).toBe(0); - - await atom.packages.activatePackage('package-with-activation-hooks'); - expect(Package.prototype.requireMainModule.callCount).toBe(1); + expect(mainModule.activate.callCount).toBe(1); + }); }); }); diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index e7bfd0249..37ba29883 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -4,9 +4,9 @@ ThemePackage = require '../src/theme-package' {mockLocalStorage} = require './spec-helper' describe "Package", -> - build = (constructor, path) -> + build = (constructor, packagePath) -> new constructor( - path: path, packageManager: atom.packages, config: atom.config, + path: packagePath, packageManager: atom.packages, config: atom.config, styleManager: atom.styles, notificationManager: atom.notifications, keymapManager: atom.keymaps, commandRegistry: atom.command, grammarRegistry: atom.grammars, themeManager: atom.themes, diff --git a/spec/project-spec.js b/spec/project-spec.js index 48d85f026..a812418c7 100644 --- a/spec/project-spec.js +++ b/spec/project-spec.js @@ -1042,11 +1042,12 @@ describe('Project', () => { }); describe('.onDidChangeFiles()', () => { - let sub = []; - const events = []; + let sub; + let events; let checkCallback = () => {}; beforeEach(() => { + events = []; sub = atom.project.onDidChangeFiles(incoming => { events.push(...incoming); checkCallback(); @@ -1058,11 +1059,13 @@ describe('Project', () => { const waitForEvents = paths => { const remaining = new Set(paths.map(p => fs.realpathSync(p))); return new Promise((resolve, reject) => { + let expireTimeoutId; checkCallback = () => { for (let event of events) { remaining.delete(event.path); } if (remaining.size === 0) { + clearTimeout(expireTimeoutId); resolve(); } }; @@ -1075,12 +1078,13 @@ describe('Project', () => { ); }; + expireTimeoutId = setTimeout(expire, 2000); checkCallback(); - setTimeout(expire, 2000); }); }; - it('reports filesystem changes within project paths', () => { + it('reports filesystem changes within project paths', async () => { + jasmine.useRealClock(); const dirOne = temp.mkdirSync('atom-spec-project-one'); const fileOne = path.join(dirOne, 'file-one.txt'); const fileTwo = path.join(dirOne, 'file-two.txt'); @@ -1088,24 +1092,17 @@ describe('Project', () => { const fileThree = path.join(dirTwo, 'file-three.txt'); // Ensure that all preexisting watchers are stopped - waitsForPromise(() => stopAllWatchers()); + await stopAllWatchers(); - runs(() => atom.project.setPaths([dirOne])); - waitsForPromise(() => atom.project.getWatcherPromise(dirOne)); + atom.project.setPaths([dirOne]); + await atom.project.getWatcherPromise(dirOne); - runs(() => { - expect(atom.project.watcherPromisesByPath[dirTwo]).toEqual(undefined); - - fs.writeFileSync(fileThree, 'three\n'); - fs.writeFileSync(fileTwo, 'two\n'); - fs.writeFileSync(fileOne, 'one\n'); - }); - - waitsForPromise(() => waitForEvents([fileOne, fileTwo])); - - runs(() => - expect(events.some(event => event.path === fileThree)).toBeFalsy() - ); + expect(atom.project.watcherPromisesByPath[dirTwo]).toEqual(undefined); + fs.writeFileSync(fileThree, 'three\n'); + fs.writeFileSync(fileTwo, 'two\n'); + fs.writeFileSync(fileOne, 'one\n'); + await waitForEvents([fileOne, fileTwo]); + expect(events.some(event => event.path === fileThree)).toBeFalsy(); }); }); diff --git a/spec/text-editor-component-spec.js b/spec/text-editor-component-spec.js index 1f2752cd0..611f5b7d0 100644 --- a/spec/text-editor-component-spec.js +++ b/spec/text-editor-component-spec.js @@ -3297,9 +3297,12 @@ describe('TextEditorComponent', () => { // make the editor taller and wider and the same time, ensuring the number // of rendered lines is correct. setEditorHeightInLines(component, 13); - await setEditorWidthInCharacters(component, 50); - expect(component.getRenderedStartRow()).toBe(0); - expect(component.getRenderedEndRow()).toBe(13); + setEditorWidthInCharacters(component, 50); + await conditionPromise( + () => + component.getRenderedStartRow() === 0 && + component.getRenderedEndRow() === 13 + ); expect(component.getScrollHeight()).toBe( editor.getScreenLineCount() * component.getLineHeight() + getElementHeight(item2) + diff --git a/spec/tree-sitter-language-mode-spec.js b/spec/tree-sitter-language-mode-spec.js index 06e7fd6de..b3ae42b1c 100644 --- a/spec/tree-sitter-language-mode-spec.js +++ b/spec/tree-sitter-language-mode-spec.js @@ -27,6 +27,9 @@ const ejsGrammarPath = require.resolve( const rubyGrammarPath = require.resolve( 'language-ruby/grammars/tree-sitter-ruby.cson' ); +const rustGrammarPath = require.resolve( + 'language-rust-bundled/grammars/tree-sitter-rust.cson' +); describe('TreeSitterLanguageMode', () => { let editor, buffer; @@ -831,6 +834,81 @@ describe('TreeSitterLanguageMode', () => { ]); }); + it('respects the `includeChildren` property of injection points', async () => { + const rustGrammar = new TreeSitterGrammar( + atom.grammars, + rustGrammarPath, + { + scopeName: 'rust', + parser: 'tree-sitter-rust', + scopes: { + identifier: 'variable', + field_identifier: 'property', + 'call_expression > field_expression > field_identifier': + 'function', + 'macro_invocation > identifier': 'macro' + }, + injectionRegExp: 'rust', + injectionPoints: [ + { + type: 'macro_invocation', + language() { + return 'rust'; + }, + content(node) { + return node.lastChild; + }, + + // The tokens within a `token_tree` are all parsed as separate + // children of the `token_tree`. By default, when adding a language + // injection for a node, the node's children's ranges would be + // excluded from the injection. But for this injection point + // (parsing token trees as rust code), we want to reparse all of the + // content of the token tree. + includeChildren: true + } + ] + } + ); + + atom.grammars.addGrammar(rustGrammar); + + // Macro call within another macro call. + buffer.setText('assert_eq!(a.b.c(), vec![d.e()]); f.g();'); + + const languageMode = new TreeSitterLanguageMode({ + buffer, + grammar: rustGrammar, + grammars: atom.grammars + }); + buffer.setLanguageMode(languageMode); + + // There should not be duplicate scopes due to the root layer + // and for the injected rust layer. + expectTokensToEqual(editor, [ + [ + { text: 'assert_eq', scopes: ['macro'] }, + { text: '!(', scopes: [] }, + { text: 'a', scopes: ['variable'] }, + { text: '.', scopes: [] }, + { text: 'b', scopes: ['property'] }, + { text: '.', scopes: [] }, + { text: 'c', scopes: ['function'] }, + { text: '(), ', scopes: [] }, + { text: 'vec', scopes: ['macro'] }, + { text: '![', scopes: [] }, + { text: 'd', scopes: ['variable'] }, + { text: '.', scopes: [] }, + { text: 'e', scopes: ['function'] }, + { text: '()]); ', scopes: [] }, + { text: 'f', scopes: ['variable'] }, + { text: '.', scopes: [] }, + { text: 'g', scopes: ['function'] }, + { text: '();', scopes: [] } + ] + ]); + }); + it('notifies onDidTokenize listeners the first time all syntax highlighting is done', async () => { const promise = new Promise(resolve => { editor.onDidTokenize(event => { @@ -1477,7 +1555,7 @@ describe('TreeSitterLanguageMode', () => { scopes: {}, folds: [ { - type: ['element', 'raw_element'], + type: ['element', 'script_element'], start: { index: 0 }, end: { index: -1 } } @@ -1618,7 +1696,7 @@ describe('TreeSitterLanguageMode', () => { parser: 'tree-sitter-html', scopes: { fragment: 'text.html', - raw_element: 'script.tag' + script_element: 'script.tag' }, injectionRegExp: 'html', injectionPoints: [SCRIPT_TAG_INJECTION_POINT] @@ -1781,7 +1859,7 @@ describe('TreeSitterLanguageMode', () => { 'text.html', 'fragment', 'element', - 'raw_element', + 'script_element', 'raw_text', 'program', 'expression_statement', @@ -1811,7 +1889,7 @@ describe('TreeSitterLanguageMode', () => { [0, 5], [0, 8] ]); - expect(editor.bufferRangeForScopeAtPosition(null, [0, 9])).toEqual([ + expect(editor.bufferRangeForScopeAtPosition(null, [0, 8])).toEqual([ [0, 8], [0, 9] ]); @@ -2210,6 +2288,47 @@ describe('TreeSitterLanguageMode', () => { expect(editor.getSelectedText()).toBe('html ` c${def()}e${f}g `'); }); }); + + describe('.tokenizedLineForRow(row)', () => { + it('returns a shimmed TokenizedLine with tokens', () => { + const grammar = new TreeSitterGrammar(atom.grammars, jsGrammarPath, { + parser: 'tree-sitter-javascript', + scopes: { + program: 'source', + 'call_expression > identifier': 'function', + property_identifier: 'property', + 'call_expression > member_expression > property_identifier': 'method', + identifier: 'variable' + } + }); + + buffer.setText('aa.bbb = cc(d.eee());\n\n \n b'); + + const languageMode = new TreeSitterLanguageMode({ buffer, grammar }); + buffer.setLanguageMode(languageMode); + + expect(languageMode.tokenizedLineForRow(0).tokens).toEqual([ + { value: 'aa', scopes: ['source', 'variable'] }, + { value: '.', scopes: ['source'] }, + { value: 'bbb', scopes: ['source', 'property'] }, + { value: ' = ', scopes: ['source'] }, + { value: 'cc', scopes: ['source', 'function'] }, + { value: '(', scopes: ['source'] }, + { value: 'd', scopes: ['source', 'variable'] }, + { value: '.', scopes: ['source'] }, + { value: 'eee', scopes: ['source', 'method'] }, + { value: '());', scopes: ['source'] } + ]); + expect(languageMode.tokenizedLineForRow(1).tokens).toEqual([]); + expect(languageMode.tokenizedLineForRow(2).tokens).toEqual([ + { value: ' ', scopes: ['source'] } + ]); + expect(languageMode.tokenizedLineForRow(3).tokens).toEqual([ + { value: ' ', scopes: ['source'] }, + { value: 'b', scopes: ['source', 'variable'] } + ]); + }); + }); }); function nextHighlightingUpdate(languageMode) { @@ -2290,7 +2409,7 @@ const HTML_TEMPLATE_LITERAL_INJECTION_POINT = { }; const SCRIPT_TAG_INJECTION_POINT = { - type: 'raw_element', + type: 'script_element', language() { return 'javascript'; }, diff --git a/spec/workspace-spec.js b/spec/workspace-spec.js index d080f5fc8..5af18e3cc 100644 --- a/spec/workspace-spec.js +++ b/spec/workspace-spec.js @@ -1994,15 +1994,18 @@ describe('Workspace', () => { expect( atom2.grammars - .getGrammars() + .getGrammars({ includeTreeSitter: true }) .map(grammar => grammar.scopeName) .sort() ).toEqual([ 'source.coffee', + 'source.js', // Tree-sitter grammars also load 'source.js', 'source.js.regexp', + 'source.js.regexp', 'source.js.regexp.replacement', 'source.jsdoc', + 'source.jsdoc', 'source.litcoffee', 'text.plain.null-grammar', 'text.todo' @@ -2697,11 +2700,11 @@ describe('Workspace', () => { }); }); - describe('when the core.excludeVcsIgnoredPaths config is truthy', () => { + describe('when the core.excludeVcsIgnoredPaths config is used', () => { let projectPath; let ignoredPath; - beforeEach(() => { + beforeEach(async () => { const sourceProjectPath = path.join( __dirname, 'fixtures', @@ -2713,22 +2716,17 @@ describe('Workspace', () => { const writerStream = fstream.Writer(projectPath); fstream.Reader(sourceProjectPath).pipe(writerStream); - waitsFor(done => { - writerStream.on('close', done); - writerStream.on('error', done); + await new Promise(resolve => { + writerStream.on('close', resolve); + writerStream.on('error', resolve); }); - runs(() => { - fs.renameSync( - path.join(projectPath, 'git.git'), - path.join(projectPath, '.git') - ); - ignoredPath = path.join(projectPath, 'ignored.txt'); - fs.writeFileSync( - ignoredPath, - 'this match should not be included' - ); - }); + fs.renameSync( + path.join(projectPath, 'git.git'), + path.join(projectPath, '.git') + ); + ignoredPath = path.join(projectPath, 'ignored.txt'); + fs.writeFileSync(ignoredPath, 'this match should not be included'); }); afterEach(() => { @@ -2737,15 +2735,144 @@ describe('Workspace', () => { } }); - it('excludes ignored files', async () => { + it('excludes ignored files when core.excludeVcsIgnoredPaths is true', async () => { atom.project.setPaths([projectPath]); atom.config.set('core.excludeVcsIgnoredPaths', true); const resultHandler = jasmine.createSpy('result found'); - await scan(/match/, {}, () => resultHandler()); + await scan(/match/, {}, ({ filePath }) => resultHandler(filePath)); expect(resultHandler).not.toHaveBeenCalled(); }); + + it('does not exclude ignored files when core.excludeVcsIgnoredPaths is false', async () => { + atom.project.setPaths([projectPath]); + atom.config.set('core.excludeVcsIgnoredPaths', false); + const resultHandler = jasmine.createSpy('result found'); + + await scan(/match/, {}, ({ filePath }) => resultHandler(filePath)); + + expect(resultHandler).toHaveBeenCalledWith( + path.join(projectPath, 'ignored.txt') + ); + }); + + it('does not exclude files when searching on an ignored folder even when core.excludeVcsIgnoredPaths is true', async () => { + fs.mkdirSync(path.join(projectPath, 'poop')); + ignoredPath = path.join( + path.join(projectPath, 'poop', 'whatever.txt') + ); + fs.writeFileSync(ignoredPath, 'this match should be included'); + + atom.project.setPaths([projectPath]); + atom.config.set('core.excludeVcsIgnoredPaths', true); + const resultHandler = jasmine.createSpy('result found'); + + await scan(/match/, { paths: ['poop'] }, ({ filePath }) => + resultHandler(filePath) + ); + + expect(resultHandler).toHaveBeenCalledWith(ignoredPath); + }); + }); + + describe('when the core.followSymlinks config is used', () => { + let projectPath; + + beforeEach(async () => { + const sourceProjectPath = path.join( + __dirname, + 'fixtures', + 'dir', + 'a-dir' + ); + projectPath = path.join(temp.mkdirSync('atom')); + + const writerStream = fstream.Writer(projectPath); + fstream.Reader(sourceProjectPath).pipe(writerStream); + + await new Promise(resolve => { + writerStream.on('close', resolve); + writerStream.on('error', resolve); + }); + + fs.symlinkSync( + path.join(__dirname, 'fixtures', 'dir', 'b'), + path.join(projectPath, 'symlink') + ); + }); + + afterEach(() => { + if (fs.existsSync(projectPath)) { + fs.removeSync(projectPath); + } + }); + + it('follows symlinks when core.followSymlinks is true', async () => { + atom.project.setPaths([projectPath]); + atom.config.set('core.followSymlinks', true); + const resultHandler = jasmine.createSpy('result found'); + + await scan(/ccc/, {}, ({ filePath }) => resultHandler(filePath)); + + expect(resultHandler).toHaveBeenCalledWith( + path.join(projectPath, 'symlink') + ); + }); + + it('does not follow symlinks when core.followSymlinks is false', async () => { + atom.project.setPaths([projectPath]); + atom.config.set('core.followSymlinks', false); + const resultHandler = jasmine.createSpy('result found'); + + await scan(/ccc/, {}, ({ filePath }) => resultHandler(filePath)); + + expect(resultHandler).not.toHaveBeenCalled(); + }); + }); + + describe('when there are hidden files', () => { + let projectPath; + + beforeEach(async () => { + const sourceProjectPath = path.join( + __dirname, + 'fixtures', + 'dir', + 'a-dir' + ); + projectPath = path.join(temp.mkdirSync('atom')); + + const writerStream = fstream.Writer(projectPath); + fstream.Reader(sourceProjectPath).pipe(writerStream); + + await new Promise(resolve => { + writerStream.on('close', resolve); + writerStream.on('error', resolve); + }); + + // Note: This won't create a hidden file on Windows, in order to more + // accurately test this behaviour there, we should either use a package + // like `fswin` or manually spawn an `ATTRIB` command. + fs.writeFileSync(path.join(projectPath, '.hidden'), 'ccc'); + }); + + afterEach(() => { + if (fs.existsSync(projectPath)) { + fs.removeSync(projectPath); + } + }); + + it('searches on hidden files', async () => { + atom.project.setPaths([projectPath]); + const resultHandler = jasmine.createSpy('result found'); + + await scan(/ccc/, {}, ({ filePath }) => resultHandler(filePath)); + + expect(resultHandler).toHaveBeenCalledWith( + path.join(projectPath, '.hidden') + ); + }); }); it('includes only files when a directory filter is specified', async () => { diff --git a/src/atom-environment.js b/src/atom-environment.js index 45a551a5c..18c183a26 100644 --- a/src/atom-environment.js +++ b/src/atom-environment.js @@ -313,6 +313,8 @@ class AtomEnvironment { this.attachSaveStateListeners(); this.windowEventHandler.initialize(this.window, this.document); + this.workspace.initialize(); + const didChangeStyles = this.didChangeStyles.bind(this); this.disposables.add(this.styles.onDidAddStyleElement(didChangeStyles)); this.disposables.add(this.styles.onDidUpdateStyleElement(didChangeStyles)); @@ -429,7 +431,7 @@ class AtomEnvironment { this.workspace.reset(this.packages); this.registerDefaultOpeners(); this.project.reset(this.packages); - this.workspace.subscribeToEvents(); + this.workspace.initialize(); this.grammars.clear(); this.textEditors.clear(); this.views.clear(); diff --git a/src/context-menu-manager.coffee b/src/context-menu-manager.coffee index 9cff5497b..99fc4e94c 100644 --- a/src/context-menu-manager.coffee +++ b/src/context-menu-manager.coffee @@ -6,6 +6,7 @@ fs = require 'fs-plus' {remote} = require 'electron' MenuHelpers = require './menu-helpers' {sortMenuItems} = require './menu-sort-helpers' +_ = require 'underscore-plus' platformContextMenu = require('../package.json')?._atomMenu?['context-menu'] @@ -158,8 +159,15 @@ class ContextMenuManager for id, item of template if item.command keymaps = @keymapManager.findKeyBindings({command: item.command, target: document.activeElement}) - accelerator = MenuHelpers.acceleratorForKeystroke(keymaps?[0]?.keystrokes) - item.accelerator = accelerator if accelerator + keystrokes = keymaps?[0]?.keystrokes + if keystrokes + # Electron does not support multi-keystroke accelerators. Therefore, + # when the command maps to a multi-stroke key binding, show the + # keystrokes next to the item's label. + if keystrokes.includes(' ') + item.label += " [#{_.humanizeKeystroke(keystrokes)}]" + else + item.accelerator = MenuHelpers.acceleratorForKeystroke(keystrokes) if Array.isArray(item.submenu) @addAccelerators(item.submenu) diff --git a/src/default-directory-searcher.js b/src/default-directory-searcher.js index 982fd5b19..0946ec304 100644 --- a/src/default-directory-searcher.js +++ b/src/default-directory-searcher.js @@ -82,7 +82,7 @@ module.exports = class DefaultDirectorySearcher { // Each item in the array is a file/directory pattern, e.g., `src` to search in the "src" // directory or `*.js` to search all JavaScript files. In practice, this often comes from the // comma-delimited list of patterns in the bottom text input of the ProjectFindView dialog. - // * `ignoreHidden` {boolean} whether to ignore hidden files. + // * `includeHidden` {boolean} whether to ignore hidden files. // * `excludeVcsIgnores` {boolean} whether to exclude VCS ignored paths. // * `exclusions` {Array} similar to inclusions // * `follow` {boolean} whether symlinks should be followed. diff --git a/src/grammar-registry.js b/src/grammar-registry.js index ec678abc5..5deda75e1 100644 --- a/src/grammar-registry.js +++ b/src/grammar-registry.js @@ -148,6 +148,26 @@ module.exports = class GrammarRegistry { return true; } + // Extended: Force a {TextBuffer} to use a different grammar than the + // one that would otherwise be selected for it. + // + // * `buffer` The {TextBuffer} whose grammar will be set. + // * `grammar` The desired {Grammar}. + // + // Returns a {Boolean} that indicates whether the assignment was sucessful + assignGrammar(buffer, grammar) { + if (!grammar) return false; + if (buffer.getBuffer) buffer = buffer.getBuffer(); + this.languageOverridesByBufferId.set(buffer.id, grammar.scopeName || null); + this.grammarScoresByBuffer.set(buffer, null); + if (grammar !== buffer.getLanguageMode().grammar) { + buffer.setLanguageMode( + this.languageModeForGrammarAndBuffer(grammar, buffer) + ); + } + return true; + } + // Extended: Get the `languageId` that has been explicitly assigned to // to the given buffer, if any. // @@ -330,11 +350,7 @@ module.exports = class GrammarRegistry { } forEachGrammar(callback) { - this.textmateRegistry.grammars.forEach(callback); - for (const grammarId in this.treeSitterGrammarsById) { - const grammar = this.treeSitterGrammarsById[grammarId]; - if (grammar.scopeName) callback(grammar); - } + this.getGrammars({ includeTreeSitter: true }).forEach(callback); } grammarForId(languageId) { @@ -482,7 +498,7 @@ module.exports = class GrammarRegistry { } get grammars() { - return this.textmateRegistry.grammars; + return this.getGrammars(); } decodeTokens() { @@ -601,9 +617,19 @@ module.exports = class GrammarRegistry { // Extended: Get all the grammars in this registry. // + // * `options` (optional) {Object} + // * `includeTreeSitter` (optional) {Boolean} Set to include + // [Tree-sitter](https://github.blog/2018-10-31-atoms-new-parsing-system/) grammars + // // Returns a non-empty {Array} of {Grammar} instances. - getGrammars() { - return this.textmateRegistry.getGrammars(); + getGrammars(params) { + let tmGrammars = this.textmateRegistry.getGrammars(); + if (!(params && params.includeTreeSitter)) return tmGrammars; + + const tsGrammars = Object.values(this.treeSitterGrammarsById).filter( + g => g.scopeName + ); + return tmGrammars.concat(tsGrammars); // NullGrammar is expected to be first } scopeForId(id) { diff --git a/src/initialize-application-window.js b/src/initialize-application-window.js index d8388ab9f..f32d7633d 100644 --- a/src/initialize-application-window.js +++ b/src/initialize-application-window.js @@ -41,6 +41,7 @@ if (global.isGeneratingSnapshot) { require('language-html'); require('language-javascript'); require('language-ruby'); + require('language-rust-bundled'); require('language-typescript'); require('line-ending-selector'); require('link'); diff --git a/src/main-process/application-menu.js b/src/main-process/application-menu.js index 15834ef2a..e2faa5e76 100644 --- a/src/main-process/application-menu.js +++ b/src/main-process/application-menu.js @@ -222,10 +222,18 @@ module.exports = class ApplicationMenu { template.forEach(item => { if (item.metadata == null) item.metadata = {}; if (item.command) { - item.accelerator = this.acceleratorForCommand( - item.command, - keystrokesByCommand - ); + const keystrokes = keystrokesByCommand[item.command]; + if (keystrokes && keystrokes.length > 0) { + const keystroke = keystrokes[0]; + // Electron does not support multi-keystroke accelerators. Therefore, + // when the command maps to a multi-stroke key binding, show the + // keystrokes next to the item's label. + if (keystroke.includes(' ')) { + item.label += ` [${_.humanizeKeystroke(keystroke)}]`; + } else { + item.accelerator = MenuHelpers.acceleratorForKeystroke(keystroke); + } + } item.click = () => global.atomApplication.sendCommand(item.command, item.commandDetail); if (!/^application:/.test(item.command)) { @@ -237,18 +245,4 @@ module.exports = class ApplicationMenu { }); return template; } - - // Determine the accelerator for a given command. - // - // command - The name of the command. - // keystrokesByCommand - An Object where the keys are commands and the values - // are Arrays containing the keystroke. - // - // Returns a String containing the keystroke in a format that can be interpreted - // by Electron to provide nice icons where available. - acceleratorForCommand(command, keystrokesByCommand) { - const firstKeystroke = - keystrokesByCommand[command] && keystrokesByCommand[command][0]; - return MenuHelpers.acceleratorForKeystroke(firstKeystroke); - } }; diff --git a/src/main-process/atom-application.js b/src/main-process/atom-application.js index fde5b2498..097f0c0d6 100644 --- a/src/main-process/atom-application.js +++ b/src/main-process/atom-application.js @@ -283,7 +283,12 @@ module.exports = class AtomApplication extends EventEmitter { // We need to do this because `listenForArgumentsFromNewProcess()` calls `crypto.randomBytes`, // which is really slow on Windows machines. // (TodoElectronIssue: This got fixed in electron v3: https://github.com/electron/electron/issues/2073). - const socketServerPromise = this.listenForArgumentsFromNewProcess(options); + let socketServerPromise; + if (options.test || options.benchmark || options.benchmarkTest) { + socketServerPromise = Promise.resolve(); + } else { + socketServerPromise = this.listenForArgumentsFromNewProcess(); + } this.setupDockMenu(); @@ -505,12 +510,10 @@ module.exports = class AtomApplication extends EventEmitter { // You can run the atom command multiple times, but after the first launch // the other launches will just pass their information to this server and then // close immediately. - async listenForArgumentsFromNewProcess(options) { - if (!options.test && !options.benchmark && !options.benchmarkTest) { - this.socketSecretPromise = createSocketSecret(this.version); - this.socketSecret = await this.socketSecretPromise; - this.socketPath = getSocketPath(this.socketSecret); - } + async listenForArgumentsFromNewProcess() { + this.socketSecretPromise = createSocketSecret(this.version); + this.socketSecret = await this.socketSecretPromise; + this.socketPath = getSocketPath(this.socketSecret); await this.deleteSocketFile(); diff --git a/src/menu-manager.coffee b/src/menu-manager.coffee index a3d35a1de..e87d4827e 100644 --- a/src/menu-manager.coffee +++ b/src/menu-manager.coffee @@ -161,7 +161,6 @@ class MenuManager for binding in @keymapManager.getKeyBindings() continue unless @includeSelector(binding.selector) continue if unsetKeystrokes.has(binding.keystrokes) - continue if binding.keystrokes.includes(' ') continue if process.platform is 'darwin' and /^alt-(shift-)?.$/.test(binding.keystrokes) continue if process.platform is 'win32' and /^ctrl-alt-(shift-)?.$/.test(binding.keystrokes) keystrokesByCommand[binding.command] ?= [] diff --git a/src/native-compile-cache.js b/src/native-compile-cache.js index 5b097954c..422fbccd9 100644 --- a/src/native-compile-cache.js +++ b/src/native-compile-cache.js @@ -43,7 +43,7 @@ class NativeCompileCache { const script = new vm.Script(code, { filename, produceCachedData: true }); return { result: script.runInThisContext(), - cacheBuffer: script.cachedData + cacheBuffer: script.cachedDataProduced ? script.cachedData : null }; } @@ -102,7 +102,7 @@ class NativeCompileCache { console.error(`Error running script ${filename}`); throw err; } - if (compilationResult.cacheBuffer !== null) { + if (compilationResult.cacheBuffer) { self.cacheStore.set(cacheKey, compilationResult.cacheBuffer); } compiledWrapper = compilationResult.result; diff --git a/src/package.js b/src/package.js index 019a8d179..dd5105708 100644 --- a/src/package.js +++ b/src/package.js @@ -169,6 +169,7 @@ module.exports = class Package { this.settings = []; this.mainInitialized = false; this.mainActivated = false; + this.deserialized = false; } initializeIfNeeded() { @@ -248,6 +249,8 @@ module.exports = class Package { this.activationCommandSubscriptions.dispose(); if (this.activationHookSubscriptions) this.activationHookSubscriptions.dispose(); + if (this.workspaceOpenerSubscriptions) + this.workspaceOpenerSubscriptions.dispose(); } catch (error) { this.handleError(`Failed to activate the ${this.name} package`, error); } @@ -559,6 +562,19 @@ module.exports = class Package { this.registerViewProviders(); this.requireMainModule(); this.initializeIfNeeded(); + if (atomEnvironment.packages.hasActivatedInitialPackages()) { + // Only explicitly activate the package if initial packages + // have finished activating. This is because deserialization + // generally occurs at Atom startup, which happens before the + // workspace element is added to the DOM and is inconsistent with + // with when initial package activation occurs. Triggering activation + // immediately may cause problems with packages that expect to + // always have access to the workspace element. + // Otherwise, we just set the deserialized flag and package-manager + // will activate this package as normal during initial package activation. + this.activateNow(); + } + this.deserialized = true; return this.mainModule[methodName](state, atomEnvironment); } }); @@ -933,9 +949,11 @@ module.exports = class Package { activationShouldBeDeferred() { return ( - this.hasActivationCommands() || - this.hasActivationHooks() || - this.hasDeferredURIHandler() + !this.deserialized && + (this.hasActivationCommands() || + this.hasActivationHooks() || + this.hasWorkspaceOpeners() || + this.hasDeferredURIHandler()) ); } @@ -944,6 +962,11 @@ module.exports = class Package { return hooks && hooks.length > 0; } + hasWorkspaceOpeners() { + const openers = this.getWorkspaceOpeners(); + return openers && openers.length > 0; + } + hasActivationCommands() { const object = this.getActivationCommands(); for (let selector in object) { @@ -961,6 +984,7 @@ module.exports = class Package { subscribeToDeferredActivation() { this.subscribeToActivationCommands(); this.subscribeToActivationHooks(); + this.subscribeToWorkspaceOpeners(); } subscribeToActivationCommands() { @@ -1058,6 +1082,41 @@ module.exports = class Package { return this.activationHooks; } + subscribeToWorkspaceOpeners() { + this.workspaceOpenerSubscriptions = new CompositeDisposable(); + for (let opener of this.getWorkspaceOpeners()) { + this.workspaceOpenerSubscriptions.add( + atom.workspace.addOpener(filePath => { + if (filePath === opener) { + this.activateNow(); + this.workspaceOpenerSubscriptions.dispose(); + return atom.workspace.createItemForURI(opener); + } + }) + ); + } + } + + getWorkspaceOpeners() { + if (this.workspaceOpeners) return this.workspaceOpeners; + + if (this.metadata.workspaceOpeners) { + if (Array.isArray(this.metadata.workspaceOpeners)) { + this.workspaceOpeners = Array.from( + new Set(this.metadata.workspaceOpeners) + ); + } else if (typeof this.metadata.workspaceOpeners === 'string') { + this.workspaceOpeners = [this.metadata.workspaceOpeners]; + } else { + this.workspaceOpeners = []; + } + } else { + this.workspaceOpeners = []; + } + + return this.workspaceOpeners; + } + getURIHandler() { return this.metadata && this.metadata.uriHandler; } diff --git a/src/ripgrep-directory-searcher.js b/src/ripgrep-directory-searcher.js index cdef3fc88..f538f6d17 100644 --- a/src/ripgrep-directory-searcher.js +++ b/src/ripgrep-directory-searcher.js @@ -193,7 +193,7 @@ module.exports = class RipgrepDirectorySearcher { // Each item in the array is a file/directory pattern, e.g., `src` to search in the "src" // directory or `*.js` to search all JavaScript files. In practice, this often comes from the // comma-delimited list of patterns in the bottom text input of the ProjectFindView dialog. - // * `ignoreHidden` {boolean} whether to ignore hidden files. + // * `includeHidden` {boolean} whether to ignore hidden files. // * `excludeVcsIgnores` {boolean} whether to exclude VCS ignored paths. // * `exclusions` {Array} similar to inclusions // * `follow` {boolean} whether symlinks should be followed. @@ -230,7 +230,7 @@ module.exports = class RipgrepDirectorySearcher { const directoryPath = directory.getPath(); const regexpStr = this.prepareRegexp(regexp.source); - const args = ['--hidden', '--json', '--regexp', regexpStr]; + const args = ['--json', '--regexp', regexpStr]; if (options.leadingContextLineCount) { args.push('--before-context', options.leadingContextLineCount); } @@ -257,10 +257,22 @@ module.exports = class RipgrepDirectorySearcher { args.push('--multiline'); } - args.push(directoryPath); + if (options.includeHidden) { + args.push('--hidden'); + } + + if (options.follow) { + args.push('--follow'); + } + + if (!options.excludeVcsIgnores) { + args.push('--no-ignore-vcs'); + } + + args.push('.'); const child = spawn(this.rgPath, args, { - cwd: directory.getPath(), + cwd: directoryPath, stdio: ['pipe', 'pipe', 'pipe'] }); @@ -301,7 +313,7 @@ module.exports = class RipgrepDirectorySearcher { if (message.type === 'begin') { pendingEvent = { - filePath: getText(message.data.path), + filePath: path.join(directoryPath, getText(message.data.path)), matches: [] }; pendingLeadingContext = []; @@ -379,8 +391,6 @@ module.exports = class RipgrepDirectorySearcher { pattern = pattern.slice(0, -1); } - pattern = pattern.startsWith('**/') ? pattern : `**/${pattern}`; - output.push(pattern); output.push(pattern.endsWith('/**') ? pattern : `${pattern}/**`); } diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index 986ec0442..abace0fcd 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -10,21 +10,25 @@ class TokenizedLine return unless properties? - {@openScopes, @text, @tags, @ruleStack, @tokenIterator, @grammar} = properties + {@openScopes, @text, @tags, @ruleStack, @tokenIterator, @grammar, tokens} = properties + @cachedTokens = tokens getTokenIterator: -> @tokenIterator.reset(this) Object.defineProperty @prototype, 'tokens', get: -> - iterator = @getTokenIterator() - tokens = [] + if @cachedTokens + @cachedTokens + else + iterator = @getTokenIterator() + tokens = [] - while iterator.next() - tokens.push(new Token({ - value: iterator.getText() - scopes: iterator.getScopes().slice() - })) + while iterator.next() + tokens.push(new Token({ + value: iterator.getText() + scopes: iterator.getScopes().slice() + })) - tokens + tokens tokenAtBufferColumn: (bufferColumn) -> @tokens[@tokenIndexAtBufferColumn(bufferColumn)] diff --git a/src/tree-sitter-grammar.js b/src/tree-sitter-grammar.js index 07be7448c..e7e5e431d 100644 --- a/src/tree-sitter-grammar.js +++ b/src/tree-sitter-grammar.js @@ -119,6 +119,25 @@ module.exports = class TreeSitterGrammar { } } } + + /* + Section - Backward compatibility shims + */ + + onDidUpdate(callback) { + // do nothing + } + + tokenizeLines(text, compatibilityMode = true) { + return text.split('\n').map(line => this.tokenizeLine(line, null, false)); + } + + tokenizeLine(line, ruleStack, firstLine) { + return { + value: line, + scopes: [this.scopeName] + }; + } }; const preprocessScopes = value => diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index 4391b02b2..6d8c93368 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -32,7 +32,7 @@ class TreeSitterLanguageMode { this.config = config; this.grammarRegistry = grammars; this.parser = new Parser(); - this.rootLanguageLayer = new LanguageLayer(this, grammar); + this.rootLanguageLayer = new LanguageLayer(this, grammar, 0); this.injectionsMarkerLayer = buffer.addMarkerLayer(); if (syncTimeoutMicros != null) { @@ -488,9 +488,45 @@ class TreeSitterLanguageMode { */ tokenizedLineForRow(row) { + const lineText = this.buffer.lineForRow(row); + const tokens = []; + + const iterator = this.buildHighlightIterator(); + let start = { row, column: 0 }; + const scopes = iterator.seek(start, row); + while (true) { + const end = iterator.getPosition(); + if (end.row > row) { + end.row = row; + end.column = lineText.length; + } + + if (end.column > start.column) { + tokens.push( + new Token({ + value: lineText.substring(start.column, end.column), + scopes: scopes.map(s => this.grammar.scopeNameForScopeId(s)) + }) + ); + } + + if (end.column < lineText.length) { + const closeScopeCount = iterator.getCloseScopeIds().length; + for (let i = 0; i < closeScopeCount; i++) { + scopes.pop(); + } + scopes.push(...iterator.getOpenScopeIds()); + start = end; + iterator.moveToSuccessor(); + } else { + break; + } + } + return new TokenizedLine({ openScopes: [], - text: this.buffer.lineForRow(row), + text: lineText, + tokens, tags: [], ruleStack: [], lineEnding: this.buffer.lineEndingForRow(row), @@ -601,13 +637,13 @@ class TreeSitterLanguageMode { } class LanguageLayer { - constructor(languageMode, grammar, contentChildTypes) { + constructor(languageMode, grammar, depth) { this.languageMode = languageMode; this.grammar = grammar; this.tree = null; this.currentParsePromise = null; this.patchSinceCurrentParseStarted = null; - this.contentChildTypes = contentChildTypes; + this.depth = depth; } buildHighlightIterator() { @@ -849,7 +885,7 @@ class LanguageLayer { marker.languageLayer = new LanguageLayer( this.languageMode, grammar, - injectionPoint.contentChildTypes + this.depth + 1 ); marker.parentLanguageLayer = this; } @@ -859,7 +895,8 @@ class LanguageLayer { new NodeRangeSet( nodeRangeSet, injectionNodes, - injectionPoint.newlinesBetween + injectionPoint.newlinesBetween, + injectionPoint.includeChildren ) ); } @@ -874,7 +911,6 @@ class LanguageLayer { } if (markersToUpdate.size > 0) { - this.lastUpdateWasAsync = true; const promises = []; for (const [marker, nodeRangeSet] of markersToUpdate) { promises.push(marker.languageLayer.update(nodeRangeSet)); @@ -911,75 +947,131 @@ class HighlightIterator { } ); - this.iterators = [ - this.languageMode.rootLanguageLayer.buildHighlightIterator() - ]; - for (const marker of injectionMarkers) { - this.iterators.push(marker.languageLayer.buildHighlightIterator()); - } - this.iterators.sort((a, b) => b.getIndex() - a.getIndex()); - const containingTags = []; const containingTagStartIndices = []; const targetIndex = this.languageMode.buffer.characterIndexForPosition( targetPosition ); - for (let i = this.iterators.length - 1; i >= 0; i--) { - this.iterators[i].seek( - targetIndex, - containingTags, - containingTagStartIndices - ); + + this.iterators = []; + const iterator = this.languageMode.rootLanguageLayer.buildHighlightIterator(); + if (iterator.seek(targetIndex, containingTags, containingTagStartIndices)) { + this.iterators.push(iterator); } - this.iterators.sort((a, b) => b.getIndex() - a.getIndex()); + + // Populate the iterators array with all of the iterators whose syntax + // trees span the given position. + for (const marker of injectionMarkers) { + const iterator = marker.languageLayer.buildHighlightIterator(); + if ( + iterator.seek(targetIndex, containingTags, containingTagStartIndices) + ) { + this.iterators.push(iterator); + } + } + + // Sort the iterators so that the last one in the array is the earliest + // in the document, and represents the current position. + this.iterators.sort((a, b) => b.compare(a)); + this.detectCoveredScope(); + return containingTags; } moveToSuccessor() { - const lastIndex = this.iterators.length - 1; - const leader = this.iterators[lastIndex]; - leader.moveToSuccessor(); - const leaderCharIndex = leader.getIndex(); - let i = lastIndex; - while (i > 0 && this.iterators[i - 1].getIndex() < leaderCharIndex) i--; - if (i < lastIndex) this.iterators.splice(i, 0, this.iterators.pop()); + // Advance the earliest layer iterator to its next scope boundary. + let leader = last(this.iterators); + + // Maintain the sorting of the iterators by their position in the document. + if (leader.moveToSuccessor()) { + const leaderIndex = this.iterators.length - 1; + let i = leaderIndex; + while (i > 0 && this.iterators[i - 1].compare(leader) < 0) i--; + if (i < leaderIndex) { + this.iterators.splice(i, 0, this.iterators.pop()); + } + } else { + // If the layer iterator was at the end of its syntax tree, then remove + // it from the array. + this.iterators.pop(); + } + + this.detectCoveredScope(); + } + + // Detect whether or not another more deeply-nested language layer has a + // scope boundary at this same position. If so, the current language layer's + // scope boundary should not be reported. + detectCoveredScope() { + const layerCount = this.iterators.length; + if (layerCount > 1) { + const first = this.iterators[layerCount - 1]; + const next = this.iterators[layerCount - 2]; + if ( + next.offset === first.offset && + next.atEnd === first.atEnd && + next.depth > first.depth + ) { + this.currentScopeIsCovered = true; + return; + } + } + this.currentScopeIsCovered = false; } getPosition() { - return last(this.iterators).getPosition(); + const iterator = last(this.iterators); + if (iterator) { + return iterator.getPosition(); + } else { + return Point.INFINITY; + } } getCloseScopeIds() { - return last(this.iterators).getCloseScopeIds(); + const iterator = last(this.iterators); + if (iterator && !this.currentScopeIsCovered) { + return iterator.getCloseScopeIds(); + } + return []; } getOpenScopeIds() { - return last(this.iterators).getOpenScopeIds(); + const iterator = last(this.iterators); + if (iterator && !this.currentScopeIsCovered) { + return iterator.getOpenScopeIds(); + } + return []; } logState() { const iterator = last(this.iterators); - if (iterator.treeCursor) { + if (iterator && iterator.treeCursor) { console.log( iterator.getPosition(), iterator.treeCursor.nodeType, + `depth=${iterator.languageLayer.depth}`, new Range( iterator.languageLayer.tree.rootNode.startPosition, iterator.languageLayer.tree.rootNode.endPosition ).toString() ); - console.log( - 'close', - iterator.closeTags.map(id => - this.languageMode.grammar.scopeNameForScopeId(id) - ) - ); - console.log( - 'open', - iterator.openTags.map(id => - this.languageMode.grammar.scopeNameForScopeId(id) - ) - ); + if (this.currentScopeIsCovered) { + console.log('covered'); + } else { + console.log( + 'close', + iterator.closeTags.map(id => + this.languageMode.grammar.scopeNameForScopeId(id) + ) + ); + console.log( + 'open', + iterator.openTags.map(id => + this.languageMode.grammar.scopeNameForScopeId(id) + ) + ); + } } } } @@ -987,11 +1079,13 @@ class HighlightIterator { class LayerHighlightIterator { constructor(languageLayer, treeCursor) { this.languageLayer = languageLayer; + this.depth = this.languageLayer.depth; // The iterator is always positioned at either the start or the end of some node // in the syntax tree. this.atEnd = false; this.treeCursor = treeCursor; + this.offset = 0; // In order to determine which selectors match its current node, the iterator maintains // a list of the current node's ancestors. Because the selectors can use the `:nth-child` @@ -1010,7 +1104,6 @@ class LayerHighlightIterator { seek(targetIndex, containingTags, containingTagStartIndices) { while (this.treeCursor.gotoParent()) {} - this.done = false; this.atEnd = true; this.closeTags.length = 0; this.openTags.length = 0; @@ -1021,8 +1114,7 @@ class LayerHighlightIterator { const containingTagEndIndices = []; if (targetIndex >= this.treeCursor.endIndex) { - this.done = true; - return; + return false; } let childIndex = -1; @@ -1055,22 +1147,24 @@ class LayerHighlightIterator { } if (this.atEnd) { - const currentIndex = this.treeCursor.endIndex; + this.offset = this.treeCursor.endIndex; for (let i = 0, { length } = containingTags; i < length; i++) { - if (containingTagEndIndices[i] === currentIndex) { + if (containingTagEndIndices[i] === this.offset) { this.closeTags.push(containingTags[i]); } } + } else { + this.offset = this.treeCursor.startIndex; } - return containingTags; + return true; } moveToSuccessor() { this.closeTags.length = 0; this.openTags.length = 0; - while (!this.done && !this.closeTags.length && !this.openTags.length) { + while (!this.closeTags.length && !this.openTags.length) { if (this.atEnd) { if (this._moveRight()) { const scopeId = this._currentScopeId(); @@ -1080,7 +1174,7 @@ class LayerHighlightIterator { } else if (this._moveUp(true)) { this.atEnd = true; } else { - this.done = true; + return false; } } else if (!this._moveDown()) { const scopeId = this._currentScopeId(); @@ -1089,26 +1183,30 @@ class LayerHighlightIterator { this._moveUp(false); } } + + if (this.atEnd) { + this.offset = this.treeCursor.endIndex; + } else { + this.offset = this.treeCursor.startIndex; + } + + return true; } getPosition() { - if (this.done) { - return Point.INFINITY; - } else if (this.atEnd) { + if (this.atEnd) { return this.treeCursor.endPosition; } else { return this.treeCursor.startPosition; } } - getIndex() { - if (this.done) { - return Infinity; - } else if (this.atEnd) { - return this.treeCursor.endIndex; - } else { - return this.treeCursor.startIndex; - } + compare(other) { + const result = this.offset - other.offset; + if (result !== 0) return result; + if (this.atEnd && !other.atEnd) return -1; + if (other.atEnd && !this.atEnd) return 1; + return this.languageLayer.depth - other.languageLayer.depth; } getCloseScopeIds() { @@ -1120,6 +1218,7 @@ class LayerHighlightIterator { } // Private methods + _moveUp(atLastChild) { let result = false; const { endIndex } = this.treeCursor; @@ -1227,10 +1326,10 @@ class NullHighlightIterator { seek() { return []; } - moveToSuccessor() {} - getIndex() { - return Infinity; + compare() { + return 1; } + moveToSuccessor() {} getPosition() { return Point.INFINITY; } @@ -1243,10 +1342,11 @@ class NullHighlightIterator { } class NodeRangeSet { - constructor(previous, nodes, newlinesBetween) { + constructor(previous, nodes, newlinesBetween, includeChildren) { this.previous = previous; this.nodes = nodes; this.newlinesBetween = newlinesBetween; + this.includeChildren = includeChildren; } getRanges(buffer) { @@ -1257,18 +1357,20 @@ class NodeRangeSet { let position = node.startPosition; let index = node.startIndex; - for (const child of node.children) { - const nextIndex = child.startIndex; - if (nextIndex > index) { - this._pushRange(buffer, previousRanges, result, { - startIndex: index, - endIndex: nextIndex, - startPosition: position, - endPosition: child.startPosition - }); + if (!this.includeChildren) { + for (const child of node.children) { + const nextIndex = child.startIndex; + if (nextIndex > index) { + this._pushRange(buffer, previousRanges, result, { + startIndex: index, + endIndex: nextIndex, + startPosition: position, + endPosition: child.startPosition + }); + } + position = child.endPosition; + index = child.endIndex; } - position = child.endPosition; - index = child.endIndex; } if (node.endIndex > index) { diff --git a/src/workspace.js b/src/workspace.js index b3c3e4b8d..16d564dda 100644 --- a/src/workspace.js +++ b/src/workspace.js @@ -76,7 +76,7 @@ const ALL_LOCATIONS = ['center', 'left', 'right', 'bottom']; // Returns a {String} containing a longer version of the title to display in // places like the window title or on tabs their short titles are ambiguous. // -// #### `onDidChangeTitle` +// #### `onDidChangeTitle(callback)` // // Called by the workspace so it can be notified when the item's title changes. // Must return a {Disposable}. @@ -256,8 +256,6 @@ module.exports = class Workspace extends Model { }; this.incoming = new Map(); - - this.subscribeToEvents(); } get paneContainer() { @@ -375,9 +373,9 @@ module.exports = class Workspace extends Model { this.consumeServices(this.packageManager); } - subscribeToEvents() { + initialize() { + this.originalFontSize = this.config.get('editor.fontSize'); this.project.onDidChangePaths(this.updateWindowTitle); - this.subscribeToFontSize(); this.subscribeToAddedItems(); this.subscribeToMovedItems(); this.subscribeToDockToggling(); @@ -1518,6 +1516,10 @@ module.exports = class Workspace extends Model { // that is already open in a text editor view. You could signal this by calling // {Workspace::open} on the URI `quux-preview://foo/bar/baz.quux`. Then your opener // can check the protocol for quux-preview and only handle those URIs that match. + // + // To defer your package's activation until a specific URL is opened, add a + // `workspaceOpeners` field to your `package.json` containing an array of URL + // strings. addOpener(opener) { this.openers.push(opener); return new Disposable(() => { @@ -1749,14 +1751,6 @@ module.exports = class Workspace extends Model { } } - subscribeToFontSize() { - return this.config.onDidChange('editor.fontSize', () => { - if (this.originalFontSize == null) { - this.originalFontSize = this.config.get('editor.fontSize'); - } - }); - } - // Removes the item's uri from the list of potential items to reopen. itemOpened(item) { let uri;